# 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: <> ParameterValue loop:none ## CHECK-DAG: <> IntConstant 0 loop:none ## CHECK-DAG: <> IntConstant 1 loop:none ## CHECK-DAG: <> IntConstant 2 loop:none ## CHECK-DAG: <> IntConstant 128 loop:none ## CHECK-DAG: <> IntConstant 4094 loop:none ## CHECK-DAG: <> Phi [<>,{{i\d+}}] loop:<> outer_loop:none ## CHECK-DAG: <> Phi [<>,{{i\d+}}] loop:<> outer_loop:none ## CHECK-DAG: <> Add [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> GreaterThanOrEqual [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> If [<>] loop:<> outer_loop:none ## CHECK-DAG: <> Rem [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> NotEqual [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: If [<>] loop:<> outer_loop:none ## CHECK-DAG: <> Add [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: ArraySet loop:<> outer_loop:none ## CHECK-DAG: Phi [<>,<>] loop:<> outer_loop:none ## CHECK-NOT: ArrayGet loop:<> outer_loop:none ## CHECK-NOT: ArraySet loop:<> outer_loop:none ## CHECK-START: void PeelUnroll.unrollingWhile(int[]) loop_optimization (after) ## CHECK-DAG: <> ParameterValue loop:none ## CHECK-DAG: <> IntConstant 0 loop:none ## CHECK-DAG: <> IntConstant 1 loop:none ## CHECK-DAG: <> IntConstant 2 loop:none ## CHECK-DAG: <> IntConstant 128 loop:none ## CHECK-DAG: <> IntConstant 4094 loop:none ## CHECK-DAG: <> Phi [<>,{{i\d+}}] loop:<> outer_loop:none ## CHECK-DAG: <> Phi [<>,{{i\d+}}] loop:<> outer_loop:none ## CHECK-DAG: <> Add [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> GreaterThanOrEqual [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> If [<>] loop:<> outer_loop:none ## CHECK-DAG: <> Rem [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> NotEqual [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: If [<>] loop:<> outer_loop:none ## CHECK-DAG: <> Add [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: ArraySet [{{l\d+}},{{i\d+}},<>] loop:<> outer_loop:none ## CHECK-DAG: <> Phi [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> Add [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> GreaterThanOrEqual [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> If [<>] loop:<> outer_loop:none ## CHECK-DAG: <> Rem [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> NotEqual [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: If [<>] loop:<> outer_loop:none ## CHECK-DAG: <> Add [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: ArraySet [{{l\d+}},{{i\d+}},<>] loop:<> outer_loop:none ## CHECK-DAG: Phi [<>,<>] loop:<> outer_loop:none ## CHECK-NOT: ArrayGet loop:<> outer_loop:none ## CHECK-NOT: ArraySet 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: <> ParameterValue loop:none ## CHECK-DAG: <> IntConstant 0 loop:none ## CHECK-DAG: <> IntConstant 1 loop:none ## CHECK-DAG: <> IntConstant 2 loop:none ## CHECK-DAG: <> IntConstant 128 loop:none ## CHECK-DAG: <> IntConstant 4094 loop:none ## CHECK-DAG: <> Phi [<>,{{i\d+}}] loop:<> outer_loop:none ## CHECK-DAG: <> Phi [<>,{{i\d+}}] loop:<> outer_loop:none ## CHECK-DAG: <> Add [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> GreaterThanOrEqual [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> If [<>] loop:<> outer_loop:none ## CHECK-DAG: <> Rem [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> NotEqual [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: If [<>] loop:<> outer_loop:none ## CHECK-DAG: <> Add [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: ArraySet loop:<> outer_loop:none ## CHECK-DAG: Phi [<>,<>] loop:<> outer_loop:none ## CHECK-NOT: ArrayGet ## CHECK-NOT: ArraySet ## CHECK-START: int PeelUnroll.unrollingWhileLiveOuts(int[]) loop_optimization (after) ## CHECK-DAG: <> ParameterValue loop:none ## CHECK-DAG: <> IntConstant 0 loop:none ## CHECK-DAG: <> IntConstant 1 loop:none ## CHECK-DAG: <> IntConstant 2 loop:none ## CHECK-DAG: <> IntConstant 128 loop:none ## CHECK-DAG: <> IntConstant 4094 loop:none ## CHECK-DAG: <> Phi [<>,{{i\d+}}] loop:<> outer_loop:none ## CHECK-DAG: <> Phi [<>,{{i\d+}}] loop:<> outer_loop:none ## CHECK-DAG: <> Add [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> GreaterThanOrEqual [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> If [<>] loop:<> outer_loop:none ## CHECK-DAG: <> Rem [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> NotEqual [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: If [<>] loop:<> outer_loop:none ## CHECK-DAG: <> Add [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: ArraySet [{{l\d+}},{{i\d+}},<>] loop:<> outer_loop:none ## CHECK-DAG: <> Phi [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> Add [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> GreaterThanOrEqual [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> If [<>] loop:<> outer_loop:none ## CHECK-DAG: <> Rem [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> NotEqual [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: If [<>] loop:<> outer_loop:none ## CHECK-DAG: <> Add [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: ArraySet [{{l\d+}},{{i\d+}},<>] loop:<> outer_loop:none ## CHECK-DAG: Phi [<>,<>] loop:<> outer_loop:none ## CHECK-DAG: <> Phi [<>,<>] loop:none ## CHECK-DAG: Return [<>] 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