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## CHECK-START: int Main2.MultiplePhis() select_generator (before) 215## CHECK-DAG: <<Const0:i\d+>> IntConstant 0 216## CHECK-DAG: <<Const1:i\d+>> IntConstant 1 217## CHECK-DAG: <<Const13:i\d+>> IntConstant 13 218## CHECK-DAG: <<Const42:i\d+>> IntConstant 42 219## CHECK-DAG: <<PhiX:i\d+>> Phi [<<Const0>>,<<Const13>>,<<Const42>>] 220## CHECK-DAG: <<PhiY:i\d+>> Phi [<<Const1>>,<<Add:i\d+>>,<<Add>>] 221## CHECK-DAG: <<Add>> Add [<<PhiY>>,<<Const1>>] 222## CHECK-DAG: <<Cond:z\d+>> LessThanOrEqual [<<Add>>,<<Const1>>] 223## CHECK-DAG: If [<<Cond>>] 224## CHECK-DAG: Return [<<PhiX>>] 225 226## CHECK-START: int Main2.MultiplePhis() select_generator (after) 227## CHECK-DAG: <<Const0:i\d+>> IntConstant 0 228## CHECK-DAG: <<Const1:i\d+>> IntConstant 1 229## CHECK-DAG: <<Const13:i\d+>> IntConstant 13 230## CHECK-DAG: <<Const42:i\d+>> IntConstant 42 231## CHECK-DAG: <<PhiX:i\d+>> Phi [<<Const0>>,<<Select:i\d+>>] 232## CHECK-DAG: <<PhiY:i\d+>> Phi [<<Const1>>,<<Add:i\d+>>] 233## CHECK-DAG: <<Add>> Add [<<PhiY>>,<<Const1>>] 234## CHECK-DAG: <<Cond:z\d+>> LessThanOrEqual [<<Add>>,<<Const1>>] 235## CHECK-DAG: <<Select>> Select [<<Const13>>,<<Const42>>,<<Cond>>] 236## CHECK-DAG: Return [<<PhiX>>] 237 238# The original java source of this method: 239# 240# int x = 0; 241# int y = 1; 242# while (y++ < 10) { 243# if (y > 1) { 244# x = 13; 245# } else { 246# x = 42; 247# } 248# } 249# return x; 250# 251.method public static MultiplePhis()I 252 .registers 4 253 254 .prologue 255 .line 290 256 const/4 v0, 0x0 257 258 .line 291 259 .local v0, "x":I 260 const/4 v1, 0x1 261 262 .local v1, "y":I 263 move v2, v1 264 265 .line 292 266 .end local v1 # "y":I 267 .local v2, "y":I 268 :goto_3 269 add-int/lit8 v1, v2, 0x1 270 271 .end local v2 # "y":I 272 .restart local v1 # "y":I 273 const/16 v3, 0xa 274 275 if-ge v2, v3, :cond_14 276 277 .line 293 278 const/4 v3, 0x1 279 280 if-le v1, v3, :cond_10 281 282 .line 294 283 const/16 v0, 0xd 284 285 move v2, v1 286 287 .end local v1 # "y":I 288 .restart local v2 # "y":I 289 goto :goto_3 290 291 .line 296 292 .end local v2 # "y":I 293 .restart local v1 # "y":I 294 :cond_10 295 const/16 v0, 0x2a 296 297 move v2, v1 298 299 .end local v1 # "y":I 300 .restart local v2 # "y":I 301 goto :goto_3 302 303 .line 299 304 .end local v2 # "y":I 305 .restart local v1 # "y":I 306 :cond_14 307 return v0 308.end method 309