1# Copyright (C) 2018 The Android Open Source Project 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14 15.class public LMain2; 16.super Ljava/lang/Object; 17.source "Main2.java" 18 19 20# direct methods 21.method constructor <init>()V 22 .registers 1 23 24 .prologue 25 .line 17 26 invoke-direct {p0}, Ljava/lang/Object;-><init>()V 27 28 return-void 29.end method 30 31# Elementary test negating a boolean. Verifies that blocks are merged and 32# empty branches removed. 33 34## CHECK-START: boolean Main2.BooleanNot(boolean) select_generator (before) 35## CHECK-DAG: <<Param:z\d+>> ParameterValue 36## CHECK-DAG: <<Const0:i\d+>> IntConstant 0 37## CHECK-DAG: <<Const1:i\d+>> IntConstant 1 38## CHECK-DAG: If [<<Param>>] 39## CHECK-DAG: <<Phi:i\d+>> Phi [<<Const1>>,<<Const0>>] 40## CHECK-DAG: Return [<<Phi>>] 41 42## CHECK-START: boolean Main2.BooleanNot(boolean) select_generator (before) 43## CHECK: Goto 44## CHECK: Goto 45## CHECK: Goto 46## CHECK-NOT: Goto 47 48## CHECK-START: boolean Main2.BooleanNot(boolean) select_generator (after) 49## CHECK-DAG: <<Param:z\d+>> ParameterValue 50## CHECK-DAG: <<Const0:i\d+>> IntConstant 0 51## CHECK-DAG: <<Const1:i\d+>> IntConstant 1 52## CHECK-DAG: <<NotParam:i\d+>> Select [<<Const1>>,<<Const0>>,<<Param>>] 53## CHECK-DAG: Return [<<NotParam>>] 54 55## CHECK-START: boolean Main2.BooleanNot(boolean) select_generator (after) 56## CHECK-NOT: If 57## CHECK-NOT: Phi 58 59## CHECK-START: boolean Main2.BooleanNot(boolean) select_generator (after) 60## CHECK: Goto 61## CHECK-NOT: Goto 62 63# The original java source of this method: 64# 65# return !x; 66# 67.method public static BooleanNot(Z)Z 68 .registers 2 69 .param p0, "x" # Z 70 71 .prologue 72 .line 70 73 if-nez p0, :cond_4 74 75 const/4 v0, 0x1 76 77 :goto_3 78 return v0 79 80 :cond_4 81 const/4 v0, 0x0 82 83 goto :goto_3 84.end method 85 86# Program which further uses negated conditions. 87# Note that Phis are discovered retrospectively. 88 89## CHECK-START: boolean Main2.ValuesOrdered(int, int, int) select_generator (before) 90## CHECK-DAG: <<ParamX:i\d+>> ParameterValue 91## CHECK-DAG: <<ParamY:i\d+>> ParameterValue 92## CHECK-DAG: <<ParamZ:i\d+>> ParameterValue 93## CHECK-DAG: <<Const0:i\d+>> IntConstant 0 94## CHECK-DAG: <<Const1:i\d+>> IntConstant 1 95## CHECK-DAG: <<CondXY:z\d+>> GreaterThan [<<ParamX>>,<<ParamY>>] 96## CHECK-DAG: If [<<CondXY>>] 97## CHECK-DAG: <<CondYZ:z\d+>> GreaterThan [<<ParamY>>,<<ParamZ>>] 98## CHECK-DAG: If [<<CondYZ>>] 99## CHECK-DAG: <<CondXYZ:z\d+>> NotEqual [<<PhiXY:i\d+>>,<<PhiYZ:i\d+>>] 100## CHECK-DAG: If [<<CondXYZ>>] 101## CHECK-DAG: Return [<<PhiXYZ:i\d+>>] 102## CHECK-DAG: <<PhiXY>> Phi [<<Const1>>,<<Const0>>] 103## CHECK-DAG: <<PhiYZ>> Phi [<<Const1>>,<<Const0>>] 104## CHECK-DAG: <<PhiXYZ>> Phi [<<Const1>>,<<Const0>>] 105 106## CHECK-START: boolean Main2.ValuesOrdered(int, int, int) select_generator (after) 107## CHECK-DAG: <<ParamX:i\d+>> ParameterValue 108## CHECK-DAG: <<ParamY:i\d+>> ParameterValue 109## CHECK-DAG: <<ParamZ:i\d+>> ParameterValue 110## CHECK-DAG: <<Const0:i\d+>> IntConstant 0 111## CHECK-DAG: <<Const1:i\d+>> IntConstant 1 112## CHECK-DAG: <<CmpXY:z\d+>> GreaterThan [<<ParamX>>,<<ParamY>>] 113## CHECK-DAG: <<SelXY:i\d+>> Select [<<Const1>>,<<Const0>>,<<CmpXY>>] 114## CHECK-DAG: <<CmpYZ:z\d+>> GreaterThan [<<ParamY>>,<<ParamZ>>] 115## CHECK-DAG: <<SelYZ:i\d+>> Select [<<Const1>>,<<Const0>>,<<CmpYZ>>] 116## CHECK-DAG: <<CmpXYZ:z\d+>> NotEqual [<<SelXY>>,<<SelYZ>>] 117## CHECK-DAG: <<SelXYZ:i\d+>> Select [<<Const1>>,<<Const0>>,<<CmpXYZ>>] 118## CHECK-DAG: Return [<<SelXYZ>>] 119 120# The original java source of this method: 121# 122# return (x <= y) == (y <= z); 123# 124.method public static ValuesOrdered(III)Z 125 .registers 7 126 .param p0, "x" # I 127 .param p1, "y" # I 128 .param p2, "z" # I 129 130 .prologue 131 const/4 v0, 0x1 132 133 const/4 v1, 0x0 134 135 .line 166 136 if-gt p0, p1, :cond_b 137 138 move v3, v0 139 140 :goto_5 141 if-gt p1, p2, :cond_d 142 143 move v2, v0 144 145 :goto_8 146 if-ne v3, v2, :cond_f 147 148 :goto_a 149 return v0 150 151 :cond_b 152 move v3, v1 153 154 goto :goto_5 155 156 :cond_d 157 move v2, v1 158 159 goto :goto_8 160 161 :cond_f 162 move v0, v1 163 164 goto :goto_a 165.end method 166 167## CHECK-START: int Main2.NegatedCondition(boolean) select_generator (before) 168## CHECK-DAG: <<Param:z\d+>> ParameterValue 169## CHECK-DAG: <<Const42:i\d+>> IntConstant 42 170## CHECK-DAG: <<Const43:i\d+>> IntConstant 43 171## CHECK-DAG: If [<<Param>>] 172## CHECK-DAG: <<Phi:i\d+>> Phi [<<Const42>>,<<Const43>>] 173## CHECK-DAG: Return [<<Phi>>] 174 175## CHECK-START: int Main2.NegatedCondition(boolean) select_generator (after) 176## CHECK-DAG: <<Param:z\d+>> ParameterValue 177## CHECK-DAG: <<Const42:i\d+>> IntConstant 42 178## CHECK-DAG: <<Const43:i\d+>> IntConstant 43 179## CHECK-DAG: <<Select:i\d+>> Select [<<Const43>>,<<Const42>>,<<Param>>] 180## CHECK-DAG: Return [<<Select>>] 181 182## CHECK-START: int Main2.NegatedCondition(boolean) select_generator (after) 183## CHECK-NOT: BooleanNot 184 185# The original java source of this method: 186# 187# if (x != false) { 188# return 42; 189# } else { 190# return 43; 191# } 192# 193.method public static NegatedCondition(Z)I 194 .registers 2 195 .param p0, "x" # Z 196 197 .prologue 198 .line 188 199 if-eqz p0, :cond_5 200 201 .line 189 202 const/16 v0, 0x2a 203 204 .line 191 205 :goto_4 206 return v0 207 208 :cond_5 209 const/16 v0, 0x2b 210 211 goto :goto_4 212.end method 213 214# This test currently checks that we don't perform select generation due to 215# having multiple phis. 216 217## CHECK-START: int Main2.MultiplePhis() select_generator (before) 218## CHECK-DAG: <<Const0:i\d+>> IntConstant 0 219## CHECK-DAG: <<Const1:i\d+>> IntConstant 1 220## CHECK-DAG: <<Const13:i\d+>> IntConstant 13 221## CHECK-DAG: <<Const42:i\d+>> IntConstant 42 222## CHECK-DAG: <<PhiX:i\d+>> Phi [<<Const0>>,<<Const13>>,<<Const42>>] 223## CHECK-DAG: <<PhiY:i\d+>> Phi [<<Const1>>,<<Add:i\d+>>,<<Add>>] 224## CHECK-DAG: <<Add>> Add [<<PhiY>>,<<Const1>>] 225## CHECK-DAG: <<Cond:z\d+>> LessThanOrEqual [<<Add>>,<<Const1>>] 226## CHECK-DAG: If [<<Cond>>] 227## CHECK-DAG: Return [<<PhiX>>] 228 229## CHECK-START: int Main2.MultiplePhis() select_generator (after) 230## CHECK-DAG: <<Const0:i\d+>> IntConstant 0 231## CHECK-DAG: <<Const1:i\d+>> IntConstant 1 232## CHECK-DAG: <<Const13:i\d+>> IntConstant 13 233## CHECK-DAG: <<Const42:i\d+>> IntConstant 42 234## CHECK-DAG: <<PhiX:i\d+>> Phi [<<Const0>>,<<Const13>>,<<Const42>>] 235## CHECK-DAG: <<PhiY:i\d+>> Phi [<<Const1>>,<<Add:i\d+>>,<<Add>>] 236## CHECK-DAG: <<Add>> Add [<<PhiY>>,<<Const1>>] 237## CHECK-DAG: <<Cond:z\d+>> LessThanOrEqual [<<Add>>,<<Const1>>] 238## CHECK-DAG: If [<<Cond>>] 239## CHECK-DAG: Return [<<PhiX>>] 240 241# The original java source of this method: 242# 243# int x = 0; 244# int y = 1; 245# while (y++ < 10) { 246# if (y > 1) { 247# x = 13; 248# } else { 249# x = 42; 250# } 251# } 252# return x; 253# 254.method public static MultiplePhis()I 255 .registers 4 256 257 .prologue 258 .line 290 259 const/4 v0, 0x0 260 261 .line 291 262 .local v0, "x":I 263 const/4 v1, 0x1 264 265 .local v1, "y":I 266 move v2, v1 267 268 .line 292 269 .end local v1 # "y":I 270 .local v2, "y":I 271 :goto_3 272 add-int/lit8 v1, v2, 0x1 273 274 .end local v2 # "y":I 275 .restart local v1 # "y":I 276 const/16 v3, 0xa 277 278 if-ge v2, v3, :cond_14 279 280 .line 293 281 const/4 v3, 0x1 282 283 if-le v1, v3, :cond_10 284 285 .line 294 286 const/16 v0, 0xd 287 288 move v2, v1 289 290 .end local v1 # "y":I 291 .restart local v2 # "y":I 292 goto :goto_3 293 294 .line 296 295 .end local v2 # "y":I 296 .restart local v1 # "y":I 297 :cond_10 298 const/16 v0, 0x2a 299 300 move v2, v1 301 302 .end local v1 # "y":I 303 .restart local v2 # "y":I 304 goto :goto_3 305 306 .line 299 307 .end local v2 # "y":I 308 .restart local v1 # "y":I 309 :cond_14 310 return v0 311.end method 312