# 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 LSmaliTests2; .super Ljava/lang/Object; ## CHECK-START: int SmaliTests2.$noinline$XorAllOnes(int) instruction_simplifier (before) ## CHECK-DAG: <<Arg:i\d+>> ParameterValue ## CHECK-DAG: <<ConstF:i\d+>> IntConstant -1 ## CHECK-DAG: <<Xor:i\d+>> Xor [<<Arg>>,<<ConstF>>] ## CHECK-DAG: Return [<<Xor>>] ## CHECK-START: int SmaliTests2.$noinline$XorAllOnes(int) instruction_simplifier (after) ## CHECK-DAG: <<Arg:i\d+>> ParameterValue ## CHECK-DAG: <<Not:i\d+>> Not [<<Arg>>] ## CHECK-DAG: Return [<<Not>>] ## CHECK-START: int SmaliTests2.$noinline$XorAllOnes(int) instruction_simplifier (after) ## CHECK-NOT: Xor # Original java source: # # return arg ^ -1; # .method public static $noinline$XorAllOnes(I)I .registers 2 .param p0, "arg" # I .prologue .line 658 xor-int/lit8 v0, p0, -0x1 return v0 .end method # Test simplification of the `~~var` pattern. # The transformation tested is implemented in `InstructionSimplifierVisitor::VisitNot`. ## CHECK-START: long SmaliTests2.$noinline$NotNot1(long) instruction_simplifier (before) ## CHECK-DAG: <<Arg:j\d+>> ParameterValue ## CHECK-DAG: <<ConstNeg1:j\d+>> LongConstant -1 ## CHECK-DAG: <<Not1:j\d+>> Xor [<<Arg>>,<<ConstNeg1>>] ## CHECK-DAG: <<Not2:j\d+>> Xor [<<Not1>>,<<ConstNeg1>>] ## CHECK-DAG: Return [<<Not2>>] ## CHECK-START: long SmaliTests2.$noinline$NotNot1(long) instruction_simplifier (after) ## CHECK-DAG: <<Arg:j\d+>> ParameterValue ## CHECK-DAG: Return [<<Arg>>] ## CHECK-START: long SmaliTests2.$noinline$NotNot1(long) instruction_simplifier (after) ## CHECK-NOT: Xor # Original java source: # # return ~~arg; .method public static $noinline$NotNot1(J)J .registers 6 .param p0, "arg" # J .prologue const-wide/16 v2, -0x1 .line 1001 xor-long v0, p0, v2 xor-long/2addr v0, v2 return-wide v0 .end method ## CHECK-START: int SmaliTests2.$noinline$NotNot2(int) instruction_simplifier (before) ## CHECK-DAG: <<Arg:i\d+>> ParameterValue ## CHECK-DAG: <<ConstNeg1:i\d+>> IntConstant -1 ## CHECK-DAG: <<Not1:i\d+>> Xor [<<Arg>>,<<ConstNeg1>>] ## CHECK-DAG: <<Not2:i\d+>> Xor [<<Not1>>,<<ConstNeg1>>] ## CHECK-DAG: <<Add:i\d+>> Add [<<Not2>>,<<Not1>>] ## CHECK-DAG: Return [<<Add>>] ## CHECK-START: int SmaliTests2.$noinline$NotNot2(int) instruction_simplifier (after) ## CHECK-DAG: <<Arg:i\d+>> ParameterValue ## CHECK-DAG: <<Not:i\d+>> Not [<<Arg>>] ## CHECK-DAG: <<Add:i\d+>> Add [<<Arg>>,<<Not>>] ## CHECK-DAG: Return [<<Add>>] ## CHECK-START: int SmaliTests2.$noinline$NotNot2(int) instruction_simplifier (after) ## CHECK: Not ## CHECK-NOT: Not ## CHECK-START: int SmaliTests2.$noinline$NotNot2(int) instruction_simplifier (after) ## CHECK-NOT: Xor # Original java source: # # int temp = ~arg; # return temp + ~temp; # .method public static $noinline$NotNot2(I)I .registers 3 .param p0, "arg" # I .prologue .line 1026 xor-int/lit8 v0, p0, -0x1 .line 1027 .local v0, "temp":I xor-int/lit8 v1, v0, -0x1 add-int/2addr v1, v0 return v1 .end method # Original java source: # # return !arg; # .method public static NegateValue(Z)Z .registers 2 .param p0, "arg" # Z .prologue .line 1216 if-nez p0, :cond_4 const/4 v0, 0x1 :goto_3 return v0 :cond_4 const/4 v0, 0x0 goto :goto_3 .end method # Test simplification of double Boolean negation. Note that sometimes # both negations can be removed but we only expect the simplifier to # remove the second. ## CHECK-START: boolean SmaliTests2.$noinline$NotNotBool(boolean) instruction_simplifier (before) ## CHECK-DAG: <<Arg:z\d+>> ParameterValue ## CHECK-DAG: <<Const1:i\d+>> IntConstant 0 ## CHECK-DAG: <<Result:z\d+>> InvokeStaticOrDirect method_name:SmaliTests2.NegateValue ## CHECK-DAG: <<NotResult:z\d+>> NotEqual [<<Result>>,<<Const1>>] ## CHECK-DAG: If [<<NotResult>>] ## CHECK-START: boolean SmaliTests2.$noinline$NotNotBool(boolean) instruction_simplifier (after) ## CHECK-NOT: NotEqual ## CHECK-START: boolean SmaliTests2.$noinline$NotNotBool(boolean) instruction_simplifier (after) ## CHECK-DAG: <<Arg:z\d+>> ParameterValue ## CHECK-DAG: <<Result:z\d+>> InvokeStaticOrDirect method_name:SmaliTests2.NegateValue ## CHECK-DAG: <<Const0:i\d+>> IntConstant 0 ## CHECK-DAG: <<Const1:i\d+>> IntConstant 1 ## CHECK-DAG: <<Phi:i\d+>> Phi [<<Const1>>,<<Const0>>] ## CHECK-DAG: Return [<<Phi>>] ## CHECK-START: boolean SmaliTests2.$noinline$NotNotBool(boolean) instruction_simplifier$after_inlining (before) ## CHECK-DAG: <<Arg:z\d+>> ParameterValue ## CHECK-DAG: <<Const0:i\d+>> IntConstant 0 ## CHECK-DAG: <<Const1:i\d+>> IntConstant 1 ## CHECK-DAG: If [<<Arg>>] ## CHECK-DAG: <<Phi:i\d+>> Phi [<<Const1>>,<<Const0>>] ## CHECK-DAG: Return [<<Phi>>] ## CHECK-START: boolean SmaliTests2.$noinline$NotNotBool(boolean) instruction_simplifier$after_gvn (after) ## CHECK-DAG: <<Arg:z\d+>> ParameterValue ## CHECK-DAG: Return [<<Arg>>] # Original java source: # # return !(NegateValue(arg)); # .method public static $noinline$NotNotBool(Z)Z .registers 2 .param p0, "arg" # Z .prologue .line 1220 invoke-static {p0}, LSmaliTests2;->NegateValue(Z)Z move-result v0 if-nez v0, :cond_8 const/4 v0, 0x1 :goto_7 return v0 :cond_8 const/4 v0, 0x0 goto :goto_7 .end method ## CHECK-START: int SmaliTests2.$noinline$bug68142795Short(short) instruction_simplifier (before) ## CHECK-DAG: <<Arg:s\d+>> ParameterValue ## CHECK-DAG: <<Const:i\d+>> IntConstant 65535 ## CHECK-DAG: <<And1:i\d+>> And [<<Arg>>,<<Const>>] ## CHECK-DAG: <<And2:i\d+>> And [<<And1>>,<<Const>>] ## CHECK-DAG: <<Conv:s\d+>> TypeConversion [<<And2>>] ## CHECK-DAG: Return [<<Conv>>] ## CHECK-START: int SmaliTests2.$noinline$bug68142795Short(short) instruction_simplifier (after) ## CHECK-DAG: <<Arg:s\d+>> ParameterValue ## CHECK-DAG: Return [<<Arg>>] # Original java source # # return (short)(0xffff & (s & 0xffff)); # .method public static $noinline$bug68142795Short(S)I .registers 3 .param p0, "s" # S .prologue const v1, 0xffff .line 2562 and-int v0, p0, v1 and-int/2addr v0, v1 int-to-short v0, v0 return v0 .end method # Original java source # # return 255; # .method private static $inline$get255()I .registers 1 .prologue .line 2849 const/16 v0, 0xff return v0 .end method ## CHECK-START: int SmaliTests2.$noinline$bug68142795Boolean(boolean) instruction_simplifier$after_inlining (before) ## CHECK-DAG: <<Arg:z\d+>> ParameterValue ## CHECK-DAG: <<Const0:i\d+>> IntConstant 0 ## CHECK-DAG: <<Const1:i\d+>> IntConstant 1 ## CHECK-DAG: <<Const255:i\d+>> IntConstant 255 ## CHECK-DAG: If [<<Arg>>] ## CHECK-DAG: <<Phi:i\d+>> Phi [<<Const1>>,<<Const0>>] ## CHECK-DAG: <<And:i\d+>> And [<<Const255>>,<<Phi>>] ## CHECK-DAG: <<Conv:b\d+>> TypeConversion [<<And>>] ## CHECK-DAG: Return [<<Conv>>] ## CHECK-START: int SmaliTests2.$noinline$bug68142795Boolean(boolean) instruction_simplifier$after_gvn (after) ## CHECK-DAG: <<Arg:z\d+>> ParameterValue ## CHECK-DAG: Return [<<Arg>>] # Original java source # # int v = b ? 1 : 0; // Should be simplified to "b" after inlining. # return (byte)($inline$get255() & v); # .method public static $noinline$bug68142795Boolean(Z)I .registers 3 .param p0, "b" # Z .prologue .line 2580 if-eqz p0, :cond_a const/4 v0, 0x1 .line 2581 .local v0, "v":I :goto_3 invoke-static {}, LSmaliTests2;->$inline$get255()I move-result v1 and-int/2addr v1, v0 int-to-byte v1, v1 return v1 .line 2580 .end local v0 # "v":I :cond_a const/4 v0, 0x0 goto :goto_3 .end method