306 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Smali
		
	
	
	
			
		
		
	
	
			306 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Smali
		
	
	
	
| # 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
 |