xref: /aosp_15_r20/art/test/656-checker-simd-opt/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Array;
17*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Method;
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker /**
20*795d594fSAndroid Build Coastguard Worker  * Tests for SIMD related optimizations.
21*795d594fSAndroid Build Coastguard Worker  */
22*795d594fSAndroid Build Coastguard Worker public class Main {
23*795d594fSAndroid Build Coastguard Worker 
24*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unroll(float[], float[]) loop_optimization (before)
25*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons:f\d+>> FloatConstant 2.5                   loop:none
26*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>  Phi                                 loop:<<Loop:B\d+>> outer_loop:none
27*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:f\d+>>  ArrayGet                            loop:<<Loop>>      outer_loop:none
28*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Mul:f\d+>>  Mul [<<Get>>,<<Cons>>]              loop:<<Loop>>      outer_loop:none
29*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:               ArraySet [{{l\d+}},<<Phi>>,<<Mul>>] loop:<<Loop>>      outer_loop:none
30*795d594fSAndroid Build Coastguard Worker   //
31*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-{X86_64,ARM64}: void Main.unroll(float[], float[]) loop_optimization (after)
32*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons:f\d+>> FloatConstant 2.5                    loop:none
33*795d594fSAndroid Build Coastguard Worker 
34*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
35*795d594fSAndroid Build Coastguard Worker   //
36*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Repl:d\d+>>  VecReplicateScalar [<<Cons>>,{{j\d+}}]         loop:none
37*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT:                VecReplicateScalar
38*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:i\d+>>   Phi                                            loop:<<Loop:B\d+>> outer_loop:none
39*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi>>,{{i\d+}}]                loop:<<Loop>>      outer_loop:none
40*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get1:d\d+>>  VecLoad [{{l\d+}},<<Phi>>,<<LoopP>>]           loop:<<Loop>>      outer_loop:none
41*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Mul1:d\d+>>  VecMul [<<Get1>>,<<Repl>>,<<LoopP>>]           loop:<<Loop>>      outer_loop:none
42*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                VecStore [{{l\d+}},<<Phi>>,<<Mul1>>,<<LoopP>>] loop:<<Loop>>      outer_loop:none
43*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add:i\d+>>   Add [<<Phi>>,{{i\d+}}]                         loop:<<Loop>>      outer_loop:none
44*795d594fSAndroid Build Coastguard Worker   //      No unroll for SVE yet.
45*795d594fSAndroid Build Coastguard Worker   //
46*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
47*795d594fSAndroid Build Coastguard Worker   //
48*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Incr:i\d+>>  IntConstant 4                        loop:none
49*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Repl:d\d+>>  VecReplicateScalar [<<Cons>>]        loop:none
50*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT:                VecReplicateScalar
51*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:i\d+>>   Phi                                  loop:<<Loop:B\d+>> outer_loop:none
52*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get1:d\d+>>  VecLoad [{{l\d+}},<<Phi>>]           loop:<<Loop>>      outer_loop:none
53*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Mul1:d\d+>>  VecMul [<<Get1>>,<<Repl>>]           loop:<<Loop>>      outer_loop:none
54*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                VecStore [{{l\d+}},<<Phi>>,<<Mul1>>] loop:<<Loop>>      outer_loop:none
55*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add:i\d+>>   Add [<<Phi>>,<<Incr>>]               loop:<<Loop>>      outer_loop:none
56*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get2:d\d+>>  VecLoad [{{l\d+}},<<Add>>]           loop:<<Loop>>      outer_loop:none
57*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Mul2:d\d+>>  VecMul [<<Get2>>,<<Repl>>]           loop:<<Loop>>      outer_loop:none
58*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                VecStore [{{l\d+}},<<Add>>,<<Mul2>>] loop:<<Loop>>      outer_loop:none
59*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                Add [<<Add>>,<<Incr>>]               loop:<<Loop>>      outer_loop:none
60*795d594fSAndroid Build Coastguard Worker   //
61*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
unroll(float[] x, float[] y)62*795d594fSAndroid Build Coastguard Worker   private static void unroll(float[] x, float[] y) {
63*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 100; i++) {
64*795d594fSAndroid Build Coastguard Worker       x[i] = y[i] * 2.5f;
65*795d594fSAndroid Build Coastguard Worker     }
66*795d594fSAndroid Build Coastguard Worker   }
67*795d594fSAndroid Build Coastguard Worker 
68*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-{X86_64,ARM64}: void Main.stencil(int[], int[], int) loop_optimization (after)
69*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<CP1:i\d+>>   IntConstant 1                         loop:none
70*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<CP2:i\d+>>   IntConstant 2                         loop:none
71*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
72*795d594fSAndroid Build Coastguard Worker   //
73*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:i\d+>>   Phi                                             loop:<<Loop:B\d+>> outer_loop:none
74*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi>>,{{i\d+}}]                 loop:<<Loop>>      outer_loop:none
75*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add1:i\d+>>  Add [<<Phi>>,<<CP1>>]                           loop:<<Loop>>      outer_loop:none
76*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get1:d\d+>>  VecLoad [{{l\d+}},<<Phi>>,<<LoopP>>]            loop:<<Loop>>      outer_loop:none
77*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get2:d\d+>>  VecLoad [{{l\d+}},<<Add1>>,<<LoopP>>]           loop:<<Loop>>      outer_loop:none
78*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add2:d\d+>>  VecAdd [<<Get1>>,<<Get2>>,<<LoopP>>]            loop:<<Loop>>      outer_loop:none
79*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add3:i\d+>>  Add [<<Phi>>,<<CP2>>]                           loop:<<Loop>>      outer_loop:none
80*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get3:d\d+>>  VecLoad [{{l\d+}},<<Add3>>,<<LoopP>>]           loop:<<Loop>>      outer_loop:none
81*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add4:d\d+>>  VecAdd [<<Add2>>,<<Get3>>,<<LoopP>>]            loop:<<Loop>>      outer_loop:none
82*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                VecStore [{{l\d+}},<<Add1>>,<<Add4>>,<<LoopP>>] loop:<<Loop>>      outer_loop:none
83*795d594fSAndroid Build Coastguard Worker   //
84*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
85*795d594fSAndroid Build Coastguard Worker   //
86*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:i\d+>>   Phi                                   loop:<<Loop:B\d+>> outer_loop:none
87*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add1:i\d+>>  Add [<<Phi>>,<<CP1>>]                 loop:<<Loop>>      outer_loop:none
88*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get1:d\d+>>  VecLoad [{{l\d+}},<<Phi>>]            loop:<<Loop>>      outer_loop:none
89*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get2:d\d+>>  VecLoad [{{l\d+}},<<Add1>>]           loop:<<Loop>>      outer_loop:none
90*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add2:d\d+>>  VecAdd [<<Get1>>,<<Get2>>]            loop:<<Loop>>      outer_loop:none
91*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add3:i\d+>>  Add [<<Phi>>,<<CP2>>]                 loop:<<Loop>>      outer_loop:none
92*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get3:d\d+>>  VecLoad [{{l\d+}},<<Add3>>]           loop:<<Loop>>      outer_loop:none
93*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add4:d\d+>>  VecAdd [<<Add2>>,<<Get3>>]            loop:<<Loop>>      outer_loop:none
94*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                VecStore [{{l\d+}},<<Add1>>,<<Add4>>] loop:<<Loop>>      outer_loop:none
95*795d594fSAndroid Build Coastguard Worker   //
96*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
stencil(int[] a, int[] b, int n)97*795d594fSAndroid Build Coastguard Worker   private static void stencil(int[] a, int[] b, int n) {
98*795d594fSAndroid Build Coastguard Worker     for (int i = 1; i < n - 1; i++) {
99*795d594fSAndroid Build Coastguard Worker       a[i] = b[i - 1] + b[i] + b[i + 1];
100*795d594fSAndroid Build Coastguard Worker     }
101*795d594fSAndroid Build Coastguard Worker   }
102*795d594fSAndroid Build Coastguard Worker 
103*795d594fSAndroid Build Coastguard Worker   // Array size is chosen to be such a constant, that the loop trip count (in the test below)
104*795d594fSAndroid Build Coastguard Worker   // is a multiple of vector length and unroll factor; hence clean up is needed exclusively for
105*795d594fSAndroid Build Coastguard Worker   // the array references test.
106*795d594fSAndroid Build Coastguard Worker   public static final int STENCIL_ARRAY_SIZE = 130;
107*795d594fSAndroid Build Coastguard Worker 
108*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-{X86_64,ARM64}: void Main.$noinline$stencilConstSize(int[], int[]) loop_optimization (after)
109*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<C0:i\d+>>    IntConstant 0
110*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<CP1:i\d+>>   IntConstant 1
111*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<CP2:i\d+>>   IntConstant 2
112*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Arr0:l\d+>>  ParameterValue
113*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Arr1:l\d+>>  ParameterValue
114*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ArrCh:z\d+>> NotEqual [<<Arr0>>,<<Arr1>>]         loop:none
115*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<TCSel:i\d+>> Select [<<C0>>,{{i\d+}},<<ArrCh>>]   loop:none
116*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiV:i\d+>>  Phi [<<C0>>,{{i\d+}}]                loop:<<LoopV:B\d+>> outer_loop:none
117*795d594fSAndroid Build Coastguard Worker   //
118*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
119*795d594fSAndroid Build Coastguard Worker   //
120*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<PhiV>>,{{i\d+}}]                loop:<<LoopV>>      outer_loop:none
121*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add1:i\d+>>  Add [<<PhiV>>,<<CP1>>]                          loop:<<LoopV>>      outer_loop:none
122*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get1:d\d+>>  VecLoad [{{l\d+}},<<PhiV>>,<<LoopP>>]           loop:<<LoopV>>      outer_loop:none
123*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get2:d\d+>>  VecLoad [{{l\d+}},<<Add1>>,<<LoopP>>]           loop:<<LoopV>>      outer_loop:none
124*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add2:d\d+>>  VecAdd [<<Get1>>,<<Get2>>,<<LoopP>>]            loop:<<LoopV>>      outer_loop:none
125*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add3:i\d+>>  Add [<<PhiV>>,<<CP2>>]                          loop:<<LoopV>>      outer_loop:none
126*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get3:d\d+>>  VecLoad [{{l\d+}},<<Add3>>,<<LoopP>>]           loop:<<LoopV>>      outer_loop:none
127*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add4:d\d+>>  VecAdd [<<Add2>>,<<Get3>>,<<LoopP>>]            loop:<<LoopV>>      outer_loop:none
128*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                VecStore [{{l\d+}},<<Add1>>,<<Add4>>,<<LoopP>>] loop:<<LoopV>>      outer_loop:none
129*795d594fSAndroid Build Coastguard Worker   //
130*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
131*795d594fSAndroid Build Coastguard Worker   //
132*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add1:i\d+>>  Add [<<PhiV>>,<<CP1>>]                          loop:<<LoopV>>      outer_loop:none
133*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get1:d\d+>>  VecLoad [{{l\d+}},<<PhiV>>]                     loop:<<LoopV>>      outer_loop:none
134*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get2:d\d+>>  VecLoad [{{l\d+}},<<Add1>>]                     loop:<<LoopV>>      outer_loop:none
135*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add2:d\d+>>  VecAdd [<<Get1>>,<<Get2>>]                      loop:<<LoopV>>      outer_loop:none
136*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add3:i\d+>>  Add [<<PhiV>>,<<CP2>>]                          loop:<<LoopV>>      outer_loop:none
137*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get3:d\d+>>  VecLoad [{{l\d+}},<<Add3>>]                     loop:<<LoopV>>      outer_loop:none
138*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add4:d\d+>>  VecAdd [<<Add2>>,<<Get3>>]                      loop:<<LoopV>>      outer_loop:none
139*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                VecStore [{{l\d+}},<<Add1>>,<<Add4>>]           loop:<<LoopV>>      outer_loop:none
140*795d594fSAndroid Build Coastguard Worker   //
141*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
142*795d594fSAndroid Build Coastguard Worker   //
143*795d594fSAndroid Build Coastguard Worker   // Cleanup loop.
144*795d594fSAndroid Build Coastguard Worker   //
145*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiS:i\d+>>   Phi [<<PhiV>>,{{i\d+}}]             loop:<<LoopS:B\d+>> outer_loop:none
146*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet                            loop:<<LoopS>>      outer_loop:none
147*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet                            loop:<<LoopS>>      outer_loop:none
148*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet                            loop:<<LoopS>>      outer_loop:none
149*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet                            loop:<<LoopS>>      outer_loop:none
150*795d594fSAndroid Build Coastguard Worker   //
151*795d594fSAndroid Build Coastguard Worker   // Checks the disambiguation runtime test for array references.
152*795d594fSAndroid Build Coastguard Worker   //
$noinline$stencilConstSize(int[] a, int[] b)153*795d594fSAndroid Build Coastguard Worker   private static void $noinline$stencilConstSize(int[] a, int[] b) {
154*795d594fSAndroid Build Coastguard Worker     for (int i = 1; i < STENCIL_ARRAY_SIZE - 1; i++) {
155*795d594fSAndroid Build Coastguard Worker       a[i] = b[i - 1] + b[i] + b[i + 1];
156*795d594fSAndroid Build Coastguard Worker     }
157*795d594fSAndroid Build Coastguard Worker   }
158*795d594fSAndroid Build Coastguard Worker 
159*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.stencilAddInt(int[], int[], int) loop_optimization (before)
160*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<CP1:i\d+>>   IntConstant 1                        loop:none
161*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<CM1:i\d+>>   IntConstant -1                       loop:none
162*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>   Phi                                  loop:<<Loop:B\d+>> outer_loop:none
163*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add1:i\d+>>  Add [<<Phi>>,<<CM1>>]                loop:<<Loop>>      outer_loop:none
164*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:i\d+>>  ArrayGet [{{l\d+}},<<Add1>>]         loop:<<Loop>>      outer_loop:none
165*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get2:i\d+>>  ArrayGet [{{l\d+}},<<Phi>>]          loop:<<Loop>>      outer_loop:none
166*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add2:i\d+>>  Add [<<Get1>>,<<Get2>>]              loop:<<Loop>>      outer_loop:none
167*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add3:i\d+>>  Add [<<Phi>>,<<CP1>>]                loop:<<Loop>>      outer_loop:none
168*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get3:i\d+>>  ArrayGet [{{l\d+}},<<Add3>>]         loop:<<Loop>>      outer_loop:none
169*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add4:i\d+>>  Add [<<Add2>>,<<Get3>>]              loop:<<Loop>>      outer_loop:none
170*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                ArraySet [{{l\d+}},<<Phi>>,<<Add4>>] loop:<<Loop>>      outer_loop:none
171*795d594fSAndroid Build Coastguard Worker 
172*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-{X86_64,ARM64}: void Main.stencilAddInt(int[], int[], int) loop_optimization (after)
173*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<CP1:i\d+>>   IntConstant 1                         loop:none
174*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<CP2:i\d+>>   IntConstant 2                         loop:none
175*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
176*795d594fSAndroid Build Coastguard Worker   //
177*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:i\d+>>   Phi                                             loop:<<Loop:B\d+>> outer_loop:none
178*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi>>,{{i\d+}}]                 loop:<<Loop>>      outer_loop:none
179*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add1:i\d+>>  Add [<<Phi>>,<<CP1>>]                           loop:<<Loop>>      outer_loop:none
180*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get1:d\d+>>  VecLoad [{{l\d+}},<<Phi>>,<<LoopP>>]            loop:<<Loop>>      outer_loop:none
181*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get2:d\d+>>  VecLoad [{{l\d+}},<<Add1>>,<<LoopP>>]           loop:<<Loop>>      outer_loop:none
182*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add2:d\d+>>  VecAdd [<<Get1>>,<<Get2>>,<<LoopP>>]            loop:<<Loop>>      outer_loop:none
183*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add3:i\d+>>  Add [<<Phi>>,<<CP2>>]                           loop:<<Loop>>      outer_loop:none
184*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get3:d\d+>>  VecLoad [{{l\d+}},<<Add3>>,<<LoopP>>]           loop:<<Loop>>      outer_loop:none
185*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add4:d\d+>>  VecAdd [<<Add2>>,<<Get3>>,<<LoopP>>]            loop:<<Loop>>      outer_loop:none
186*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                VecStore [{{l\d+}},<<Add1>>,<<Add4>>,<<LoopP>>] loop:<<Loop>>      outer_loop:none
187*795d594fSAndroid Build Coastguard Worker   //
188*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
189*795d594fSAndroid Build Coastguard Worker   //
190*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:i\d+>>   Phi                                   loop:<<Loop:B\d+>> outer_loop:none
191*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add1:i\d+>>  Add [<<Phi>>,<<CP1>>]                 loop:<<Loop>>      outer_loop:none
192*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get1:d\d+>>  VecLoad [{{l\d+}},<<Phi>>]            loop:<<Loop>>      outer_loop:none
193*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get2:d\d+>>  VecLoad [{{l\d+}},<<Add1>>]           loop:<<Loop>>      outer_loop:none
194*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add2:d\d+>>  VecAdd [<<Get1>>,<<Get2>>]            loop:<<Loop>>      outer_loop:none
195*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add3:i\d+>>  Add [<<Phi>>,<<CP2>>]                 loop:<<Loop>>      outer_loop:none
196*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get3:d\d+>>  VecLoad [{{l\d+}},<<Add3>>]           loop:<<Loop>>      outer_loop:none
197*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add4:d\d+>>  VecAdd [<<Add2>>,<<Get3>>]            loop:<<Loop>>      outer_loop:none
198*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                VecStore [{{l\d+}},<<Add1>>,<<Add4>>] loop:<<Loop>>      outer_loop:none
199*795d594fSAndroid Build Coastguard Worker   //
200*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
stencilAddInt(int[] a, int[] b, int n)201*795d594fSAndroid Build Coastguard Worker   private static void stencilAddInt(int[] a, int[] b, int n) {
202*795d594fSAndroid Build Coastguard Worker     int minus1 = $inline$constMinus1();
203*795d594fSAndroid Build Coastguard Worker     for (int i = 1; i < n + minus1; i++) {
204*795d594fSAndroid Build Coastguard Worker       a[i] = b[i + minus1] + b[i] + b[i + 1];
205*795d594fSAndroid Build Coastguard Worker     }
206*795d594fSAndroid Build Coastguard Worker   }
207*795d594fSAndroid Build Coastguard Worker 
$inline$constMinus1()208*795d594fSAndroid Build Coastguard Worker   private static int $inline$constMinus1() {
209*795d594fSAndroid Build Coastguard Worker     return -1;
210*795d594fSAndroid Build Coastguard Worker   }
211*795d594fSAndroid Build Coastguard Worker 
212*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.stencilSubInt(int[], int[], int) loop_optimization (before)
213*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PAR3:i\d+>>  ParameterValue                       loop:none
214*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<CP1:i\d+>>   IntConstant 1                        loop:none
215*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sub1:i\d+>>  Sub [<<PAR3>>,<<CP1>>]               loop:none
216*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>   Phi                                  loop:<<Loop:B\d+>> outer_loop:none
217*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sub2:i\d+>>  Sub [<<Phi>>,<<CP1>>]                loop:<<Loop>>      outer_loop:none
218*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:i\d+>>  ArrayGet [{{l\d+}},<<Sub2>>]         loop:<<Loop>>      outer_loop:none
219*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get2:i\d+>>  ArrayGet [{{l\d+}},<<Phi>>]          loop:<<Loop>>      outer_loop:none
220*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add1:i\d+>>  Add [<<Get1>>,<<Get2>>]              loop:<<Loop>>      outer_loop:none
221*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add2:i\d+>>  Add [<<Phi>>,<<CP1>>]                loop:<<Loop>>      outer_loop:none
222*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get3:i\d+>>  ArrayGet [{{l\d+}},<<Add2>>]         loop:<<Loop>>      outer_loop:none
223*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add3:i\d+>>  Add [<<Add1>>,<<Get3>>]              loop:<<Loop>>      outer_loop:none
224*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                ArraySet [{{l\d+}},<<Phi>>,<<Add3>>] loop:<<Loop>>      outer_loop:none
225*795d594fSAndroid Build Coastguard Worker 
226*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-{X86_64,ARM64}: void Main.stencilSubInt(int[], int[], int) loop_optimization (after)
227*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<CP1:i\d+>>   IntConstant 1                         loop:none
228*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<CP2:i\d+>>   IntConstant 2                         loop:none
229*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
230*795d594fSAndroid Build Coastguard Worker   //
231*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:i\d+>>   Phi                                             loop:<<Loop:B\d+>> outer_loop:none
232*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi>>,{{i\d+}}]                 loop:<<Loop>>      outer_loop:none
233*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add1:i\d+>>  Add [<<Phi>>,<<CP1>>]                           loop:<<Loop>>      outer_loop:none
234*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get1:d\d+>>  VecLoad [{{l\d+}},<<Phi>>,<<LoopP>>]            loop:<<Loop>>      outer_loop:none
235*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get2:d\d+>>  VecLoad [{{l\d+}},<<Add1>>,<<LoopP>>]           loop:<<Loop>>      outer_loop:none
236*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add2:d\d+>>  VecAdd [<<Get1>>,<<Get2>>,<<LoopP>>]            loop:<<Loop>>      outer_loop:none
237*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add3:i\d+>>  Add [<<Phi>>,<<CP2>>]                           loop:<<Loop>>      outer_loop:none
238*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get3:d\d+>>  VecLoad [{{l\d+}},<<Add3>>,<<LoopP>>]           loop:<<Loop>>      outer_loop:none
239*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add4:d\d+>>  VecAdd [<<Add2>>,<<Get3>>,<<LoopP>>]            loop:<<Loop>>      outer_loop:none
240*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                VecStore [{{l\d+}},<<Add1>>,<<Add4>>,<<LoopP>>] loop:<<Loop>>      outer_loop:none
241*795d594fSAndroid Build Coastguard Worker   //
242*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
243*795d594fSAndroid Build Coastguard Worker   //
244*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:i\d+>>   Phi                                   loop:<<Loop:B\d+>> outer_loop:none
245*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add1:i\d+>>  Add [<<Phi>>,<<CP1>>]                 loop:<<Loop>>      outer_loop:none
246*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get1:d\d+>>  VecLoad [{{l\d+}},<<Phi>>]            loop:<<Loop>>      outer_loop:none
247*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get2:d\d+>>  VecLoad [{{l\d+}},<<Add1>>]           loop:<<Loop>>      outer_loop:none
248*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add2:d\d+>>  VecAdd [<<Get1>>,<<Get2>>]            loop:<<Loop>>      outer_loop:none
249*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add3:i\d+>>  Add [<<Phi>>,<<CP2>>]                 loop:<<Loop>>      outer_loop:none
250*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Get3:d\d+>>  VecLoad [{{l\d+}},<<Add3>>]           loop:<<Loop>>      outer_loop:none
251*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add4:d\d+>>  VecAdd [<<Add2>>,<<Get3>>]            loop:<<Loop>>      outer_loop:none
252*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                VecStore [{{l\d+}},<<Add1>>,<<Add4>>] loop:<<Loop>>      outer_loop:none
253*795d594fSAndroid Build Coastguard Worker   //
254*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
stencilSubInt(int[] a, int[] b, int n)255*795d594fSAndroid Build Coastguard Worker   private static void stencilSubInt(int[] a, int[] b, int n) {
256*795d594fSAndroid Build Coastguard Worker     int plus1 = $inline$constPlus1();
257*795d594fSAndroid Build Coastguard Worker     for (int i = 1; i < n - plus1; i++) {
258*795d594fSAndroid Build Coastguard Worker       a[i] = b[i - plus1] + b[i] + b[i + 1];
259*795d594fSAndroid Build Coastguard Worker     }
260*795d594fSAndroid Build Coastguard Worker   }
261*795d594fSAndroid Build Coastguard Worker 
$inline$constPlus1()262*795d594fSAndroid Build Coastguard Worker   private static int $inline$constPlus1() {
263*795d594fSAndroid Build Coastguard Worker     return 1;
264*795d594fSAndroid Build Coastguard Worker   }
265*795d594fSAndroid Build Coastguard Worker 
266*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long Main.longInductionReduction(long[]) loop_optimization (before)
267*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<L0:j\d+>>    LongConstant 0             loop:none
268*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<L1:j\d+>>    LongConstant 1             loop:none
269*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<I0:i\d+>>    IntConstant 0              loop:none
270*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:j\d+>>   ArrayGet [{{l\d+}},<<I0>>] loop:none
271*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:j\d+>>  Phi [<<L0>>,<<Add1:j\d+>>] loop:<<Loop:B\d+>> outer_loop:none
272*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:j\d+>>  Phi [<<L1>>,<<Add2:j\d+>>] loop:<<Loop>>      outer_loop:none
273*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add2>>       Add [<<Phi2>>,<<Get>>]     loop:<<Loop>>      outer_loop:none
274*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add1>>       Add [<<Phi1>>,<<L1>>]      loop:<<Loop>>      outer_loop:none
275*795d594fSAndroid Build Coastguard Worker   //
276*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-{X86_64,ARM64}: long Main.longInductionReduction(long[]) loop_optimization (after)
277*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<L0:j\d+>>    LongConstant 0               loop:none
278*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<L1:j\d+>>    LongConstant 1               loop:none
279*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<I0:i\d+>>    IntConstant 0                loop:none
280*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:j\d+>>   ArrayGet [{{l\d+}},<<I0>>]   loop:none
281*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
282*795d594fSAndroid Build Coastguard Worker   //
283*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Rep:d\d+>>   VecReplicateScalar [<<Get>>,{{j\d+}}]  loop:none
284*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>   VecSetScalars [<<L1>>,{{j\d+}}]        loop:none
285*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:j\d+>>  Phi [<<L0>>,{{j\d+}}]                  loop:<<Loop:B\d+>> outer_loop:none
286*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>  Phi [<<Set>>,{{d\d+}}]                 loop:<<Loop>>      outer_loop:none
287*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi1>>,{{j\d+}}]       loop:<<Loop>>      outer_loop:none
288*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                VecAdd [<<Phi2>>,<<Rep>>,<<LoopP>>]    loop:<<Loop>>      outer_loop:none
289*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                Add [<<Phi1>>,{{j\d+}}]                loop:<<Loop>>      outer_loop:none
290*795d594fSAndroid Build Coastguard Worker   //
291*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
292*795d594fSAndroid Build Coastguard Worker   //
293*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<L2:j\d+>>    LongConstant 2               loop:none
294*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Rep:d\d+>>   VecReplicateScalar [<<Get>>] loop:none
295*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>   VecSetScalars [<<L1>>]       loop:none
296*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:j\d+>>  Phi [<<L0>>,{{j\d+}}]        loop:<<Loop:B\d+>> outer_loop:none
297*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>  Phi [<<Set>>,{{d\d+}}]       loop:<<Loop>>      outer_loop:none
298*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                VecAdd [<<Phi2>>,<<Rep>>]    loop:<<Loop>>      outer_loop:none
299*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                Add [<<Phi1>>,<<L2>>]        loop:<<Loop>>      outer_loop:none
300*795d594fSAndroid Build Coastguard Worker   //
301*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
longInductionReduction(long[] y)302*795d594fSAndroid Build Coastguard Worker   static long longInductionReduction(long[] y) {
303*795d594fSAndroid Build Coastguard Worker     long x = 1;
304*795d594fSAndroid Build Coastguard Worker     for (long i = 0; i < 10; i++) {
305*795d594fSAndroid Build Coastguard Worker       x += y[0];
306*795d594fSAndroid Build Coastguard Worker     }
307*795d594fSAndroid Build Coastguard Worker     return x;
308*795d594fSAndroid Build Coastguard Worker   }
309*795d594fSAndroid Build Coastguard Worker 
310*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.intVectorLongInvariant(int[], long[]) loop_optimization (before)
311*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<I0:i\d+>>    IntConstant 0                       loop:none
312*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<I1:i\d+>>    IntConstant 1                       loop:none
313*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:j\d+>>   ArrayGet [{{l\d+}},<<I0>>]          loop:none
314*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>   Phi [<<I0>>,<<Add:i\d+>>]           loop:<<Loop:B\d+>> outer_loop:none
315*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnv:i\d+>>   TypeConversion [<<Get>>]            loop:<<Loop>>      outer_loop:none
316*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                ArraySet [{{l\d+}},<<Phi>>,<<Cnv>>] loop:<<Loop>>      outer_loop:none
317*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add>>        Add [<<Phi>>,<<I1>>]                loop:<<Loop>>      outer_loop:none
318*795d594fSAndroid Build Coastguard Worker   //
319*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-{X86_64,ARM64}: void Main.intVectorLongInvariant(int[], long[]) loop_optimization (after)
320*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<I0:i\d+>>    IntConstant 0                       loop:none
321*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<I1:i\d+>>    IntConstant 1                       loop:none
322*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:j\d+>>   ArrayGet [{{l\d+}},<<I0>>]          loop:none
323*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnv:i\d+>>   TypeConversion [<<Get>>]            loop:none
324*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
325*795d594fSAndroid Build Coastguard Worker   //
326*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Rep:d\d+>>   VecReplicateScalar [<<Cnv>>,{{j\d+}}]         loop:none
327*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:i\d+>>   Phi [<<I0>>,{{i\d+}}]                         loop:<<Loop:B\d+>> outer_loop:none
328*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi>>,{{i\d+}}]               loop:<<Loop>>      outer_loop:none
329*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                VecStore [{{l\d+}},<<Phi>>,<<Rep>>,<<LoopP>>] loop:<<Loop>>      outer_loop:none
330*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                Add [<<Phi>>,{{i\d+}}]                        loop:<<Loop>>      outer_loop:none
331*795d594fSAndroid Build Coastguard Worker   //
332*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
333*795d594fSAndroid Build Coastguard Worker   //
334*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<I4:i\d+>>    IntConstant 4                       loop:none
335*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Rep:d\d+>>   VecReplicateScalar [<<Cnv>>]        loop:none
336*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:i\d+>>   Phi [<<I0>>,{{i\d+}}]               loop:<<Loop:B\d+>> outer_loop:none
337*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                VecStore [{{l\d+}},<<Phi>>,<<Rep>>] loop:<<Loop>>      outer_loop:none
338*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                Add [<<Phi>>,<<I4>>]                loop:<<Loop>>      outer_loop:none
339*795d594fSAndroid Build Coastguard Worker   //
340*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
intVectorLongInvariant(int[] x, long[] y)341*795d594fSAndroid Build Coastguard Worker   static void intVectorLongInvariant(int[] x, long[] y) {
342*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 100; i++) {
343*795d594fSAndroid Build Coastguard Worker       x[i] = (int) y[0];
344*795d594fSAndroid Build Coastguard Worker     }
345*795d594fSAndroid Build Coastguard Worker   }
346*795d594fSAndroid Build Coastguard Worker 
347*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.longCanBeDoneWithInt(int[], int[]) loop_optimization (before)
348*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<I0:i\d+>>    IntConstant 0                        loop:none
349*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<I1:i\d+>>    IntConstant 1                        loop:none
350*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<L1:j\d+>>    LongConstant 1                       loop:none
351*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>   Phi [<<I0>>,<<Add:i\d+>>]            loop:<<Loop:B\d+>> outer_loop:none
352*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:i\d+>>   ArrayGet [{{l\d+}},<<Phi>>]          loop:<<Loop>>      outer_loop:none
353*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnv1:j\d+>>  TypeConversion [<<Get>>]             loop:<<Loop>>      outer_loop:none
354*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddL:j\d+>>  Add [<<Cnv1>>,<<L1>>]                loop:<<Loop>>      outer_loop:none
355*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnv2:i\d+>>  TypeConversion [<<AddL>>]            loop:<<Loop>>      outer_loop:none
356*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                ArraySet [{{l\d+}},<<Phi>>,<<Cnv2>>] loop:<<Loop>>      outer_loop:none
357*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add>>        Add [<<Phi>>,<<I1>>]                 loop:<<Loop>>      outer_loop:none
358*795d594fSAndroid Build Coastguard Worker   //
359*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-{X86_64,ARM64}: void Main.longCanBeDoneWithInt(int[], int[]) loop_optimization (after)
360*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<I0:i\d+>>    IntConstant 0                       loop:none
361*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<L1:j\d+>>    LongConstant 1                      loop:none
362*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnv:i\d+>>   TypeConversion [<<L1>>]             loop:none
363*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
364*795d594fSAndroid Build Coastguard Worker   //
365*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Rep:d\d+>>   VecReplicateScalar [<<Cnv>>,{{j\d+}}]         loop:none
366*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:i\d+>>   Phi [<<I0>>,{{i\d+}}]                         loop:<<Loop:B\d+>> outer_loop:none
367*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi>>,{{i\d+}}]               loop:<<Loop>>      outer_loop:none
368*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>  VecLoad [{{l\d+}},<<Phi>>,<<LoopP>>]          loop:<<Loop>>      outer_loop:none
369*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add:d\d+>>   VecAdd [<<Load>>,<<Rep>>,<<LoopP>>]           loop:<<Loop>>      outer_loop:none
370*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                VecStore [{{l\d+}},<<Phi>>,<<Add>>,<<LoopP>>] loop:<<Loop>>      outer_loop:none
371*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                Add [<<Phi>>,{{i\d+}}]                        loop:<<Loop>>      outer_loop:none
372*795d594fSAndroid Build Coastguard Worker   //
373*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
374*795d594fSAndroid Build Coastguard Worker   //
375*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<I4:i\d+>>    IntConstant 4                       loop:none
376*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Rep:d\d+>>   VecReplicateScalar [<<Cnv>>]        loop:none
377*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:i\d+>>   Phi [<<I0>>,{{i\d+}}]               loop:<<Loop:B\d+>> outer_loop:none
378*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>  VecLoad [{{l\d+}},<<Phi>>]          loop:<<Loop>>      outer_loop:none
379*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add:d\d+>>   VecAdd [<<Load>>,<<Rep>>]           loop:<<Loop>>      outer_loop:none
380*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                VecStore [{{l\d+}},<<Phi>>,<<Add>>] loop:<<Loop>>      outer_loop:none
381*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                Add [<<Phi>>,<<I4>>]                loop:<<Loop>>      outer_loop:none
382*795d594fSAndroid Build Coastguard Worker   //
383*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
longCanBeDoneWithInt(int[] x, int[] y)384*795d594fSAndroid Build Coastguard Worker   static void longCanBeDoneWithInt(int[] x, int[] y) {
385*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 100; i++) {
386*795d594fSAndroid Build Coastguard Worker       x[i] = (int) (y[i] + 1L);
387*795d594fSAndroid Build Coastguard Worker     }
388*795d594fSAndroid Build Coastguard Worker   }
389*795d594fSAndroid Build Coastguard Worker 
testUnroll()390*795d594fSAndroid Build Coastguard Worker   static void testUnroll() {
391*795d594fSAndroid Build Coastguard Worker     float[] x = new float[100];
392*795d594fSAndroid Build Coastguard Worker     float[] y = new float[100];
393*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 100; i++) {
394*795d594fSAndroid Build Coastguard Worker       x[i] = 0.0f;
395*795d594fSAndroid Build Coastguard Worker       y[i] = 2.0f;
396*795d594fSAndroid Build Coastguard Worker     }
397*795d594fSAndroid Build Coastguard Worker     unroll(x, y);
398*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 100; i++) {
399*795d594fSAndroid Build Coastguard Worker       expectEquals(5.0f, x[i]);
400*795d594fSAndroid Build Coastguard Worker       expectEquals(2.0f, y[i]);
401*795d594fSAndroid Build Coastguard Worker     }
402*795d594fSAndroid Build Coastguard Worker   }
403*795d594fSAndroid Build Coastguard Worker 
initArrayStencil(int[] arr)404*795d594fSAndroid Build Coastguard Worker   private static void initArrayStencil(int[] arr) {
405*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < arr.length; i++) {
406*795d594fSAndroid Build Coastguard Worker       arr[i] = i;
407*795d594fSAndroid Build Coastguard Worker     }
408*795d594fSAndroid Build Coastguard Worker   }
409*795d594fSAndroid Build Coastguard Worker 
testStencil1()410*795d594fSAndroid Build Coastguard Worker   static void testStencil1() {
411*795d594fSAndroid Build Coastguard Worker     int[] a = new int[100];
412*795d594fSAndroid Build Coastguard Worker     int[] b = new int[100];
413*795d594fSAndroid Build Coastguard Worker     initArrayStencil(b);
414*795d594fSAndroid Build Coastguard Worker 
415*795d594fSAndroid Build Coastguard Worker     stencil(a, b, 100);
416*795d594fSAndroid Build Coastguard Worker     for (int i = 1; i < 99; i++) {
417*795d594fSAndroid Build Coastguard Worker       int e = i + i + i;
418*795d594fSAndroid Build Coastguard Worker       expectEquals(e, a[i]);
419*795d594fSAndroid Build Coastguard Worker       expectEquals(i, b[i]);
420*795d594fSAndroid Build Coastguard Worker     }
421*795d594fSAndroid Build Coastguard Worker   }
422*795d594fSAndroid Build Coastguard Worker 
423*795d594fSAndroid Build Coastguard Worker   // Checks the disambiguation runtime test for array references.
testStencilConstSize()424*795d594fSAndroid Build Coastguard Worker   static void testStencilConstSize() {
425*795d594fSAndroid Build Coastguard Worker     int[] a = new int[STENCIL_ARRAY_SIZE];
426*795d594fSAndroid Build Coastguard Worker     int[] b = new int[STENCIL_ARRAY_SIZE];
427*795d594fSAndroid Build Coastguard Worker     initArrayStencil(b);
428*795d594fSAndroid Build Coastguard Worker 
429*795d594fSAndroid Build Coastguard Worker     for (int i = 1; i < STENCIL_ARRAY_SIZE - 1; i++) {
430*795d594fSAndroid Build Coastguard Worker     $noinline$stencilConstSize(a, b);
431*795d594fSAndroid Build Coastguard Worker       // (i - 1) + i + (i + 1) = 3 * i.
432*795d594fSAndroid Build Coastguard Worker       int e = i + i + i;
433*795d594fSAndroid Build Coastguard Worker       expectEquals(e, a[i]);
434*795d594fSAndroid Build Coastguard Worker       expectEquals(i, b[i]);
435*795d594fSAndroid Build Coastguard Worker     }
436*795d594fSAndroid Build Coastguard Worker 
437*795d594fSAndroid Build Coastguard Worker     initArrayStencil(b);
438*795d594fSAndroid Build Coastguard Worker     $noinline$stencilConstSize(b, b);
439*795d594fSAndroid Build Coastguard Worker 
440*795d594fSAndroid Build Coastguard Worker     for (int i = 1; i < STENCIL_ARRAY_SIZE - 1; i++) {
441*795d594fSAndroid Build Coastguard Worker       // The formula of the ith member of recurrent def: b[i] = b[i-1] + (i) + (i+1).
442*795d594fSAndroid Build Coastguard Worker       int e = i * (i + 2);
443*795d594fSAndroid Build Coastguard Worker       expectEquals(e, b[i]);
444*795d594fSAndroid Build Coastguard Worker     }
445*795d594fSAndroid Build Coastguard Worker   }
446*795d594fSAndroid Build Coastguard Worker 
testStencil2()447*795d594fSAndroid Build Coastguard Worker   static void testStencil2() {
448*795d594fSAndroid Build Coastguard Worker     int[] a = new int[100];
449*795d594fSAndroid Build Coastguard Worker     int[] b = new int[100];
450*795d594fSAndroid Build Coastguard Worker     initArrayStencil(b);
451*795d594fSAndroid Build Coastguard Worker 
452*795d594fSAndroid Build Coastguard Worker     stencilSubInt(a, b, 100);
453*795d594fSAndroid Build Coastguard Worker     for (int i = 1; i < 99; i++) {
454*795d594fSAndroid Build Coastguard Worker       int e = i + i + i;
455*795d594fSAndroid Build Coastguard Worker       expectEquals(e, a[i]);
456*795d594fSAndroid Build Coastguard Worker       expectEquals(i, b[i]);
457*795d594fSAndroid Build Coastguard Worker     }
458*795d594fSAndroid Build Coastguard Worker   }
459*795d594fSAndroid Build Coastguard Worker 
testStencil3()460*795d594fSAndroid Build Coastguard Worker   static void testStencil3() {
461*795d594fSAndroid Build Coastguard Worker     int[] a = new int[100];
462*795d594fSAndroid Build Coastguard Worker     int[] b = new int[100];
463*795d594fSAndroid Build Coastguard Worker     initArrayStencil(b);
464*795d594fSAndroid Build Coastguard Worker 
465*795d594fSAndroid Build Coastguard Worker     stencilAddInt(a, b, 100);
466*795d594fSAndroid Build Coastguard Worker     for (int i = 1; i < 99; i++) {
467*795d594fSAndroid Build Coastguard Worker       int e = i + i + i;
468*795d594fSAndroid Build Coastguard Worker       expectEquals(e, a[i]);
469*795d594fSAndroid Build Coastguard Worker       expectEquals(i, b[i]);
470*795d594fSAndroid Build Coastguard Worker     }
471*795d594fSAndroid Build Coastguard Worker   }
472*795d594fSAndroid Build Coastguard Worker 
testTypes()473*795d594fSAndroid Build Coastguard Worker   static void testTypes() {
474*795d594fSAndroid Build Coastguard Worker     int[] a = new int[100];
475*795d594fSAndroid Build Coastguard Worker     int[] b = new int[100];
476*795d594fSAndroid Build Coastguard Worker     long[] l = { 3 };
477*795d594fSAndroid Build Coastguard Worker     expectEquals(31, longInductionReduction(l));
478*795d594fSAndroid Build Coastguard Worker     intVectorLongInvariant(a, l);
479*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 100; i++) {
480*795d594fSAndroid Build Coastguard Worker       expectEquals(3, a[i]);
481*795d594fSAndroid Build Coastguard Worker     }
482*795d594fSAndroid Build Coastguard Worker     longCanBeDoneWithInt(b, a);
483*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 100; i++) {
484*795d594fSAndroid Build Coastguard Worker       expectEquals(4, b[i]);
485*795d594fSAndroid Build Coastguard Worker     }
486*795d594fSAndroid Build Coastguard Worker   }
487*795d594fSAndroid Build Coastguard Worker 
main(String[] args)488*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) {
489*795d594fSAndroid Build Coastguard Worker     testUnroll();
490*795d594fSAndroid Build Coastguard Worker     testStencil1();
491*795d594fSAndroid Build Coastguard Worker     testStencilConstSize();
492*795d594fSAndroid Build Coastguard Worker     testStencil2();
493*795d594fSAndroid Build Coastguard Worker     testStencil3();
494*795d594fSAndroid Build Coastguard Worker     testTypes();
495*795d594fSAndroid Build Coastguard Worker     System.out.println("passed");
496*795d594fSAndroid Build Coastguard Worker   }
497*795d594fSAndroid Build Coastguard Worker 
expectEquals(int expected, int result)498*795d594fSAndroid Build Coastguard Worker   private static void expectEquals(int expected, int result) {
499*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
500*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
501*795d594fSAndroid Build Coastguard Worker     }
502*795d594fSAndroid Build Coastguard Worker   }
503*795d594fSAndroid Build Coastguard Worker 
expectEquals(long expected, long result)504*795d594fSAndroid Build Coastguard Worker   private static void expectEquals(long expected, long result) {
505*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
506*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
507*795d594fSAndroid Build Coastguard Worker     }
508*795d594fSAndroid Build Coastguard Worker   }
509*795d594fSAndroid Build Coastguard Worker 
expectEquals(float expected, float result)510*795d594fSAndroid Build Coastguard Worker   private static void expectEquals(float expected, float result) {
511*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
512*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
513*795d594fSAndroid Build Coastguard Worker     }
514*795d594fSAndroid Build Coastguard Worker   }
515*795d594fSAndroid Build Coastguard Worker }
516