233 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Smali
		
	
	
	
			
		
		
	
	
			233 lines
		
	
	
		
			12 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 LPeelUnroll;
 | |
| 
 | |
| .super Ljava/lang/Object;
 | |
| 
 | |
| ## CHECK-START: void PeelUnroll.unrollingWhile(int[]) loop_optimization (before)
 | |
| ## CHECK-DAG: <<Array:l\d+>>    ParameterValue                            loop:none
 | |
| ## CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
 | |
| ## CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
 | |
| ## CHECK-DAG: <<Const2:i\d+>>   IntConstant 2                             loop:none
 | |
| ## CHECK-DAG: <<Const128:i\d+>> IntConstant 128                           loop:none
 | |
| ## CHECK-DAG: <<Limit:i\d+>>    IntConstant 4094                          loop:none
 | |
| ## CHECK-DAG: <<PhiI:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
 | |
| ## CHECK-DAG: <<PhiS:i\d+>>     Phi [<<Const128>>,{{i\d+}}]               loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<AddI:i\d+>>     Add [<<PhiI>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<Check:z\d+>>    GreaterThanOrEqual [<<PhiI>>,<<Limit>>]   loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<If:v\d+>>       If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<Rem:i\d+>>      Rem [<<AddI>>,<<Const2>>]                 loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<NE:z\d+>>       NotEqual [<<Rem>>,<<Const0>>]             loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG:                   If [<<NE>>]                               loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<AddS:i\d+>>     Add [<<PhiS>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG:                   ArraySet                                  loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG:                   Phi [<<PhiS>>,<<AddS>>]                   loop:<<Loop>>      outer_loop:none
 | |
| 
 | |
| ## CHECK-NOT:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-NOT:                   ArraySet                                  loop:<<Loop>>      outer_loop:none
 | |
| 
 | |
| ## CHECK-START: void PeelUnroll.unrollingWhile(int[]) loop_optimization (after)
 | |
| ## CHECK-DAG: <<Array:l\d+>>    ParameterValue                            loop:none
 | |
| ## CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
 | |
| ## CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
 | |
| ## CHECK-DAG: <<Const2:i\d+>>   IntConstant 2                             loop:none
 | |
| ## CHECK-DAG: <<Const128:i\d+>> IntConstant 128                           loop:none
 | |
| ## CHECK-DAG: <<Limit:i\d+>>    IntConstant 4094                          loop:none
 | |
| ## CHECK-DAG: <<PhiI:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
 | |
| ## CHECK-DAG: <<PhiS:i\d+>>     Phi [<<Const128>>,{{i\d+}}]               loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<AddI:i\d+>>     Add [<<PhiI>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<Check:z\d+>>    GreaterThanOrEqual [<<PhiI>>,<<Limit>>]   loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<If:v\d+>>       If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<Rem:i\d+>>      Rem [<<AddI>>,<<Const2>>]                 loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<NE:z\d+>>       NotEqual [<<Rem>>,<<Const0>>]             loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG:                   If [<<NE>>]                               loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<AddS:i\d+>>     Add [<<PhiS>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG:                   ArraySet [{{l\d+}},{{i\d+}},<<PhiS>>]     loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<PhiSM:i\d+>>    Phi [<<PhiS>>,<<AddS>>]                   loop:<<Loop>>      outer_loop:none
 | |
| 
 | |
| ## CHECK-DAG: <<AddIA:i\d+>>    Add [<<AddI>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<CheckA:z\d+>>   GreaterThanOrEqual [<<AddI>>,<<Limit>>]   loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<IfA:v\d+>>      If [<<Const0>>]                           loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<RemA:i\d+>>     Rem [<<AddIA>>,<<Const2>>]                loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<NEA:z\d+>>      NotEqual [<<RemA>>,<<Const0>>]            loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG:                   If [<<NEA>>]                              loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<AddSA:i\d+>>    Add [<<PhiSM>>,<<Const1>>]                loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG:                   ArraySet [{{l\d+}},{{i\d+}},<<PhiSM>>]    loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG:                   Phi [<<AddSA>>,<<PhiSM>>]                 loop:<<Loop>>      outer_loop:none
 | |
| 
 | |
| ## CHECK-NOT:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-NOT:                   ArraySet                                  loop:<<Loop>>      outer_loop:none
 | |
| .method public static final unrollingWhile([I)V
 | |
|     .registers 5
 | |
|     .param p0, "a"    # [I
 | |
| 
 | |
|     .line 167
 | |
|     const/4 v0, 0x0
 | |
| 
 | |
|     .line 168
 | |
|     .local v0, "i":I
 | |
|     const/16 v1, 0x80
 | |
| 
 | |
|     .line 169
 | |
|     .local v1, "s":I
 | |
|     :goto_3
 | |
|     add-int/lit8 v2, v0, 0x1
 | |
| 
 | |
|     .end local v0    # "i":I
 | |
|     .local v2, "i":I
 | |
|     const/16 v3, 0xffe
 | |
| 
 | |
|     if-ge v0, v3, :cond_14
 | |
| 
 | |
|     .line 170
 | |
|     rem-int/lit8 v0, v2, 0x2
 | |
| 
 | |
|     if-nez v0, :cond_12
 | |
| 
 | |
|     .line 171
 | |
|     add-int/lit8 v0, v1, 0x1
 | |
| 
 | |
|     .end local v1    # "s":I
 | |
|     .local v0, "s":I
 | |
|     aput v1, p0, v2
 | |
| 
 | |
|     .line 169
 | |
|     move v1, v0
 | |
| 
 | |
|     .end local v2    # "i":I
 | |
|     .local v0, "i":I
 | |
|     .restart local v1    # "s":I
 | |
|     :cond_12
 | |
|     move v0, v2
 | |
| 
 | |
|     goto :goto_3
 | |
| 
 | |
|     .line 174
 | |
|     .end local v0    # "i":I
 | |
|     .restart local v2    # "i":I
 | |
|     :cond_14
 | |
|     return-void
 | |
| .end method
 | |
| 
 | |
| 
 | |
| ## CHECK-START: int PeelUnroll.unrollingWhileLiveOuts(int[]) loop_optimization (before)
 | |
| ## CHECK-DAG: <<Array:l\d+>>    ParameterValue                            loop:none
 | |
| ## CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
 | |
| ## CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
 | |
| ## CHECK-DAG: <<Const2:i\d+>>   IntConstant 2                             loop:none
 | |
| ## CHECK-DAG: <<Const128:i\d+>> IntConstant 128                           loop:none
 | |
| ## CHECK-DAG: <<Limit:i\d+>>    IntConstant 4094                          loop:none
 | |
| ## CHECK-DAG: <<PhiI:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
 | |
| ## CHECK-DAG: <<PhiS:i\d+>>     Phi [<<Const128>>,{{i\d+}}]               loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<AddI:i\d+>>     Add [<<PhiI>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<Check:z\d+>>    GreaterThanOrEqual [<<PhiI>>,<<Limit>>]   loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<If:v\d+>>       If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<Rem:i\d+>>      Rem [<<AddI>>,<<Const2>>]                 loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<NE:z\d+>>       NotEqual [<<Rem>>,<<Const0>>]             loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG:                   If [<<NE>>]                               loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<AddS:i\d+>>     Add [<<PhiS>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG:                   ArraySet                                  loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG:                   Phi [<<PhiS>>,<<AddS>>]                   loop:<<Loop>>      outer_loop:none
 | |
| 
 | |
| ## CHECK-NOT:                   ArrayGet
 | |
| ## CHECK-NOT:                   ArraySet
 | |
| 
 | |
| ## CHECK-START: int PeelUnroll.unrollingWhileLiveOuts(int[]) loop_optimization (after)
 | |
| ## CHECK-DAG: <<Array:l\d+>>    ParameterValue                            loop:none
 | |
| ## CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
 | |
| ## CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
 | |
| ## CHECK-DAG: <<Const2:i\d+>>   IntConstant 2                             loop:none
 | |
| ## CHECK-DAG: <<Const128:i\d+>> IntConstant 128                           loop:none
 | |
| ## CHECK-DAG: <<Limit:i\d+>>    IntConstant 4094                          loop:none
 | |
| ## CHECK-DAG: <<PhiI:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
 | |
| ## CHECK-DAG: <<PhiS:i\d+>>     Phi [<<Const128>>,{{i\d+}}]               loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<AddI:i\d+>>     Add [<<PhiI>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<Check:z\d+>>    GreaterThanOrEqual [<<PhiI>>,<<Limit>>]   loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<If:v\d+>>       If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<Rem:i\d+>>      Rem [<<AddI>>,<<Const2>>]                 loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<NE:z\d+>>       NotEqual [<<Rem>>,<<Const0>>]             loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG:                   If [<<NE>>]                               loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<AddS:i\d+>>     Add [<<PhiS>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG:                   ArraySet [{{l\d+}},{{i\d+}},<<PhiS>>]     loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<PhiSM:i\d+>>    Phi [<<PhiS>>,<<AddS>>]                   loop:<<Loop>>      outer_loop:none
 | |
| 
 | |
| ## CHECK-DAG: <<AddIA:i\d+>>    Add [<<AddI>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<CheckA:z\d+>>   GreaterThanOrEqual [<<AddI>>,<<Limit>>]   loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<IfA:v\d+>>      If [<<Const0>>]                           loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<RemA:i\d+>>     Rem [<<AddIA>>,<<Const2>>]                loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<NEA:z\d+>>      NotEqual [<<RemA>>,<<Const0>>]            loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG:                   If [<<NEA>>]                              loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG: <<AddSA:i\d+>>    Add [<<PhiSM>>,<<Const1>>]                loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG:                   ArraySet [{{l\d+}},{{i\d+}},<<PhiSM>>]    loop:<<Loop>>      outer_loop:none
 | |
| ## CHECK-DAG:                   Phi [<<AddSA>>,<<PhiSM>>]                 loop:<<Loop>>      outer_loop:none
 | |
| 
 | |
| ## CHECK-DAG: <<RetPhi:i\d+>>   Phi [<<PhiS>>,<<PhiSM>>]                  loop:none
 | |
| ## CHECK-DAG:                   Return [<<RetPhi>>]                       loop:none
 | |
| 
 | |
| ## CHECK-NOT:                   ArrayGet
 | |
| ## CHECK-NOT:                   ArraySet
 | |
| .method public static final unrollingWhileLiveOuts([I)I
 | |
|     .registers 5
 | |
|     .param p0, "a"    # [I
 | |
| 
 | |
|     .line 598
 | |
|     const/4 v0, 0x0
 | |
| 
 | |
|     .line 599
 | |
|     .local v0, "i":I
 | |
|     const/16 v1, 0x80
 | |
| 
 | |
|     .line 600
 | |
|     .local v1, "s":I
 | |
|     :goto_3
 | |
|     add-int/lit8 v2, v0, 0x1
 | |
| 
 | |
|     .end local v0    # "i":I
 | |
|     .local v2, "i":I
 | |
|     const/16 v3, 0xffe
 | |
| 
 | |
|     if-ge v0, v3, :cond_14
 | |
| 
 | |
|     .line 601
 | |
|     rem-int/lit8 v0, v2, 0x2
 | |
| 
 | |
|     if-nez v0, :cond_12
 | |
| 
 | |
|     .line 602
 | |
|     add-int/lit8 v0, v1, 0x1
 | |
| 
 | |
|     .end local v1    # "s":I
 | |
|     .local v0, "s":I
 | |
|     aput v1, p0, v2
 | |
| 
 | |
|     .line 600
 | |
|     move v1, v0
 | |
| 
 | |
|     .end local v2    # "i":I
 | |
|     .local v0, "i":I
 | |
|     .restart local v1    # "s":I
 | |
|     :cond_12
 | |
|     move v0, v2
 | |
| 
 | |
|     goto :goto_3
 | |
| 
 | |
|     .line 605
 | |
|     .end local v0    # "i":I
 | |
|     .restart local v2    # "i":I
 | |
|     :cond_14
 | |
|     return v1
 | |
| .end method
 | |
| 
 |