blob: e8ebb2380c707b782088a5c9a32ae409f5980115 [file] [log] [blame]
# Copyright (C) 2018 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
.class public LMain2;
.super Ljava/lang/Object;
.source "Main2.java"
# direct methods
.method constructor <init>()V
.registers 1
.prologue
.line 17
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
# Elementary test negating a boolean. Verifies that blocks are merged and
# empty branches removed.
## CHECK-START: boolean Main2.BooleanNot(boolean) select_generator (before)
## CHECK-DAG: <<Param:z\d+>> ParameterValue
## CHECK-DAG: <<Const0:i\d+>> IntConstant 0
## CHECK-DAG: <<Const1:i\d+>> IntConstant 1
## CHECK-DAG: If [<<Param>>]
## CHECK-DAG: <<Phi:i\d+>> Phi [<<Const1>>,<<Const0>>]
## CHECK-DAG: Return [<<Phi>>]
## CHECK-START: boolean Main2.BooleanNot(boolean) select_generator (before)
## CHECK: Goto
## CHECK: Goto
## CHECK: Goto
## CHECK-NOT: Goto
## CHECK-START: boolean Main2.BooleanNot(boolean) select_generator (after)
## CHECK-DAG: <<Param:z\d+>> ParameterValue
## CHECK-DAG: <<Const0:i\d+>> IntConstant 0
## CHECK-DAG: <<Const1:i\d+>> IntConstant 1
## CHECK-DAG: <<NotParam:i\d+>> Select [<<Const1>>,<<Const0>>,<<Param>>]
## CHECK-DAG: Return [<<NotParam>>]
## CHECK-START: boolean Main2.BooleanNot(boolean) select_generator (after)
## CHECK-NOT: If
## CHECK-NOT: Phi
## CHECK-START: boolean Main2.BooleanNot(boolean) select_generator (after)
## CHECK: Goto
## CHECK-NOT: Goto
# The original java source of this method:
#
# return !x;
#
.method public static BooleanNot(Z)Z
.registers 2
.param p0, "x" # Z
.prologue
.line 70
if-nez p0, :cond_4
const/4 v0, 0x1
:goto_3
return v0
:cond_4
const/4 v0, 0x0
goto :goto_3
.end method
# Program which further uses negated conditions.
# Note that Phis are discovered retrospectively.
## CHECK-START: boolean Main2.ValuesOrdered(int, int, int) select_generator (before)
## CHECK-DAG: <<ParamX:i\d+>> ParameterValue
## CHECK-DAG: <<ParamY:i\d+>> ParameterValue
## CHECK-DAG: <<ParamZ:i\d+>> ParameterValue
## CHECK-DAG: <<Const0:i\d+>> IntConstant 0
## CHECK-DAG: <<Const1:i\d+>> IntConstant 1
## CHECK-DAG: <<CondXY:z\d+>> GreaterThan [<<ParamX>>,<<ParamY>>]
## CHECK-DAG: If [<<CondXY>>]
## CHECK-DAG: <<CondYZ:z\d+>> GreaterThan [<<ParamY>>,<<ParamZ>>]
## CHECK-DAG: If [<<CondYZ>>]
## CHECK-DAG: <<CondXYZ:z\d+>> NotEqual [<<PhiXY:i\d+>>,<<PhiYZ:i\d+>>]
## CHECK-DAG: If [<<CondXYZ>>]
## CHECK-DAG: Return [<<PhiXYZ:i\d+>>]
## CHECK-DAG: <<PhiXY>> Phi [<<Const1>>,<<Const0>>]
## CHECK-DAG: <<PhiYZ>> Phi [<<Const1>>,<<Const0>>]
## CHECK-DAG: <<PhiXYZ>> Phi [<<Const1>>,<<Const0>>]
## CHECK-START: boolean Main2.ValuesOrdered(int, int, int) select_generator (after)
## CHECK-DAG: <<ParamX:i\d+>> ParameterValue
## CHECK-DAG: <<ParamY:i\d+>> ParameterValue
## CHECK-DAG: <<ParamZ:i\d+>> ParameterValue
## CHECK-DAG: <<Const0:i\d+>> IntConstant 0
## CHECK-DAG: <<Const1:i\d+>> IntConstant 1
## CHECK-DAG: <<CmpXY:z\d+>> GreaterThan [<<ParamX>>,<<ParamY>>]
## CHECK-DAG: <<SelXY:i\d+>> Select [<<Const1>>,<<Const0>>,<<CmpXY>>]
## CHECK-DAG: <<CmpYZ:z\d+>> GreaterThan [<<ParamY>>,<<ParamZ>>]
## CHECK-DAG: <<SelYZ:i\d+>> Select [<<Const1>>,<<Const0>>,<<CmpYZ>>]
## CHECK-DAG: <<CmpXYZ:z\d+>> NotEqual [<<SelXY>>,<<SelYZ>>]
## CHECK-DAG: <<SelXYZ:i\d+>> Select [<<Const1>>,<<Const0>>,<<CmpXYZ>>]
## CHECK-DAG: Return [<<SelXYZ>>]
# The original java source of this method:
#
# return (x <= y) == (y <= z);
#
.method public static ValuesOrdered(III)Z
.registers 7
.param p0, "x" # I
.param p1, "y" # I
.param p2, "z" # I
.prologue
const/4 v0, 0x1
const/4 v1, 0x0
.line 166
if-gt p0, p1, :cond_b
move v3, v0
:goto_5
if-gt p1, p2, :cond_d
move v2, v0
:goto_8
if-ne v3, v2, :cond_f
:goto_a
return v0
:cond_b
move v3, v1
goto :goto_5
:cond_d
move v2, v1
goto :goto_8
:cond_f
move v0, v1
goto :goto_a
.end method
## CHECK-START: int Main2.NegatedCondition(boolean) select_generator (before)
## CHECK-DAG: <<Param:z\d+>> ParameterValue
## CHECK-DAG: <<Const42:i\d+>> IntConstant 42
## CHECK-DAG: <<Const43:i\d+>> IntConstant 43
## CHECK-DAG: If [<<Param>>]
## CHECK-DAG: <<Phi:i\d+>> Phi [<<Const42>>,<<Const43>>]
## CHECK-DAG: Return [<<Phi>>]
## CHECK-START: int Main2.NegatedCondition(boolean) select_generator (after)
## CHECK-DAG: <<Param:z\d+>> ParameterValue
## CHECK-DAG: <<Const42:i\d+>> IntConstant 42
## CHECK-DAG: <<Const43:i\d+>> IntConstant 43
## CHECK-DAG: <<Select:i\d+>> Select [<<Const43>>,<<Const42>>,<<Param>>]
## CHECK-DAG: Return [<<Select>>]
## CHECK-START: int Main2.NegatedCondition(boolean) select_generator (after)
## CHECK-NOT: BooleanNot
# The original java source of this method:
#
# if (x != false) {
# return 42;
# } else {
# return 43;
# }
#
.method public static NegatedCondition(Z)I
.registers 2
.param p0, "x" # Z
.prologue
.line 188
if-eqz p0, :cond_5
.line 189
const/16 v0, 0x2a
.line 191
:goto_4
return v0
:cond_5
const/16 v0, 0x2b
goto :goto_4
.end method
# This test currently checks that we don't perform select generation due to
# having multiple phis.
## CHECK-START: int Main2.MultiplePhis() select_generator (before)
## CHECK-DAG: <<Const0:i\d+>> IntConstant 0
## CHECK-DAG: <<Const1:i\d+>> IntConstant 1
## CHECK-DAG: <<Const13:i\d+>> IntConstant 13
## CHECK-DAG: <<Const42:i\d+>> IntConstant 42
## CHECK-DAG: <<PhiX:i\d+>> Phi [<<Const0>>,<<Const13>>,<<Const42>>]
## CHECK-DAG: <<PhiY:i\d+>> Phi [<<Const1>>,<<Add:i\d+>>,<<Add>>]
## CHECK-DAG: <<Add>> Add [<<PhiY>>,<<Const1>>]
## CHECK-DAG: <<Cond:z\d+>> LessThanOrEqual [<<Add>>,<<Const1>>]
## CHECK-DAG: If [<<Cond>>]
## CHECK-DAG: Return [<<PhiX>>]
## CHECK-START: int Main2.MultiplePhis() select_generator (after)
## CHECK-DAG: <<Const0:i\d+>> IntConstant 0
## CHECK-DAG: <<Const1:i\d+>> IntConstant 1
## CHECK-DAG: <<Const13:i\d+>> IntConstant 13
## CHECK-DAG: <<Const42:i\d+>> IntConstant 42
## CHECK-DAG: <<PhiX:i\d+>> Phi [<<Const0>>,<<Const13>>,<<Const42>>]
## CHECK-DAG: <<PhiY:i\d+>> Phi [<<Const1>>,<<Add:i\d+>>,<<Add>>]
## CHECK-DAG: <<Add>> Add [<<PhiY>>,<<Const1>>]
## CHECK-DAG: <<Cond:z\d+>> LessThanOrEqual [<<Add>>,<<Const1>>]
## CHECK-DAG: If [<<Cond>>]
## CHECK-DAG: Return [<<PhiX>>]
# The original java source of this method:
#
# int x = 0;
# int y = 1;
# while (y++ < 10) {
# if (y > 1) {
# x = 13;
# } else {
# x = 42;
# }
# }
# return x;
#
.method public static MultiplePhis()I
.registers 4
.prologue
.line 290
const/4 v0, 0x0
.line 291
.local v0, "x":I
const/4 v1, 0x1
.local v1, "y":I
move v2, v1
.line 292
.end local v1 # "y":I
.local v2, "y":I
:goto_3
add-int/lit8 v1, v2, 0x1
.end local v2 # "y":I
.restart local v1 # "y":I
const/16 v3, 0xa
if-ge v2, v3, :cond_14
.line 293
const/4 v3, 0x1
if-le v1, v3, :cond_10
.line 294
const/16 v0, 0xd
move v2, v1
.end local v1 # "y":I
.restart local v2 # "y":I
goto :goto_3
.line 296
.end local v2 # "y":I
.restart local v1 # "y":I
:cond_10
const/16 v0, 0x2a
move v2, v1
.end local v1 # "y":I
.restart local v2 # "y":I
goto :goto_3
.line 299
.end local v2 # "y":I
.restart local v1 # "y":I
:cond_14
return v0
.end method