xref: /aosp_15_r20/art/test/667-checker-simd-alignment/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 
17*795d594fSAndroid Build Coastguard Worker /**
18*795d594fSAndroid Build Coastguard Worker  * Tests for zero vectorization.
19*795d594fSAndroid Build Coastguard Worker  */
20*795d594fSAndroid Build Coastguard Worker public class Main {
21*795d594fSAndroid Build Coastguard Worker 
22*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.staticallyAligned(int[]) loop_optimization (before)
23*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:l\d+>>   ParameterValue                       loop:none
24*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<One:i\d+>>   IntConstant 1                        loop:none
25*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>   Phi [<<One>>,<<AddI:i\d+>>]          loop:<<Loop:B\d+>> outer_loop:none
26*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:i\d+>>   ArrayGet [<<Par>>,<<Phi>>]           loop:<<Loop>>      outer_loop:none
27*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>   Add [<<Get>>,<<One>>]                loop:<<Loop>>      outer_loop:none
28*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                ArraySet [<<Par>>,<<Phi>>,<<Add>>]   loop:<<Loop>>      outer_loop:none
29*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI>>       Add [<<Phi>>,<<One>>]                loop:<<Loop>>      outer_loop:none
30*795d594fSAndroid Build Coastguard Worker   //
31*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM: void Main.staticallyAligned(int[]) loop_optimization (after)
32*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:l\d+>>   ParameterValue                       loop:none
33*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Zero:i\d+>>  IntConstant 0                        loop:none
34*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<One:i\d+>>   IntConstant 1                        loop:none
35*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Vl:i\d+>>    IntConstant 2                        loop:none
36*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Repl:d\d+>>  VecReplicateScalar [<<One>>]         loop:none
37*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>   Phi [<<Zero>>,<<AddI:i\d+>>]                            loop:<<Loop:B\d+>> outer_loop:none
38*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Nrm:i\d+>>   Add [<<Phi>>,<<One>>]                                   loop:<<Loop>>      outer_loop:none
39*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Load:d\d+>>  VecLoad [<<Par>>,<<Nrm>>]          alignment:ALIGN(8,0) loop:<<Loop>>      outer_loop:none
40*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:d\d+>>   VecAdd [<<Load>>,<<Repl>>]                              loop:<<Loop>>      outer_loop:none
41*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                VecStore [<<Par>>,<<Nrm>>,<<Add>>] alignment:ALIGN(8,0) loop:<<Loop>>      outer_loop:none
42*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI>>       Add [<<Phi>>,<<Vl>>]                                    loop:<<Loop>>      outer_loop:none
43*795d594fSAndroid Build Coastguard Worker   //
44*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                ArrayGet
45*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                ArraySet
staticallyAligned(int[] a)46*795d594fSAndroid Build Coastguard Worker   static void staticallyAligned(int[] a) {
47*795d594fSAndroid Build Coastguard Worker     // Starts at offset 12 (hidden) + 1 * 4 relative to base alignment.
48*795d594fSAndroid Build Coastguard Worker     // So no peeling, aligned vector, no cleanup.
49*795d594fSAndroid Build Coastguard Worker     for (int i = 1; i < 9; i++) {
50*795d594fSAndroid Build Coastguard Worker       a[i] += 1;
51*795d594fSAndroid Build Coastguard Worker     }
52*795d594fSAndroid Build Coastguard Worker   }
53*795d594fSAndroid Build Coastguard Worker 
54*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.staticallyAlignedN(int[]) loop_optimization (before)
55*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<One:i\d+>>   IntConstant 1                        loop:none
56*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:l\d+>>   NullCheck                            loop:none
57*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>   Phi [<<One>>,<<AddI:i\d+>>]          loop:<<Loop:B\d+>> outer_loop:none
58*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:i\d+>>   ArrayGet [<<Par>>,<<Phi>>]           loop:<<Loop>>      outer_loop:none
59*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>   Add [<<Get>>,<<One>>]                loop:<<Loop>>      outer_loop:none
60*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                ArraySet [<<Par>>,<<Phi>>,<<Add>>]   loop:<<Loop>>      outer_loop:none
61*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI>>       Add [<<Phi>>,<<One>>]                loop:<<Loop>>      outer_loop:none
62*795d594fSAndroid Build Coastguard Worker   //
63*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM: void Main.staticallyAlignedN(int[]) loop_optimization (after)
64*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Zero:i\d+>>  IntConstant 0                        loop:none
65*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<One:i\d+>>   IntConstant 1                        loop:none
66*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Vl:i\d+>>    IntConstant 2                        loop:none
67*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:l\d+>>   NullCheck                            loop:none
68*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Repl:d\d+>>  VecReplicateScalar [<<One>>]         loop:none
69*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>   Phi [<<Zero>>,<<AddI:i\d+>>]                            loop:<<Loop:B\d+>> outer_loop:none
70*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Nrm:i\d+>>   Add [<<Phi>>,<<One>>]                                   loop:<<Loop>>      outer_loop:none
71*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Load:d\d+>>  VecLoad [<<Par>>,<<Nrm>>]          alignment:ALIGN(8,0) loop:<<Loop>>      outer_loop:none
72*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:d\d+>>   VecAdd [<<Load>>,<<Repl>>]                              loop:<<Loop>>      outer_loop:none
73*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                VecStore [<<Par>>,<<Nrm>>,<<Add>>] alignment:ALIGN(8,0) loop:<<Loop>>      outer_loop:none
74*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI>>       Add [<<Phi>>,<<Vl>>]                                    loop:<<Loop>>      outer_loop:none
75*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiC:i\d+>>  Phi [<<Phi>>,<<AddIC:i\d+>>]         loop:<<Clean:B\d+>> outer_loop:none
76*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<NrmC:i\d+>>  Add [<<PhiC>>,<<One>>]               loop:<<Clean>>      outer_loop:none
77*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:i\d+>>   ArrayGet [<<Par>>,<<NrmC>>]          loop:<<Clean>>      outer_loop:none
78*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddC:i\d+>>  Add [<<Get>>,<<One>>]                loop:<<Clean>>      outer_loop:none
79*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                ArraySet [<<Par>>,<<NrmC>>,<<AddC>>] loop:<<Clean>>      outer_loop:none
80*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddIC>>      Add [<<PhiC>>,<<One>>]               loop:<<Clean>>      outer_loop:none
staticallyAlignedN(int[] a)81*795d594fSAndroid Build Coastguard Worker   static void staticallyAlignedN(int[] a) {
82*795d594fSAndroid Build Coastguard Worker     // Starts at offset 12 (hidden) + 1 * 4 relative to base alignment.
83*795d594fSAndroid Build Coastguard Worker     // So no peeling, aligned vector, cleanup.
84*795d594fSAndroid Build Coastguard Worker     for (int i = 1; i < a.length; i++) {
85*795d594fSAndroid Build Coastguard Worker       a[i] += 1;
86*795d594fSAndroid Build Coastguard Worker     }
87*795d594fSAndroid Build Coastguard Worker   }
88*795d594fSAndroid Build Coastguard Worker 
89*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.staticallyMisaligned(int[]) loop_optimization (before)
90*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:l\d+>>   ParameterValue                       loop:none
91*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Zero:i\d+>>  IntConstant 0                        loop:none
92*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<One:i\d+>>   IntConstant 1                        loop:none
93*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>   Phi [<<Zero>>,<<AddI:i\d+>>]         loop:<<Loop:B\d+>> outer_loop:none
94*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:i\d+>>   ArrayGet [<<Par>>,<<Phi>>]           loop:<<Loop>>      outer_loop:none
95*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>   Add [<<Get>>,<<One>>]                loop:<<Loop>>      outer_loop:none
96*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                ArraySet [<<Par>>,<<Phi>>,<<Add>>]   loop:<<Loop>>      outer_loop:none
97*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI>>       Add [<<Phi>>,<<One>>]                loop:<<Loop>>      outer_loop:none
98*795d594fSAndroid Build Coastguard Worker   //
99*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM: void Main.staticallyMisaligned(int[]) loop_optimization (after)
100*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:l\d+>>   ParameterValue                       loop:none
101*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Zero:i\d+>>  IntConstant 0                        loop:none
102*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<One:i\d+>>   IntConstant 1                        loop:none
103*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Vl:i\d+>>    IntConstant 2                        loop:none
104*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiP:i\d+>>  Phi [<<Zero>>,<<AddIP:i\d+>>]        loop:<<Peel:B\d+>> outer_loop:none
105*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:i\d+>>   ArrayGet [<<Par>>,<<PhiP>>]          loop:<<Peel>>      outer_loop:none
106*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddP:i\d+>>  Add [<<Get>>,<<One>>]                loop:<<Peel>>      outer_loop:none
107*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                ArraySet [<<Par>>,<<PhiP>>,<<AddP>>] loop:<<Peel>>      outer_loop:none
108*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddIP>>      Add [<<PhiP>>,<<One>>]               loop:<<Peel>>      outer_loop:none
109*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Repl:d\d+>>  VecReplicateScalar [<<One>>]         loop:none
110*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>   Phi [<<PhiP>>,<<AddI:i\d+>>]                            loop:<<Loop:B\d+>> outer_loop:none
111*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Load:d\d+>>  VecLoad [<<Par>>,<<Phi>>]          alignment:ALIGN(8,0) loop:<<Loop>>      outer_loop:none
112*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:d\d+>>   VecAdd [<<Load>>,<<Repl>>]                              loop:<<Loop>>      outer_loop:none
113*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                VecStore [<<Par>>,<<Phi>>,<<Add>>] alignment:ALIGN(8,0) loop:<<Loop>>      outer_loop:none
114*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI>>       Add [<<Phi>>,<<Vl>>]                                    loop:<<Loop>>      outer_loop:none
115*795d594fSAndroid Build Coastguard Worker   //
116*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                ArrayGet
117*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                ArraySet
staticallyMisaligned(int[] a)118*795d594fSAndroid Build Coastguard Worker   static void staticallyMisaligned(int[] a) {
119*795d594fSAndroid Build Coastguard Worker     // Starts at offset 12 (hidden) + 0 * 4 relative to base alignment.
120*795d594fSAndroid Build Coastguard Worker     // Yes, Art runtime misaligns the most common access pattern :-(
121*795d594fSAndroid Build Coastguard Worker     // Static peeling to the rescue, aligned vector, no cleanup.
122*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 9; i++) {
123*795d594fSAndroid Build Coastguard Worker       a[i] += 1;
124*795d594fSAndroid Build Coastguard Worker     }
125*795d594fSAndroid Build Coastguard Worker   }
126*795d594fSAndroid Build Coastguard Worker 
127*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.staticallyMisalignedN(int[]) loop_optimization (before)
128*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Zero:i\d+>>  IntConstant 0                       loop:none
129*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<One:i\d+>>   IntConstant 1                       loop:none
130*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:l\d+>>   NullCheck                           loop:none
131*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>   Phi [<<Zero>>,<<AddI:i\d+>>]        loop:<<Loop:B\d+>> outer_loop:none
132*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:i\d+>>   ArrayGet [<<Par>>,<<Phi>>]          loop:<<Loop>>      outer_loop:none
133*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>   Add [<<Get>>,<<One>>]               loop:<<Loop>>      outer_loop:none
134*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                ArraySet [<<Par>>,<<Phi>>,<<Add>>]  loop:<<Loop>>      outer_loop:none
135*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI>>       Add [<<Phi>>,<<One>>]               loop:<<Loop>>      outer_loop:none
136*795d594fSAndroid Build Coastguard Worker   //
137*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM: void Main.staticallyMisalignedN(int[]) loop_optimization (after)
138*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Zero:i\d+>>  IntConstant 0                        loop:none
139*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<One:i\d+>>   IntConstant 1                        loop:none
140*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Vl:i\d+>>    IntConstant 2                        loop:none
141*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:l\d+>>   NullCheck                            loop:none
142*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiP:i\d+>>  Phi [<<Zero>>,<<AddIP:i\d+>>]        loop:<<Peel:B\d+>> outer_loop:none
143*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<GetP:i\d+>>  ArrayGet [<<Par>>,<<PhiP>>]          loop:<<Peel>>      outer_loop:none
144*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddP:i\d+>>  Add [<<GetP>>,<<One>>]               loop:<<Peel>>      outer_loop:none
145*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                ArraySet [<<Par>>,<<PhiP>>,<<AddP>>] loop:<<Peel>>      outer_loop:none
146*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddIP>>      Add [<<PhiP>>,<<One>>]               loop:<<Peel>>      outer_loop:none
147*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Repl:d\d+>>  VecReplicateScalar [<<One>>]         loop:none
148*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>   Phi [<<PhiP>>,<<AddI:i\d+>>]                            loop:<<Loop:B\d+>> outer_loop:none
149*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Load:d\d+>>  VecLoad [<<Par>>,<<Phi>>]          alignment:ALIGN(8,0) loop:<<Loop>>      outer_loop:none
150*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:d\d+>>   VecAdd [<<Load>>,<<Repl>>]                              loop:<<Loop>>      outer_loop:none
151*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                VecStore [<<Par>>,<<Phi>>,<<Add>>] alignment:ALIGN(8,0) loop:<<Loop>>      outer_loop:none
152*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI>>       Add [<<Phi>>,<<Vl>>]                                    loop:<<Loop>>      outer_loop:none
153*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiC:i\d+>>  Phi [<<Phi>>,<<AddIC:i\d+>>]         loop:<<Clean:B\d+>> outer_loop:none
154*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<GetC:i\d+>>  ArrayGet [<<Par>>,<<PhiC>>]          loop:<<Clean>>      outer_loop:none
155*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddC:i\d+>>  Add [<<GetC>>,<<One>>]               loop:<<Clean>>      outer_loop:none
156*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                ArraySet [<<Par>>,<<PhiC>>,<<AddC>>] loop:<<Clean>>      outer_loop:none
157*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddIC>>      Add [<<PhiC>>,<<One>>]               loop:<<Clean>>      outer_loop:none
staticallyMisalignedN(int[] a)158*795d594fSAndroid Build Coastguard Worker   static void staticallyMisalignedN(int[] a) {
159*795d594fSAndroid Build Coastguard Worker     // Starts at offset 12 (hidden) + 0 * 4 relative to base alignment.
160*795d594fSAndroid Build Coastguard Worker     // Yes, Art runtime misaligns the most common access pattern :-(
161*795d594fSAndroid Build Coastguard Worker     // Static peeling to the rescue, aligned vector, cleanup.
162*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < a.length; i++) {
163*795d594fSAndroid Build Coastguard Worker       a[i] += 1;
164*795d594fSAndroid Build Coastguard Worker     }
165*795d594fSAndroid Build Coastguard Worker   }
166*795d594fSAndroid Build Coastguard Worker 
167*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.staticallyUnknownAligned(int[], int) loop_optimization (before)
168*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:l\d+>>   ParameterValue                       loop:none
169*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Off:i\d+>>   ParameterValue                       loop:none
170*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Zero:i\d+>>  IntConstant 0                        loop:none
171*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<One:i\d+>>   IntConstant 1                        loop:none
172*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>   Phi [<<Zero>>,<<AddI:i\d+>>]         loop:<<Loop:B\d+>> outer_loop:none
173*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Nrm:i\d+>>   Add [<<Off>>,<<Phi>>]                loop:<<Loop>>      outer_loop:none
174*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:i\d+>>   ArrayGet [<<Par>>,<<Nrm>>]           loop:<<Loop>>      outer_loop:none
175*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>   Add [<<Get>>,<<One>>]                loop:<<Loop>>      outer_loop:none
176*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                ArraySet [<<Par>>,<<Nrm>>,<<Add>>]   loop:<<Loop>>      outer_loop:none
177*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI>>       Add [<<Phi>>,<<One>>]                loop:<<Loop>>      outer_loop:none
178*795d594fSAndroid Build Coastguard Worker   //
179*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM: void Main.staticallyUnknownAligned(int[], int) loop_optimization (after)
180*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:l\d+>>   ParameterValue                       loop:none
181*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Off:i\d+>>   ParameterValue                       loop:none
182*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Zero:i\d+>>  IntConstant 0                        loop:none
183*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<One:i\d+>>   IntConstant 1                        loop:none
184*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Vl:i\d+>>    IntConstant 2                        loop:none
185*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiP:i\d+>>  Phi [<<Zero>>,<<AddIP:i\d+>>]        loop:<<Peel:B\d+>> outer_loop:none
186*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<NrmP:i\d+>>  Add [<<PhiP>>,<<Off>>]               loop:<<Peel>>      outer_loop:none
187*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:i\d+>>   ArrayGet [<<Par>>,<<NrmP>>]          loop:<<Peel>>      outer_loop:none
188*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddP:i\d+>>  Add [<<Get>>,<<One>>]                loop:<<Peel>>      outer_loop:none
189*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                ArraySet [<<Par>>,<<NrmP>>,<<AddP>>] loop:<<Peel>>      outer_loop:none
190*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddIP>>      Add [<<PhiP>>,<<One>>]               loop:<<Peel>>      outer_loop:none
191*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Repl:d\d+>>  VecReplicateScalar [<<One>>]         loop:none
192*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>   Phi [<<PhiP>>,<<AddI:i\d+>>]                            loop:<<Loop:B\d+>> outer_loop:none
193*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Nrm:i\d+>>   Add [<<Phi>>,<<Off>>]                                   loop:<<Loop>>      outer_loop:none
194*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Load:d\d+>>  VecLoad [<<Par>>,<<Nrm>>]          alignment:ALIGN(8,0) loop:<<Loop>>      outer_loop:none
195*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:d\d+>>   VecAdd [<<Load>>,<<Repl>>]                              loop:<<Loop>>      outer_loop:none
196*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                VecStore [<<Par>>,<<Nrm>>,<<Add>>] alignment:ALIGN(8,0) loop:<<Loop>>      outer_loop:none
197*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI>>       Add [<<Phi>>,<<Vl>>]                                    loop:<<Loop>>      outer_loop:none
198*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiC:i\d+>>  Phi [<<Phi>>,<<AddIC:i\d+>>]         loop:<<Clean:B\d+>> outer_loop:none
199*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<NrmC:i\d+>>  Add [<<PhiC>>,<<Off>>]               loop:<<Clean>>      outer_loop:none
200*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<GetC:i\d+>>  ArrayGet [<<Par>>,<<NrmC>>]          loop:<<Clean>>      outer_loop:none
201*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddC:i\d+>>  Add [<<GetC>>,<<One>>]               loop:<<Clean>>      outer_loop:none
202*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                ArraySet [<<Par>>,<<NrmC>>,<<AddC>>] loop:<<Clean>>      outer_loop:none
203*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddIC>>      Add [<<PhiC>>,<<One>>]               loop:<<Clean>>      outer_loop:none
staticallyUnknownAligned(int[] a, int off)204*795d594fSAndroid Build Coastguard Worker   static void staticallyUnknownAligned(int[] a, int off) {
205*795d594fSAndroid Build Coastguard Worker     // Starts at an unknown offset due to parameter off.
206*795d594fSAndroid Build Coastguard Worker     // Dynamic peeling to the rescue, aligned vector, cleanup.
207*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 9; i++) {
208*795d594fSAndroid Build Coastguard Worker       a[off + i] += 1;
209*795d594fSAndroid Build Coastguard Worker     }
210*795d594fSAndroid Build Coastguard Worker   }
211*795d594fSAndroid Build Coastguard Worker 
212*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.staticallyUnknownAlignedN(int[], int, int) loop_optimization (before)
213*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:l\d+>>   ParameterValue                       loop:none
214*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Off:i\d+>>   ParameterValue                       loop:none
215*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Zero:i\d+>>  IntConstant 0                        loop:none
216*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<One:i\d+>>   IntConstant 1                        loop:none
217*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>   Phi [<<Zero>>,<<AddI:i\d+>>]         loop:<<Loop:B\d+>> outer_loop:none
218*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Nrm:i\d+>>   Add [<<Off>>,<<Phi>>]                loop:<<Loop>>      outer_loop:none
219*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:i\d+>>   ArrayGet [<<Par>>,<<Nrm>>]           loop:<<Loop>>      outer_loop:none
220*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>   Add [<<Get>>,<<One>>]                loop:<<Loop>>      outer_loop:none
221*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                ArraySet [<<Par>>,<<Nrm>>,<<Add>>]   loop:<<Loop>>      outer_loop:none
222*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI>>       Add [<<Phi>>,<<One>>]                loop:<<Loop>>      outer_loop:none
223*795d594fSAndroid Build Coastguard Worker   //
224*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM: void Main.staticallyUnknownAlignedN(int[], int, int) loop_optimization (after)
225*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:l\d+>>   ParameterValue                       loop:none
226*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Off:i\d+>>   ParameterValue                       loop:none
227*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Zero:i\d+>>  IntConstant 0                        loop:none
228*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<One:i\d+>>   IntConstant 1                        loop:none
229*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Vl:i\d+>>    IntConstant 2                        loop:none
230*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiP:i\d+>>  Phi [<<Zero>>,<<AddIP:i\d+>>]        loop:<<Peel:B\d+>> outer_loop:none
231*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<NrmP:i\d+>>  Add [<<PhiP>>,<<Off>>]               loop:<<Peel>>      outer_loop:none
232*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:i\d+>>   ArrayGet [<<Par>>,<<NrmP>>]          loop:<<Peel>>      outer_loop:none
233*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddP:i\d+>>  Add [<<Get>>,<<One>>]                loop:<<Peel>>      outer_loop:none
234*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                ArraySet [<<Par>>,<<NrmP>>,<<AddP>>] loop:<<Peel>>      outer_loop:none
235*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddIP>>      Add [<<PhiP>>,<<One>>]               loop:<<Peel>>      outer_loop:none
236*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Repl:d\d+>>  VecReplicateScalar [<<One>>]         loop:none
237*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>   Phi [<<PhiP>>,<<AddI:i\d+>>]                            loop:<<Loop:B\d+>> outer_loop:none
238*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Nrm:i\d+>>   Add [<<Phi>>,<<Off>>]                                   loop:<<Loop>>      outer_loop:none
239*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Load:d\d+>>  VecLoad [<<Par>>,<<Nrm>>]          alignment:ALIGN(8,0) loop:<<Loop>>      outer_loop:none
240*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:d\d+>>   VecAdd [<<Load>>,<<Repl>>]                              loop:<<Loop>>      outer_loop:none
241*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                VecStore [<<Par>>,<<Nrm>>,<<Add>>] alignment:ALIGN(8,0) loop:<<Loop>>      outer_loop:none
242*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI>>       Add [<<Phi>>,<<Vl>>]                                    loop:<<Loop>>      outer_loop:none
243*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiC:i\d+>>  Phi [<<Phi>>,<<AddIC:i\d+>>]         loop:<<Clean:B\d+>> outer_loop:none
244*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<NrmC:i\d+>>  Add [<<PhiC>>,<<Off>>]               loop:<<Clean>>      outer_loop:none
245*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<GetC:i\d+>>  ArrayGet [<<Par>>,<<NrmC>>]          loop:<<Clean>>      outer_loop:none
246*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddC:i\d+>>  Add [<<GetC>>,<<One>>]               loop:<<Clean>>      outer_loop:none
247*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                ArraySet [<<Par>>,<<NrmC>>,<<AddC>>] loop:<<Clean>>      outer_loop:none
248*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddIC>>      Add [<<PhiC>>,<<One>>]               loop:<<Clean>>      outer_loop:none
staticallyUnknownAlignedN(int[] a, int off, int n)249*795d594fSAndroid Build Coastguard Worker   static void staticallyUnknownAlignedN(int[] a, int off, int n) {
250*795d594fSAndroid Build Coastguard Worker     // Starts at an unknown offset due to parameter off.
251*795d594fSAndroid Build Coastguard Worker     // Dynamic peeling to the rescue, aligned vector, cleanup.
252*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; i++) {
253*795d594fSAndroid Build Coastguard Worker       a[off + i] += 1;
254*795d594fSAndroid Build Coastguard Worker     }
255*795d594fSAndroid Build Coastguard Worker   }
256*795d594fSAndroid Build Coastguard Worker 
257*795d594fSAndroid Build Coastguard Worker   //
258*795d594fSAndroid Build Coastguard Worker   // Test drivers.
259*795d594fSAndroid Build Coastguard Worker   //
260*795d594fSAndroid Build Coastguard Worker 
test1()261*795d594fSAndroid Build Coastguard Worker   private static void test1() {
262*795d594fSAndroid Build Coastguard Worker     int[] a = new int[9];
263*795d594fSAndroid Build Coastguard Worker     staticallyAligned(a);
264*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < a.length; i++) {
265*795d594fSAndroid Build Coastguard Worker       int e = i > 0 ? 1 : 0;
266*795d594fSAndroid Build Coastguard Worker       expectEquals(e, a[i]);
267*795d594fSAndroid Build Coastguard Worker     }
268*795d594fSAndroid Build Coastguard Worker   }
269*795d594fSAndroid Build Coastguard Worker 
test2()270*795d594fSAndroid Build Coastguard Worker   private static void test2() {
271*795d594fSAndroid Build Coastguard Worker     for (int n = 0; n <= 71; n++) {
272*795d594fSAndroid Build Coastguard Worker       int[] a = new int[n];
273*795d594fSAndroid Build Coastguard Worker       staticallyAlignedN(a);
274*795d594fSAndroid Build Coastguard Worker       for (int i = 0; i < a.length; i++) {
275*795d594fSAndroid Build Coastguard Worker         int e = i > 0 ? 1 : 0;
276*795d594fSAndroid Build Coastguard Worker         expectEquals(e, a[i]);
277*795d594fSAndroid Build Coastguard Worker       }
278*795d594fSAndroid Build Coastguard Worker     }
279*795d594fSAndroid Build Coastguard Worker   }
280*795d594fSAndroid Build Coastguard Worker 
test3()281*795d594fSAndroid Build Coastguard Worker   private static void test3() {
282*795d594fSAndroid Build Coastguard Worker     int[] a = new int[9];
283*795d594fSAndroid Build Coastguard Worker     staticallyMisaligned(a);
284*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < a.length; i++) {
285*795d594fSAndroid Build Coastguard Worker       expectEquals(1, a[i]);
286*795d594fSAndroid Build Coastguard Worker     }
287*795d594fSAndroid Build Coastguard Worker   }
288*795d594fSAndroid Build Coastguard Worker 
test4()289*795d594fSAndroid Build Coastguard Worker   private static void test4() {
290*795d594fSAndroid Build Coastguard Worker     for (int n = 0; n <= 71; n++) {
291*795d594fSAndroid Build Coastguard Worker       int[] a = new int[n];
292*795d594fSAndroid Build Coastguard Worker       staticallyMisalignedN(a);
293*795d594fSAndroid Build Coastguard Worker       for (int i = 0; i < a.length; i++) {
294*795d594fSAndroid Build Coastguard Worker         expectEquals(1, a[i]);
295*795d594fSAndroid Build Coastguard Worker       }
296*795d594fSAndroid Build Coastguard Worker     }
297*795d594fSAndroid Build Coastguard Worker   }
298*795d594fSAndroid Build Coastguard Worker 
test5()299*795d594fSAndroid Build Coastguard Worker   private static void test5() {
300*795d594fSAndroid Build Coastguard Worker     for (int off = 0; off <= 8; off++) {
301*795d594fSAndroid Build Coastguard Worker       int[] a = new int[17];
302*795d594fSAndroid Build Coastguard Worker       staticallyUnknownAligned(a, off);
303*795d594fSAndroid Build Coastguard Worker       for (int i = 0; i < a.length; i++) {
304*795d594fSAndroid Build Coastguard Worker         int e = (off <= i && i < off + 9) ? 1 : 0;
305*795d594fSAndroid Build Coastguard Worker         expectEquals(e, a[i]);
306*795d594fSAndroid Build Coastguard Worker       }
307*795d594fSAndroid Build Coastguard Worker     }
308*795d594fSAndroid Build Coastguard Worker   }
309*795d594fSAndroid Build Coastguard Worker 
test6()310*795d594fSAndroid Build Coastguard Worker   private static void test6() {
311*795d594fSAndroid Build Coastguard Worker     for (int off = 0; off <= 8; off++) {
312*795d594fSAndroid Build Coastguard Worker       for (int n = 0; n <= 9; n++) {
313*795d594fSAndroid Build Coastguard Worker         int[] a = new int[17];
314*795d594fSAndroid Build Coastguard Worker         staticallyUnknownAlignedN(a, off, n);
315*795d594fSAndroid Build Coastguard Worker         for (int i = 0; i < a.length; i++) {
316*795d594fSAndroid Build Coastguard Worker           int e = (off <= i && i < off + n) ? 1 : 0;
317*795d594fSAndroid Build Coastguard Worker           expectEquals(e, a[i]);
318*795d594fSAndroid Build Coastguard Worker         }
319*795d594fSAndroid Build Coastguard Worker       }
320*795d594fSAndroid Build Coastguard Worker     }
321*795d594fSAndroid Build Coastguard Worker   }
322*795d594fSAndroid Build Coastguard Worker 
main(String[] args)323*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) {
324*795d594fSAndroid Build Coastguard Worker     test1();
325*795d594fSAndroid Build Coastguard Worker     test2();
326*795d594fSAndroid Build Coastguard Worker     test4();
327*795d594fSAndroid Build Coastguard Worker     test5();
328*795d594fSAndroid Build Coastguard Worker     test6();
329*795d594fSAndroid Build Coastguard Worker     System.out.println("passed");
330*795d594fSAndroid Build Coastguard Worker   }
331*795d594fSAndroid Build Coastguard Worker 
expectEquals(int expected, int result)332*795d594fSAndroid Build Coastguard Worker   private static void expectEquals(int expected, int result) {
333*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
334*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
335*795d594fSAndroid Build Coastguard Worker     }
336*795d594fSAndroid Build Coastguard Worker   }
337*795d594fSAndroid Build Coastguard Worker }
338