xref: /aosp_15_r20/art/test/661-checker-simd-reduc/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 simple integral reductions: same type for accumulator and data.
19*795d594fSAndroid Build Coastguard Worker  */
20*795d594fSAndroid Build Coastguard Worker public class Main {
21*795d594fSAndroid Build Coastguard Worker 
22*795d594fSAndroid Build Coastguard Worker   static final int N = 500;
23*795d594fSAndroid Build Coastguard Worker   static final int M = 100;
24*795d594fSAndroid Build Coastguard Worker 
25*795d594fSAndroid Build Coastguard Worker   //
26*795d594fSAndroid Build Coastguard Worker   // Basic reductions in loops.
27*795d594fSAndroid Build Coastguard Worker   //
28*795d594fSAndroid Build Coastguard Worker 
29*795d594fSAndroid Build Coastguard Worker   // TODO: vectorize these (second step of b/64091002 plan)
30*795d594fSAndroid Build Coastguard Worker 
reductionByte(byte[] x)31*795d594fSAndroid Build Coastguard Worker   private static byte reductionByte(byte[] x) {
32*795d594fSAndroid Build Coastguard Worker     byte sum = 0;
33*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < x.length; i++) {
34*795d594fSAndroid Build Coastguard Worker       sum += x[i];
35*795d594fSAndroid Build Coastguard Worker     }
36*795d594fSAndroid Build Coastguard Worker     return sum;
37*795d594fSAndroid Build Coastguard Worker   }
38*795d594fSAndroid Build Coastguard Worker 
reductionShort(short[] x)39*795d594fSAndroid Build Coastguard Worker   private static short reductionShort(short[] x) {
40*795d594fSAndroid Build Coastguard Worker     short sum = 0;
41*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < x.length; i++) {
42*795d594fSAndroid Build Coastguard Worker       sum += x[i];
43*795d594fSAndroid Build Coastguard Worker     }
44*795d594fSAndroid Build Coastguard Worker     return sum;
45*795d594fSAndroid Build Coastguard Worker   }
46*795d594fSAndroid Build Coastguard Worker 
reductionChar(char[] x)47*795d594fSAndroid Build Coastguard Worker   private static char reductionChar(char[] x) {
48*795d594fSAndroid Build Coastguard Worker     char sum = 0;
49*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < x.length; i++) {
50*795d594fSAndroid Build Coastguard Worker       sum += x[i];
51*795d594fSAndroid Build Coastguard Worker     }
52*795d594fSAndroid Build Coastguard Worker     return sum;
53*795d594fSAndroid Build Coastguard Worker   }
54*795d594fSAndroid Build Coastguard Worker 
55*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.reductionInt(int[]) loop_optimization (before)
56*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                 loop:none
57*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                 loop:none
58*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]      loop:<<Loop:B\d+>> outer_loop:none
59*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]      loop:<<Loop>>      outer_loop:none
60*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:i\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]  loop:<<Loop>>      outer_loop:none
61*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Get>>]        loop:<<Loop>>      outer_loop:none
62*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]      loop:<<Loop>>      outer_loop:none
63*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Phi2>>]             loop:none
64*795d594fSAndroid Build Coastguard Worker   //
65*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM: int Main.reductionInt(int[]) loop_optimization (after)
66*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons:i\d+>>   IntConstant 2                 loop:none
67*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Set:d\d+>>    VecSetScalars [{{i\d+}}]      loop:none
68*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:d\d+>>    Phi [<<Set>>,{{d\d+}}]        loop:<<Loop:B\d+>> outer_loop:none
69*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop>>      outer_loop:none
70*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 VecAdd [<<Phi>>,<<Load>>]     loop:<<Loop>>      outer_loop:none
71*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<I>>,<<Cons>>]          loop:<<Loop>>      outer_loop:none
72*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Red:d\d+>>    VecReduce [<<Phi>>]           loop:none
73*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Extr:i\d+>>   VecExtractScalar [<<Red>>]    loop:none
74*795d594fSAndroid Build Coastguard Worker 
75*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int Main.reductionInt(int[]) loop_optimization (after)
76*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
77*795d594fSAndroid Build Coastguard Worker   //
78*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<TrueC:i\d+>>     IntConstant 1                            loop:none
79*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>       VecSetScalars [{{i\d+}},{{j\d+}}]        loop:none
80*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:d\d+>>       Phi [<<Set>>,{{d\d+}}]                   loop:<<Loop:B\d+>> outer_loop:none
81*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>>     VecPredWhile                             loop:<<Loop>>      outer_loop:none
82*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>      VecLoad [{{l\d+}},<<I:i\d+>>,<<LoopP>>]  loop:<<Loop>>      outer_loop:none
83*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                    VecAdd [<<Phi>>,<<Load>>,<<LoopP>>]      loop:<<Loop>>      outer_loop:none
84*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                    Add [<<I>>,{{i\d+}}]                     loop:<<Loop>>      outer_loop:none
85*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<PostLoopP:j\d+>> VecPredSetAll [<<TrueC>>]                loop:none
86*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Red:d\d+>>       VecReduce [<<Phi>>,<<PostLoopP>>]        loop:none
87*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Extr:i\d+>>      VecExtractScalar [<<Red>>,{{j\d+}}]      loop:none
88*795d594fSAndroid Build Coastguard Worker   //
89*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
90*795d594fSAndroid Build Coastguard Worker   //
91*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cons:i\d+>>      IntConstant 4                            loop:none
92*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>       VecSetScalars [{{i\d+}}]                 loop:none
93*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:d\d+>>       Phi [<<Set>>,{{d\d+}}]                   loop:<<Loop:B\d+>> outer_loop:none
94*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>      VecLoad [{{l\d+}},<<I:i\d+>>]            loop:<<Loop>>      outer_loop:none
95*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                    VecAdd [<<Phi>>,<<Load>>]                loop:<<Loop>>      outer_loop:none
96*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                    Add [<<I>>,<<Cons>>]                     loop:<<Loop>>      outer_loop:none
97*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Red:d\d+>>       VecReduce [<<Phi>>]                      loop:none
98*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Extr:i\d+>>      VecExtractScalar [<<Red>>]               loop:none
99*795d594fSAndroid Build Coastguard Worker   //
100*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
101*795d594fSAndroid Build Coastguard Worker   //
102*795d594fSAndroid Build Coastguard Worker   //  Check that full 128-bit Q-Register are saved across SuspendCheck slow path.
103*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int Main.reductionInt(int[]) disassembly (after)
104*795d594fSAndroid Build Coastguard Worker   /// CHECK:                            SuspendCheckSlowPathARM64
105*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
106*795d594fSAndroid Build Coastguard Worker   //
107*795d594fSAndroid Build Coastguard Worker   ///     CHECK:                                str z<<RegNo:\d+>>,
108*795d594fSAndroid Build Coastguard Worker   ///     CHECK:                                ldr z<<RegNo>>,
109*795d594fSAndroid Build Coastguard Worker   //
110*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
111*795d594fSAndroid Build Coastguard Worker   //
112*795d594fSAndroid Build Coastguard Worker   ///     CHECK:                                stur q<<RegNo:\d+>>, [sp, #<<Offset:\d+>>]
113*795d594fSAndroid Build Coastguard Worker   ///     CHECK:                                ldur q<<RegNo>>, [sp, #<<Offset>>]
114*795d594fSAndroid Build Coastguard Worker   //
115*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
reductionInt(int[] x)116*795d594fSAndroid Build Coastguard Worker   private static int reductionInt(int[] x) {
117*795d594fSAndroid Build Coastguard Worker     int sum = 0;
118*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < x.length; i++) {
119*795d594fSAndroid Build Coastguard Worker       sum += x[i];
120*795d594fSAndroid Build Coastguard Worker     }
121*795d594fSAndroid Build Coastguard Worker     return sum;
122*795d594fSAndroid Build Coastguard Worker   }
123*795d594fSAndroid Build Coastguard Worker 
124*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.reductionIntChain() loop_optimization (before)
125*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                 loop:none
126*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                 loop:none
127*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons1>>,{{i\d+}}]      loop:<<Loop1:B\d+>> outer_loop:none
128*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]      loop:<<Loop1>>      outer_loop:none
129*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:i\d+>>   ArrayGet [{{l\d+}},<<Phi2>>]  loop:<<Loop1>>      outer_loop:none
130*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Get1>>]       loop:<<Loop1>>      outer_loop:none
131*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Cons1>>]      loop:<<Loop1>>      outer_loop:none
132*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi3:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]      loop:<<Loop2:B\d+>> outer_loop:none
133*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi4:i\d+>>   Phi [<<Phi1>>,{{i\d+}}]       loop:<<Loop2>>      outer_loop:none
134*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get2:i\d+>>   ArrayGet [{{l\d+}},<<Phi3>>]  loop:<<Loop2>>      outer_loop:none
135*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi4>>,<<Get2>>]       loop:<<Loop2>>      outer_loop:none
136*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi3>>,<<Cons1>>]      loop:<<Loop2>>      outer_loop:none
137*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Phi4>>]             loop:none
138*795d594fSAndroid Build Coastguard Worker   //
139*795d594fSAndroid Build Coastguard Worker   /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>"
140*795d594fSAndroid Build Coastguard Worker   //
141*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM: int Main.reductionIntChain() loop_optimization (after)
142*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Set1:d\d+>>   VecSetScalars [{{i\d+}}]       loop:none
143*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:d\d+>>   Phi [<<Set1>>,{{d\d+}}]        loop:<<Loop1:B\d+>> outer_loop:none
144*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Load1:d\d+>>  VecLoad [{{l\d+}},<<I1:i\d+>>] loop:<<Loop1>>      outer_loop:none
145*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 VecAdd [<<Phi1>>,<<Load1>>]    loop:<<Loop1>>      outer_loop:none
146*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<I1>>,{{i\d+}}]          loop:<<Loop1>>      outer_loop:none
147*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Red1:d\d+>>   VecReduce [<<Phi1>>]           loop:none
148*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Extr1:i\d+>>  VecExtractScalar [<<Red1>>]    loop:none
149*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Set2:d\d+>>   VecSetScalars [{{i\d+}}]       loop:none
150*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:d\d+>>   Phi [<<Set2>>,{{d\d+}}]        loop:<<Loop2:B\d+>> outer_loop:none
151*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Load2:d\d+>>  VecLoad [{{l\d+}},<<I2:i\d+>>] loop:<<Loop2>>      outer_loop:none
152*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 VecAdd [<<Phi2>>,<<Load2>>]    loop:<<Loop2>>      outer_loop:none
153*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<I2>>,{{i\d+}}]          loop:<<Loop2>>      outer_loop:none
154*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Red2:d\d+>>   VecReduce [<<Phi2>>]           loop:none
155*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Extr2:i\d+>>  VecExtractScalar [<<Red2>>]    loop:none
156*795d594fSAndroid Build Coastguard Worker   //
157*795d594fSAndroid Build Coastguard Worker   /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>"
158*795d594fSAndroid Build Coastguard Worker   //
159*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int Main.reductionIntChain() loop_optimization (after)
160*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
161*795d594fSAndroid Build Coastguard Worker   //
162*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set1:d\d+>>   VecSetScalars [{{i\d+}},{{j\d+}}]         loop:none
163*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:d\d+>>   Phi [<<Set1>>,{{d\d+}}]                   loop:<<Loop1:B\d+>> outer_loop:none
164*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Loop1P:j\d+>> VecPredWhile                              loop:<<Loop1>>      outer_loop:none
165*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load1:d\d+>>  VecLoad [{{l\d+}},<<I1:i\d+>>,<<Loop1P>>] loop:<<Loop1>>      outer_loop:none
166*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 VecAdd [<<Phi1>>,<<Load1>>,<<Loop1P>>]    loop:<<Loop1>>      outer_loop:none
167*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<I1>>,{{i\d+}}]                     loop:<<Loop1>>      outer_loop:none
168*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Red1:d\d+>>   VecReduce [<<Phi1>>,{{j\d+}}]             loop:none
169*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Extr1:i\d+>>  VecExtractScalar [<<Red1>>,{{j\d+}}]      loop:none
170*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set2:d\d+>>   VecSetScalars [{{i\d+}},{{j\d+}}]         loop:none
171*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>   Phi [<<Set2>>,{{d\d+}}]                   loop:<<Loop2:B\d+>> outer_loop:none
172*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Loop2P:j\d+>> VecPredWhile                              loop:<<Loop2>>      outer_loop:none
173*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load2:d\d+>>  VecLoad [{{l\d+}},<<I2:i\d+>>,<<Loop2P>>] loop:<<Loop2>>      outer_loop:none
174*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 VecAdd [<<Phi2>>,<<Load2>>,<<Loop2P>>]    loop:<<Loop2>>      outer_loop:none
175*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<I2>>,{{i\d+}}]                     loop:<<Loop2>>      outer_loop:none
176*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Red2:d\d+>>   VecReduce [<<Phi2>>,{{j\d+}}]             loop:none
177*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Extr2:i\d+>>  VecExtractScalar [<<Red2>>,{{j\d+}}]      loop:none
178*795d594fSAndroid Build Coastguard Worker   //
179*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
180*795d594fSAndroid Build Coastguard Worker   //
181*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set1:d\d+>>   VecSetScalars [{{i\d+}}]       loop:none
182*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:d\d+>>   Phi [<<Set1>>,{{d\d+}}]        loop:<<Loop1:B\d+>> outer_loop:none
183*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load1:d\d+>>  VecLoad [{{l\d+}},<<I1:i\d+>>] loop:<<Loop1>>      outer_loop:none
184*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 VecAdd [<<Phi1>>,<<Load1>>]    loop:<<Loop1>>      outer_loop:none
185*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<I1>>,{{i\d+}}]          loop:<<Loop1>>      outer_loop:none
186*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Red1:d\d+>>   VecReduce [<<Phi1>>]           loop:none
187*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Extr1:i\d+>>  VecExtractScalar [<<Red1>>]    loop:none
188*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set2:d\d+>>   VecSetScalars [{{i\d+}}]       loop:none
189*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>   Phi [<<Set2>>,{{d\d+}}]        loop:<<Loop2:B\d+>> outer_loop:none
190*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load2:d\d+>>  VecLoad [{{l\d+}},<<I2:i\d+>>] loop:<<Loop2>>      outer_loop:none
191*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 VecAdd [<<Phi2>>,<<Load2>>]    loop:<<Loop2>>      outer_loop:none
192*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<I2>>,{{i\d+}}]          loop:<<Loop2>>      outer_loop:none
193*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Red2:d\d+>>   VecReduce [<<Phi2>>]           loop:none
194*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Extr2:i\d+>>  VecExtractScalar [<<Red2>>]    loop:none
195*795d594fSAndroid Build Coastguard Worker   //
196*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
197*795d594fSAndroid Build Coastguard Worker   //
198*795d594fSAndroid Build Coastguard Worker   /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>"
199*795d594fSAndroid Build Coastguard Worker   //
200*795d594fSAndroid Build Coastguard Worker   // NOTE: pattern is robust with respect to vector loop unrolling and peeling.
reductionIntChain()201*795d594fSAndroid Build Coastguard Worker   private static int reductionIntChain() {
202*795d594fSAndroid Build Coastguard Worker     int[] x = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
203*795d594fSAndroid Build Coastguard Worker     int r = 1;
204*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 16; i++) {
205*795d594fSAndroid Build Coastguard Worker       r += x[i];
206*795d594fSAndroid Build Coastguard Worker     }
207*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 16; i++) {
208*795d594fSAndroid Build Coastguard Worker       r += x[i];
209*795d594fSAndroid Build Coastguard Worker     }
210*795d594fSAndroid Build Coastguard Worker     return r;
211*795d594fSAndroid Build Coastguard Worker   }
212*795d594fSAndroid Build Coastguard Worker 
213*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.reductionIntToLoop(int[]) loop_optimization (before)
214*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                 loop:none
215*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                 loop:none
216*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]      loop:<<Loop1:B\d+>> outer_loop:none
217*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]      loop:<<Loop1>>      outer_loop:none
218*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:i\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]  loop:<<Loop1>>      outer_loop:none
219*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Get>>]        loop:<<Loop1>>      outer_loop:none
220*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]      loop:<<Loop1>>      outer_loop:none
221*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi3:i\d+>>   Phi [<<Phi2>>,{{i\d+}}]       loop:<<Loop2:B\d+>> outer_loop:none
222*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi4:i\d+>>   Phi [<<Phi2>>,{{i\d+}}]       loop:<<Loop2>>      outer_loop:none
223*795d594fSAndroid Build Coastguard Worker   //
224*795d594fSAndroid Build Coastguard Worker   /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>"
225*795d594fSAndroid Build Coastguard Worker   //
226*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM: int Main.reductionIntToLoop(int[]) loop_optimization (after)
227*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons:i\d+>>   IntConstant 2                 loop:none
228*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Set:d\d+>>    VecSetScalars [{{i\d+}}]      loop:none
229*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:d\d+>>    Phi [<<Set>>,{{d\d+}}]        loop:<<Loop1:B\d+>> outer_loop:none
230*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop1>>      outer_loop:none
231*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 VecAdd [<<Phi>>,<<Load>>]     loop:<<Loop1>>      outer_loop:none
232*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<I>>,<<Cons>>]          loop:<<Loop1>>      outer_loop:none
233*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Red:d\d+>>    VecReduce [<<Phi>>]           loop:none
234*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Extr:i\d+>>   VecExtractScalar [<<Red>>]    loop:none
235*795d594fSAndroid Build Coastguard Worker   //
236*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int Main.reductionIntToLoop(int[]) loop_optimization (after)
237*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
238*795d594fSAndroid Build Coastguard Worker   //
239*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [{{i\d+}},{{j\d+}}]        loop:none
240*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:d\d+>>    Phi [<<Set>>,{{d\d+}}]                   loop:<<Loop1:B\d+>> outer_loop:none
241*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>>  VecPredWhile                             loop:<<Loop1>>
242*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<I:i\d+>>,<<LoopP>>]  loop:<<Loop1>>      outer_loop:none
243*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 VecAdd [<<Phi>>,<<Load>>,<<LoopP>>]      loop:<<Loop1>>      outer_loop:none
244*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<I>>,{{i\d+}}]                     loop:<<Loop1>>      outer_loop:none
245*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Red:d\d+>>    VecReduce [<<Phi>>,{{j\d+}}]             loop:none
246*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Extr:i\d+>>   VecExtractScalar [<<Red>>,{{j\d+}}]      loop:none
247*795d594fSAndroid Build Coastguard Worker   //
248*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
249*795d594fSAndroid Build Coastguard Worker   //
250*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cons:i\d+>>   IntConstant 4                 loop:none
251*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [{{i\d+}}]      loop:none
252*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:d\d+>>    Phi [<<Set>>,{{d\d+}}]        loop:<<Loop1:B\d+>> outer_loop:none
253*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop1>>      outer_loop:none
254*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 VecAdd [<<Phi>>,<<Load>>]     loop:<<Loop1>>      outer_loop:none
255*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<I>>,<<Cons>>]          loop:<<Loop1>>      outer_loop:none
256*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Red:d\d+>>    VecReduce [<<Phi>>]           loop:none
257*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Extr:i\d+>>   VecExtractScalar [<<Red>>]    loop:none
258*795d594fSAndroid Build Coastguard Worker   //
259*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
reductionIntToLoop(int[] x)260*795d594fSAndroid Build Coastguard Worker   private static int reductionIntToLoop(int[] x) {
261*795d594fSAndroid Build Coastguard Worker     int r = 0;
262*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 8; i++) {
263*795d594fSAndroid Build Coastguard Worker       r += x[i];
264*795d594fSAndroid Build Coastguard Worker     }
265*795d594fSAndroid Build Coastguard Worker     for (int i = r; i < 16; i++) {
266*795d594fSAndroid Build Coastguard Worker       r += i;
267*795d594fSAndroid Build Coastguard Worker     }
268*795d594fSAndroid Build Coastguard Worker     return r;
269*795d594fSAndroid Build Coastguard Worker   }
270*795d594fSAndroid Build Coastguard Worker 
271*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long Main.reductionLong(long[]) loop_optimization (before)
272*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                 loop:none
273*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Long0:j\d+>>  LongConstant 0                loop:none
274*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                 loop:none
275*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]      loop:<<Loop:B\d+>> outer_loop:none
276*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:j\d+>>   Phi [<<Long0>>,{{j\d+}}]      loop:<<Loop>>      outer_loop:none
277*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:j\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]  loop:<<Loop>>      outer_loop:none
278*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Get>>]        loop:<<Loop>>      outer_loop:none
279*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]      loop:<<Loop>>      outer_loop:none
280*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Phi2>>]             loop:none
281*795d594fSAndroid Build Coastguard Worker   //
282*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: long Main.reductionLong(long[]) loop_optimization (after)
283*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
284*795d594fSAndroid Build Coastguard Worker   //
285*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cons2:i\d+>>  IntConstant                              loop:none
286*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [{{j\d+}},{{j\d+}}]        loop:none
287*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:d\d+>>    Phi [<<Set>>,{{d\d+}}]                   loop:<<Loop:B\d+>> outer_loop:none
288*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Loop1P:j\d+>> VecPredWhile                             loop:<<Loop>>      outer_loop:none
289*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<I:i\d+>>,<<Loop1P>>] loop:<<Loop>>      outer_loop:none
290*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 VecAdd [<<Phi>>,<<Load>>,<<Loop1P>>]     loop:<<Loop>>      outer_loop:none
291*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<I>>,{{i\d+}}]                     loop:<<Loop>>      outer_loop:none
292*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Red:d\d+>>    VecReduce [<<Phi>>,{{j\d+}}]             loop:none
293*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Extr:j\d+>>   VecExtractScalar [<<Red>>,{{j\d+}}]      loop:none
294*795d594fSAndroid Build Coastguard Worker   //
295*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
296*795d594fSAndroid Build Coastguard Worker   //
297*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cons2:i\d+>>  IntConstant 2                 loop:none
298*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [{{j\d+}}]      loop:none
299*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:d\d+>>    Phi [<<Set>>,{{d\d+}}]        loop:<<Loop:B\d+>> outer_loop:none
300*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop>>      outer_loop:none
301*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 VecAdd [<<Phi>>,<<Load>>]     loop:<<Loop>>      outer_loop:none
302*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<I>>,<<Cons2>>]         loop:<<Loop>>      outer_loop:none
303*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Red:d\d+>>    VecReduce [<<Phi>>]           loop:none
304*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Extr:j\d+>>   VecExtractScalar [<<Red>>]    loop:none
305*795d594fSAndroid Build Coastguard Worker   //
306*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
reductionLong(long[] x)307*795d594fSAndroid Build Coastguard Worker   private static long reductionLong(long[] x) {
308*795d594fSAndroid Build Coastguard Worker     long sum = 0;
309*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < x.length; i++) {
310*795d594fSAndroid Build Coastguard Worker       sum += x[i];
311*795d594fSAndroid Build Coastguard Worker     }
312*795d594fSAndroid Build Coastguard Worker     return sum;
313*795d594fSAndroid Build Coastguard Worker   }
314*795d594fSAndroid Build Coastguard Worker 
reductionByteM1(byte[] x)315*795d594fSAndroid Build Coastguard Worker   private static byte reductionByteM1(byte[] x) {
316*795d594fSAndroid Build Coastguard Worker     byte sum = -1;
317*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < x.length; i++) {
318*795d594fSAndroid Build Coastguard Worker       sum += x[i];
319*795d594fSAndroid Build Coastguard Worker     }
320*795d594fSAndroid Build Coastguard Worker     return sum;
321*795d594fSAndroid Build Coastguard Worker   }
322*795d594fSAndroid Build Coastguard Worker 
reductionShortM1(short[] x)323*795d594fSAndroid Build Coastguard Worker   private static short reductionShortM1(short[] x) {
324*795d594fSAndroid Build Coastguard Worker     short sum = -1;
325*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < x.length; i++) {
326*795d594fSAndroid Build Coastguard Worker       sum += x[i];
327*795d594fSAndroid Build Coastguard Worker     }
328*795d594fSAndroid Build Coastguard Worker     return sum;
329*795d594fSAndroid Build Coastguard Worker   }
330*795d594fSAndroid Build Coastguard Worker 
reductionCharM1(char[] x)331*795d594fSAndroid Build Coastguard Worker   private static char reductionCharM1(char[] x) {
332*795d594fSAndroid Build Coastguard Worker     char sum = 0xffff;
333*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < x.length; i++) {
334*795d594fSAndroid Build Coastguard Worker       sum += x[i];
335*795d594fSAndroid Build Coastguard Worker     }
336*795d594fSAndroid Build Coastguard Worker     return sum;
337*795d594fSAndroid Build Coastguard Worker   }
338*795d594fSAndroid Build Coastguard Worker 
339*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.reductionIntM1(int[]) loop_optimization (before)
340*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                 loop:none
341*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                 loop:none
342*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ConsM1:i\d+>> IntConstant -1                loop:none
343*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]      loop:<<Loop:B\d+>> outer_loop:none
344*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>   Phi [<<ConsM1>>,{{i\d+}}]     loop:<<Loop>>      outer_loop:none
345*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:i\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]  loop:<<Loop>>      outer_loop:none
346*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Get>>]        loop:<<Loop>>      outer_loop:none
347*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]      loop:<<Loop>>      outer_loop:none
348*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Phi2>>]             loop:none
349*795d594fSAndroid Build Coastguard Worker   //
350*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM: int Main.reductionIntM1(int[]) loop_optimization (after)
351*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons:i\d+>>   IntConstant 2                 loop:none
352*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Set:d\d+>>    VecSetScalars [{{i\d+}}]      loop:none
353*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:d\d+>>    Phi [<<Set>>,{{d\d+}}]        loop:<<Loop:B\d+>> outer_loop:none
354*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop>>      outer_loop:none
355*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 VecAdd [<<Phi>>,<<Load>>]     loop:<<Loop>>      outer_loop:none
356*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<I>>,<<Cons>>]          loop:<<Loop>>      outer_loop:none
357*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Red:d\d+>>    VecReduce [<<Phi>>]           loop:none
358*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Extr:i\d+>>   VecExtractScalar [<<Red>>]    loop:none
359*795d594fSAndroid Build Coastguard Worker   //
360*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int Main.reductionIntM1(int[]) loop_optimization (after)
361*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
362*795d594fSAndroid Build Coastguard Worker   //
363*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [{{i\d+}},{{j\d+}}]       loop:none
364*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:d\d+>>    Phi [<<Set>>,{{d\d+}}]                  loop:<<Loop:B\d+>> outer_loop:none
365*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>>  VecPredWhile                            loop:<<Loop>>      outer_loop:none
366*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<I:i\d+>>,<<LoopP>>] loop:<<Loop>>      outer_loop:none
367*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 VecAdd [<<Phi>>,<<Load>>,<<LoopP>>]     loop:<<Loop>>      outer_loop:none
368*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<I>>,{{i\d+}}]                    loop:<<Loop>>      outer_loop:none
369*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Red:d\d+>>    VecReduce [<<Phi>>,{{j\d+}}]            loop:none
370*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Extr:i\d+>>   VecExtractScalar [<<Red>>,{{j\d+}}]     loop:none
371*795d594fSAndroid Build Coastguard Worker   //
372*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
373*795d594fSAndroid Build Coastguard Worker   //
374*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cons:i\d+>>   IntConstant 4                 loop:none
375*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [{{i\d+}}]      loop:none
376*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:d\d+>>    Phi [<<Set>>,{{d\d+}}]        loop:<<Loop:B\d+>> outer_loop:none
377*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop>>      outer_loop:none
378*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 VecAdd [<<Phi>>,<<Load>>]     loop:<<Loop>>      outer_loop:none
379*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<I>>,<<Cons>>]          loop:<<Loop>>      outer_loop:none
380*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Red:d\d+>>    VecReduce [<<Phi>>]           loop:none
381*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Extr:i\d+>>   VecExtractScalar [<<Red>>]    loop:none
382*795d594fSAndroid Build Coastguard Worker   //
383*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
reductionIntM1(int[] x)384*795d594fSAndroid Build Coastguard Worker   private static int reductionIntM1(int[] x) {
385*795d594fSAndroid Build Coastguard Worker     int sum = -1;
386*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < x.length; i++) {
387*795d594fSAndroid Build Coastguard Worker       sum += x[i];
388*795d594fSAndroid Build Coastguard Worker     }
389*795d594fSAndroid Build Coastguard Worker     return sum;
390*795d594fSAndroid Build Coastguard Worker   }
391*795d594fSAndroid Build Coastguard Worker 
392*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long Main.reductionLongM1(long[]) loop_optimization (before)
393*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                 loop:none
394*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<LongM1:j\d+>> LongConstant -1               loop:none
395*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                 loop:none
396*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]      loop:<<Loop:B\d+>> outer_loop:none
397*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:j\d+>>   Phi [<<LongM1>>,{{j\d+}}]     loop:<<Loop>>      outer_loop:none
398*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:j\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]  loop:<<Loop>>      outer_loop:none
399*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Get>>]        loop:<<Loop>>      outer_loop:none
400*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]      loop:<<Loop>>      outer_loop:none
401*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Phi2>>]             loop:none
402*795d594fSAndroid Build Coastguard Worker   //
403*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: long Main.reductionLongM1(long[]) loop_optimization (after)
404*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
405*795d594fSAndroid Build Coastguard Worker   //
406*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [{{j\d+}},{{j\d+}}]       loop:none
407*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:d\d+>>    Phi [<<Set>>,{{d\d+}}]                  loop:<<Loop:B\d+>> outer_loop:none
408*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>>  VecPredWhile                            loop:<<Loop>>      outer_loop:none
409*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<I:i\d+>>,<<LoopP>>] loop:<<Loop>>      outer_loop:none
410*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 VecAdd [<<Phi>>,<<Load>>,<<LoopP>>]     loop:<<Loop>>      outer_loop:none
411*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<I>>,{{i\d+}}]                    loop:<<Loop>>      outer_loop:none
412*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Red:d\d+>>    VecReduce [<<Phi>>,{{j\d+}}]            loop:none
413*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Extr:j\d+>>   VecExtractScalar [<<Red>>,{{j\d+}}]     loop:none
414*795d594fSAndroid Build Coastguard Worker   //
415*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
416*795d594fSAndroid Build Coastguard Worker   //
417*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cons2:i\d+>>  IntConstant 2                 loop:none
418*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [{{j\d+}}]      loop:none
419*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:d\d+>>    Phi [<<Set>>,{{d\d+}}]        loop:<<Loop:B\d+>> outer_loop:none
420*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop>>      outer_loop:none
421*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 VecAdd [<<Phi>>,<<Load>>]     loop:<<Loop>>      outer_loop:none
422*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<I>>,<<Cons2>>]         loop:<<Loop>>      outer_loop:none
423*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Red:d\d+>>    VecReduce [<<Phi>>]           loop:none
424*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Extr:j\d+>>   VecExtractScalar [<<Red>>]    loop:none
425*795d594fSAndroid Build Coastguard Worker   //
426*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
reductionLongM1(long[] x)427*795d594fSAndroid Build Coastguard Worker   private static long reductionLongM1(long[] x) {
428*795d594fSAndroid Build Coastguard Worker     long sum = -1L;
429*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < x.length; i++) {
430*795d594fSAndroid Build Coastguard Worker       sum += x[i];
431*795d594fSAndroid Build Coastguard Worker     }
432*795d594fSAndroid Build Coastguard Worker     return sum;
433*795d594fSAndroid Build Coastguard Worker   }
434*795d594fSAndroid Build Coastguard Worker 
reductionMinusByte(byte[] x)435*795d594fSAndroid Build Coastguard Worker   private static byte reductionMinusByte(byte[] x) {
436*795d594fSAndroid Build Coastguard Worker     byte sum = 0;
437*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < x.length; i++) {
438*795d594fSAndroid Build Coastguard Worker       sum -= x[i];
439*795d594fSAndroid Build Coastguard Worker     }
440*795d594fSAndroid Build Coastguard Worker     return sum;
441*795d594fSAndroid Build Coastguard Worker   }
442*795d594fSAndroid Build Coastguard Worker 
reductionMinusShort(short[] x)443*795d594fSAndroid Build Coastguard Worker   private static short reductionMinusShort(short[] x) {
444*795d594fSAndroid Build Coastguard Worker     short sum = 0;
445*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < x.length; i++) {
446*795d594fSAndroid Build Coastguard Worker       sum -= x[i];
447*795d594fSAndroid Build Coastguard Worker     }
448*795d594fSAndroid Build Coastguard Worker     return sum;
449*795d594fSAndroid Build Coastguard Worker   }
450*795d594fSAndroid Build Coastguard Worker 
reductionMinusChar(char[] x)451*795d594fSAndroid Build Coastguard Worker   private static char reductionMinusChar(char[] x) {
452*795d594fSAndroid Build Coastguard Worker     char sum = 0;
453*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < x.length; i++) {
454*795d594fSAndroid Build Coastguard Worker       sum -= x[i];
455*795d594fSAndroid Build Coastguard Worker     }
456*795d594fSAndroid Build Coastguard Worker     return sum;
457*795d594fSAndroid Build Coastguard Worker   }
458*795d594fSAndroid Build Coastguard Worker 
459*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.reductionMinusInt(int[]) loop_optimization (before)
460*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                 loop:none
461*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                 loop:none
462*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]      loop:<<Loop:B\d+>> outer_loop:none
463*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]      loop:<<Loop>>      outer_loop:none
464*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:i\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]  loop:<<Loop>>      outer_loop:none
465*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Sub [<<Phi2>>,<<Get>>]        loop:<<Loop>>      outer_loop:none
466*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]      loop:<<Loop>>      outer_loop:none
467*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Phi2>>]             loop:none
468*795d594fSAndroid Build Coastguard Worker   //
469*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM: int Main.reductionMinusInt(int[]) loop_optimization (after)
470*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons:i\d+>>   IntConstant 2                 loop:none
471*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Set:d\d+>>    VecSetScalars [{{i\d+}}]      loop:none
472*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:d\d+>>    Phi [<<Set>>,{{d\d+}}]        loop:<<Loop:B\d+>> outer_loop:none
473*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop>>      outer_loop:none
474*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 VecSub [<<Phi>>,<<Load>>]     loop:<<Loop>>      outer_loop:none
475*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<I>>,<<Cons>>]          loop:<<Loop>>      outer_loop:none
476*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Red:d\d+>>    VecReduce [<<Phi>>]           loop:none
477*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Extr:i\d+>>   VecExtractScalar [<<Red>>]    loop:none
478*795d594fSAndroid Build Coastguard Worker   //
479*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int Main.reductionMinusInt(int[]) loop_optimization (after)
480*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
481*795d594fSAndroid Build Coastguard Worker   //
482*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [{{i\d+}},{{j\d+}}]       loop:none
483*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:d\d+>>    Phi [<<Set>>,{{d\d+}}]                  loop:<<Loop:B\d+>> outer_loop:none
484*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>>  VecPredWhile                            loop:<<Loop>>      outer_loop:none
485*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<I:i\d+>>,<<LoopP>>] loop:<<Loop>>      outer_loop:none
486*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 VecSub [<<Phi>>,<<Load>>,<<LoopP>>]     loop:<<Loop>>      outer_loop:none
487*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<I>>,{{i\d+}}]                    loop:<<Loop>>      outer_loop:none
488*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Red:d\d+>>    VecReduce [<<Phi>>,{{j\d+}}]            loop:none
489*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Extr:i\d+>>   VecExtractScalar [<<Red>>,{{j\d+}}]     loop:none
490*795d594fSAndroid Build Coastguard Worker   //
491*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
492*795d594fSAndroid Build Coastguard Worker   //
493*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cons:i\d+>>   IntConstant 4                 loop:none
494*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [{{i\d+}}]      loop:none
495*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:d\d+>>    Phi [<<Set>>,{{d\d+}}]        loop:<<Loop:B\d+>> outer_loop:none
496*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop>>      outer_loop:none
497*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 VecSub [<<Phi>>,<<Load>>]     loop:<<Loop>>      outer_loop:none
498*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<I>>,<<Cons>>]          loop:<<Loop>>      outer_loop:none
499*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Red:d\d+>>    VecReduce [<<Phi>>]           loop:none
500*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Extr:i\d+>>   VecExtractScalar [<<Red>>]    loop:none
501*795d594fSAndroid Build Coastguard Worker   //
502*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
reductionMinusInt(int[] x)503*795d594fSAndroid Build Coastguard Worker   private static int reductionMinusInt(int[] x) {
504*795d594fSAndroid Build Coastguard Worker     int sum = 0;
505*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < x.length; i++) {
506*795d594fSAndroid Build Coastguard Worker       sum -= x[i];
507*795d594fSAndroid Build Coastguard Worker     }
508*795d594fSAndroid Build Coastguard Worker     return sum;
509*795d594fSAndroid Build Coastguard Worker   }
510*795d594fSAndroid Build Coastguard Worker 
511*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long Main.reductionMinusLong(long[]) loop_optimization (before)
512*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                 loop:none
513*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Long0:j\d+>>  LongConstant 0                loop:none
514*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                 loop:none
515*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]      loop:<<Loop:B\d+>> outer_loop:none
516*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:j\d+>>   Phi [<<Long0>>,{{j\d+}}]      loop:<<Loop>>      outer_loop:none
517*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:j\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]  loop:<<Loop>>      outer_loop:none
518*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Sub [<<Phi2>>,<<Get>>]        loop:<<Loop>>      outer_loop:none
519*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]      loop:<<Loop>>      outer_loop:none
520*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Phi2>>]             loop:none
521*795d594fSAndroid Build Coastguard Worker   //
522*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: long Main.reductionMinusLong(long[]) loop_optimization (after)
523*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
524*795d594fSAndroid Build Coastguard Worker   //
525*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [{{j\d+}},{{j\d+}}]       loop:none
526*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:d\d+>>    Phi [<<Set>>,{{d\d+}}]                  loop:<<Loop:B\d+>> outer_loop:none
527*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>>  VecPredWhile                            loop:<<Loop>>      outer_loop:none
528*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<I:i\d+>>,<<LoopP>>] loop:<<Loop>>      outer_loop:none
529*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 VecSub [<<Phi>>,<<Load>>,<<LoopP>>]     loop:<<Loop>>      outer_loop:none
530*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<I>>,{{i\d+}}]                    loop:<<Loop>>      outer_loop:none
531*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Red:d\d+>>    VecReduce [<<Phi>>,{{j\d+}}]            loop:none
532*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Extr:j\d+>>   VecExtractScalar [<<Red>>,{{j\d+}}]     loop:none
533*795d594fSAndroid Build Coastguard Worker   //
534*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
535*795d594fSAndroid Build Coastguard Worker   //
536*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cons2:i\d+>>  IntConstant 2                 loop:none
537*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [{{j\d+}}]      loop:none
538*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:d\d+>>    Phi [<<Set>>,{{d\d+}}]        loop:<<Loop:B\d+>> outer_loop:none
539*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop>>      outer_loop:none
540*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 VecSub [<<Phi>>,<<Load>>]     loop:<<Loop>>      outer_loop:none
541*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<I>>,<<Cons2>>]         loop:<<Loop>>      outer_loop:none
542*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Red:d\d+>>    VecReduce [<<Phi>>]           loop:none
543*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Extr:j\d+>>   VecExtractScalar [<<Red>>]    loop:none
544*795d594fSAndroid Build Coastguard Worker   //
545*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
reductionMinusLong(long[] x)546*795d594fSAndroid Build Coastguard Worker   private static long reductionMinusLong(long[] x) {
547*795d594fSAndroid Build Coastguard Worker     long sum = 0;
548*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < x.length; i++) {
549*795d594fSAndroid Build Coastguard Worker       sum -= x[i];
550*795d594fSAndroid Build Coastguard Worker     }
551*795d594fSAndroid Build Coastguard Worker     return sum;
552*795d594fSAndroid Build Coastguard Worker   }
553*795d594fSAndroid Build Coastguard Worker 
554*795d594fSAndroid Build Coastguard Worker   //
555*795d594fSAndroid Build Coastguard Worker   // A few special cases.
556*795d594fSAndroid Build Coastguard Worker   //
557*795d594fSAndroid Build Coastguard Worker 
558*795d594fSAndroid Build Coastguard Worker   // TODO: consider unrolling
559*795d594fSAndroid Build Coastguard Worker 
reductionInt10(int[] x)560*795d594fSAndroid Build Coastguard Worker   private static int reductionInt10(int[] x) {
561*795d594fSAndroid Build Coastguard Worker     int sum = 0;
562*795d594fSAndroid Build Coastguard Worker     // Amenable to complete unrolling.
563*795d594fSAndroid Build Coastguard Worker     for (int i = 10; i <= 10; i++) {
564*795d594fSAndroid Build Coastguard Worker       sum += x[i];
565*795d594fSAndroid Build Coastguard Worker     }
566*795d594fSAndroid Build Coastguard Worker     return sum;
567*795d594fSAndroid Build Coastguard Worker   }
568*795d594fSAndroid Build Coastguard Worker 
reductionMinusInt10(int[] x)569*795d594fSAndroid Build Coastguard Worker   private static int reductionMinusInt10(int[] x) {
570*795d594fSAndroid Build Coastguard Worker     int sum = 0;
571*795d594fSAndroid Build Coastguard Worker     // Amenable to complete unrolling.
572*795d594fSAndroid Build Coastguard Worker     for (int i = 10; i <= 10; i++) {
573*795d594fSAndroid Build Coastguard Worker       sum -= x[i];
574*795d594fSAndroid Build Coastguard Worker     }
575*795d594fSAndroid Build Coastguard Worker     return sum;
576*795d594fSAndroid Build Coastguard Worker   }
577*795d594fSAndroid Build Coastguard Worker 
578*795d594fSAndroid Build Coastguard Worker   //
579*795d594fSAndroid Build Coastguard Worker   // Main driver.
580*795d594fSAndroid Build Coastguard Worker   //
581*795d594fSAndroid Build Coastguard Worker 
main(String[] args)582*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) {
583*795d594fSAndroid Build Coastguard Worker     byte[] xb = new byte[N];
584*795d594fSAndroid Build Coastguard Worker     short[] xs = new short[N];
585*795d594fSAndroid Build Coastguard Worker     char[] xc = new char[N];
586*795d594fSAndroid Build Coastguard Worker     int[] xi = new int[N];
587*795d594fSAndroid Build Coastguard Worker     long[] xl = new long[N];
588*795d594fSAndroid Build Coastguard Worker     for (int i = 0, k = -17; i < N; i++, k += 3) {
589*795d594fSAndroid Build Coastguard Worker       xb[i] = (byte) k;
590*795d594fSAndroid Build Coastguard Worker       xs[i] = (short) k;
591*795d594fSAndroid Build Coastguard Worker       xc[i] = (char) k;
592*795d594fSAndroid Build Coastguard Worker       xi[i] = k;
593*795d594fSAndroid Build Coastguard Worker       xl[i] = k;
594*795d594fSAndroid Build Coastguard Worker     }
595*795d594fSAndroid Build Coastguard Worker 
596*795d594fSAndroid Build Coastguard Worker     // Arrays with all positive elements.
597*795d594fSAndroid Build Coastguard Worker     byte[] xpb = new byte[M];
598*795d594fSAndroid Build Coastguard Worker     short[] xps = new short[M];
599*795d594fSAndroid Build Coastguard Worker     char[] xpc = new char[M];
600*795d594fSAndroid Build Coastguard Worker     int[] xpi = new int[M];
601*795d594fSAndroid Build Coastguard Worker     long[] xpl = new long[M];
602*795d594fSAndroid Build Coastguard Worker     for (int i = 0, k = 3; i < M; i++, k++) {
603*795d594fSAndroid Build Coastguard Worker       xpb[i] = (byte) k;
604*795d594fSAndroid Build Coastguard Worker       xps[i] = (short) k;
605*795d594fSAndroid Build Coastguard Worker       xpc[i] = (char) k;
606*795d594fSAndroid Build Coastguard Worker       xpi[i] = k;
607*795d594fSAndroid Build Coastguard Worker       xpl[i] = k;
608*795d594fSAndroid Build Coastguard Worker     }
609*795d594fSAndroid Build Coastguard Worker 
610*795d594fSAndroid Build Coastguard Worker     // Arrays with all negative elements.
611*795d594fSAndroid Build Coastguard Worker     byte[] xnb = new byte[M];
612*795d594fSAndroid Build Coastguard Worker     short[] xns = new short[M];
613*795d594fSAndroid Build Coastguard Worker     int[] xni = new int[M];
614*795d594fSAndroid Build Coastguard Worker     long[] xnl = new long[M];
615*795d594fSAndroid Build Coastguard Worker     for (int i = 0, k = -103; i < M; i++, k++) {
616*795d594fSAndroid Build Coastguard Worker       xnb[i] = (byte) k;
617*795d594fSAndroid Build Coastguard Worker       xns[i] = (short) k;
618*795d594fSAndroid Build Coastguard Worker       xni[i] = k;
619*795d594fSAndroid Build Coastguard Worker       xnl[i] = k;
620*795d594fSAndroid Build Coastguard Worker     }
621*795d594fSAndroid Build Coastguard Worker 
622*795d594fSAndroid Build Coastguard Worker     // Test various reductions in loops.
623*795d594fSAndroid Build Coastguard Worker     int[] x0 = { 0, 0, 0, 0, 0, 0, 0, 0 };
624*795d594fSAndroid Build Coastguard Worker     int[] x1 = { 0, 0, 0, 1, 0, 0, 0, 0 };
625*795d594fSAndroid Build Coastguard Worker     int[] x2 = { 1, 1, 1, 1, 0, 0, 0, 0 };
626*795d594fSAndroid Build Coastguard Worker     expectEquals(-74, reductionByte(xb));
627*795d594fSAndroid Build Coastguard Worker     expectEquals(-27466, reductionShort(xs));
628*795d594fSAndroid Build Coastguard Worker     expectEquals(38070, reductionChar(xc));
629*795d594fSAndroid Build Coastguard Worker     expectEquals(365750, reductionInt(xi));
630*795d594fSAndroid Build Coastguard Worker     expectEquals(273, reductionIntChain());
631*795d594fSAndroid Build Coastguard Worker     expectEquals(120, reductionIntToLoop(x0));
632*795d594fSAndroid Build Coastguard Worker     expectEquals(121, reductionIntToLoop(x1));
633*795d594fSAndroid Build Coastguard Worker     expectEquals(118, reductionIntToLoop(x2));
634*795d594fSAndroid Build Coastguard Worker     expectEquals(-1310, reductionIntToLoop(xi));
635*795d594fSAndroid Build Coastguard Worker     expectEquals(365750L, reductionLong(xl));
636*795d594fSAndroid Build Coastguard Worker     expectEquals(-75, reductionByteM1(xb));
637*795d594fSAndroid Build Coastguard Worker     expectEquals(-27467, reductionShortM1(xs));
638*795d594fSAndroid Build Coastguard Worker     expectEquals(38069, reductionCharM1(xc));
639*795d594fSAndroid Build Coastguard Worker     expectEquals(365749, reductionIntM1(xi));
640*795d594fSAndroid Build Coastguard Worker     expectEquals(365749L, reductionLongM1(xl));
641*795d594fSAndroid Build Coastguard Worker     expectEquals(74, reductionMinusByte(xb));
642*795d594fSAndroid Build Coastguard Worker     expectEquals(27466, reductionMinusShort(xs));
643*795d594fSAndroid Build Coastguard Worker     expectEquals(27466, reductionMinusChar(xc));
644*795d594fSAndroid Build Coastguard Worker     expectEquals(-365750, reductionMinusInt(xi));
645*795d594fSAndroid Build Coastguard Worker     expectEquals(365750L, reductionLong(xl));
646*795d594fSAndroid Build Coastguard Worker     expectEquals(-75, reductionByteM1(xb));
647*795d594fSAndroid Build Coastguard Worker     expectEquals(-27467, reductionShortM1(xs));
648*795d594fSAndroid Build Coastguard Worker     expectEquals(38069, reductionCharM1(xc));
649*795d594fSAndroid Build Coastguard Worker     expectEquals(365749, reductionIntM1(xi));
650*795d594fSAndroid Build Coastguard Worker     expectEquals(365749L, reductionLongM1(xl));
651*795d594fSAndroid Build Coastguard Worker     expectEquals(74, reductionMinusByte(xb));
652*795d594fSAndroid Build Coastguard Worker     expectEquals(27466, reductionMinusShort(xs));
653*795d594fSAndroid Build Coastguard Worker     expectEquals(27466, reductionMinusChar(xc));
654*795d594fSAndroid Build Coastguard Worker     expectEquals(-365750, reductionMinusInt(xi));
655*795d594fSAndroid Build Coastguard Worker     expectEquals(-365750L, reductionMinusLong(xl));
656*795d594fSAndroid Build Coastguard Worker 
657*795d594fSAndroid Build Coastguard Worker     // Test special cases.
658*795d594fSAndroid Build Coastguard Worker     expectEquals(13, reductionInt10(xi));
659*795d594fSAndroid Build Coastguard Worker     expectEquals(-13, reductionMinusInt10(xi));
660*795d594fSAndroid Build Coastguard Worker 
661*795d594fSAndroid Build Coastguard Worker     System.out.println("passed");
662*795d594fSAndroid Build Coastguard Worker   }
663*795d594fSAndroid Build Coastguard Worker 
expectEquals(int expected, int result)664*795d594fSAndroid Build Coastguard Worker   private static void expectEquals(int expected, int result) {
665*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
666*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
667*795d594fSAndroid Build Coastguard Worker     }
668*795d594fSAndroid Build Coastguard Worker   }
669*795d594fSAndroid Build Coastguard Worker 
expectEquals(long expected, long result)670*795d594fSAndroid Build Coastguard Worker   private static void expectEquals(long expected, long result) {
671*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
672*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
673*795d594fSAndroid Build Coastguard Worker     }
674*795d594fSAndroid Build Coastguard Worker   }
675*795d594fSAndroid Build Coastguard Worker }
676