1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /**
18  * Tests for zero vectorization.
19  */
20 public class Main {
21 
22   /// CHECK-START: void Main.zeroz(boolean[]) loop_optimization (before)
23   /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0                        loop:none
24   /// CHECK-DAG: <<Phi:i\d+>>  Phi                                  loop:<<Loop:B\d+>> outer_loop:none
25   /// CHECK-DAG:               ArraySet [{{l\d+}},<<Phi>>,<<Zero>>] loop:<<Loop>>      outer_loop:none
26   //
27   /// CHECK-START-ARM64: void Main.zeroz(boolean[]) loop_optimization (after)
28   /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0                        loop:none
29   /// CHECK-IF:     hasIsaFeature("sve")
30   //
31   ///     CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Zero>>,{{j\d+}}]        loop:none
32   ///     CHECK-DAG: <<Phi:i\d+>>  Phi                                           loop:<<Loop:B\d+>> outer_loop:none
33   ///     CHECK-DAG:               VecStore [{{l\d+}},<<Phi>>,<<Repl>>,{{j\d+}}] loop:<<Loop>>      outer_loop:none
34   //
35   /// CHECK-ELSE:
36   //
37   ///     CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Zero>>]        loop:none
38   ///     CHECK-DAG: <<Phi:i\d+>>  Phi                                  loop:<<Loop:B\d+>> outer_loop:none
39   ///     CHECK-DAG:               VecStore [{{l\d+}},<<Phi>>,<<Repl>>] loop:<<Loop>>      outer_loop:none
40   //
41   /// CHECK-FI:
zeroz(boolean[] x)42   private static void zeroz(boolean[] x) {
43     for (int i = 0; i < x.length; i++) {
44       x[i] = false;
45     }
46   }
47 
48   /// CHECK-START: void Main.zerob(byte[]) loop_optimization (before)
49   /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0                        loop:none
50   /// CHECK-DAG: <<Phi:i\d+>>  Phi                                  loop:<<Loop:B\d+>> outer_loop:none
51   /// CHECK-DAG:               ArraySet [{{l\d+}},<<Phi>>,<<Zero>>] loop:<<Loop>>      outer_loop:none
52   //
53   /// CHECK-START-ARM64: void Main.zerob(byte[]) loop_optimization (after)
54   /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0                        loop:none
55   /// CHECK-IF:     hasIsaFeature("sve")
56   //
57   ///     CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Zero>>,{{j\d+}}]        loop:none
58   ///     CHECK-DAG: <<Phi:i\d+>>  Phi                                           loop:<<Loop:B\d+>> outer_loop:none
59   ///     CHECK-DAG:               VecStore [{{l\d+}},<<Phi>>,<<Repl>>,{{j\d+}}] loop:<<Loop>>      outer_loop:none
60   //
61   /// CHECK-ELSE:
62   //
63   ///     CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Zero>>]        loop:none
64   ///     CHECK-DAG: <<Phi:i\d+>>  Phi                                  loop:<<Loop:B\d+>> outer_loop:none
65   ///     CHECK-DAG:               VecStore [{{l\d+}},<<Phi>>,<<Repl>>] loop:<<Loop>>      outer_loop:none
66   //
67   /// CHECK-FI:
zerob(byte[] x)68   private static void zerob(byte[] x) {
69     for (int i = 0; i < x.length; i++) {
70       x[i] = 0;
71     }
72   }
73 
74   /// CHECK-START: void Main.zeroc(char[]) loop_optimization (before)
75   /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0                        loop:none
76   /// CHECK-DAG: <<Phi:i\d+>>  Phi                                  loop:<<Loop:B\d+>> outer_loop:none
77   /// CHECK-DAG:               ArraySet [{{l\d+}},<<Phi>>,<<Zero>>] loop:<<Loop>>      outer_loop:none
78   //
79   /// CHECK-START-ARM64: void Main.zeroc(char[]) loop_optimization (after)
80   /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0                        loop:none
81   /// CHECK-IF:     hasIsaFeature("sve")
82   //
83   ///     CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Zero>>,{{j\d+}}]        loop:none
84   ///     CHECK-DAG: <<Phi:i\d+>>  Phi                                  loop:<<Loop:B\d+>> outer_loop:none
85   ///     CHECK-DAG:               VecStore [{{l\d+}},<<Phi>>,<<Repl>>,{{j\d+}}] loop:<<Loop>>      outer_loop:none
86   //
87   /// CHECK-ELSE:
88   //
89   ///     CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Zero>>]        loop:none
90   ///     CHECK-DAG: <<Phi:i\d+>>  Phi                                  loop:<<Loop:B\d+>> outer_loop:none
91   ///     CHECK-DAG:               VecStore [{{l\d+}},<<Phi>>,<<Repl>>] loop:<<Loop>>      outer_loop:none
92   //
93   /// CHECK-FI:
zeroc(char[] x)94   private static void zeroc(char[] x) {
95     for (int i = 0; i < x.length; i++) {
96       x[i] = 0;
97     }
98   }
99 
100   /// CHECK-START: void Main.zeros(short[]) loop_optimization (before)
101   /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0                        loop:none
102   /// CHECK-DAG: <<Phi:i\d+>>  Phi                                  loop:<<Loop:B\d+>> outer_loop:none
103   /// CHECK-DAG:               ArraySet [{{l\d+}},<<Phi>>,<<Zero>>] loop:<<Loop>>      outer_loop:none
104   //
105   /// CHECK-START-ARM64: void Main.zeros(short[]) loop_optimization (after)
106   /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0                        loop:none
107   /// CHECK-IF:     hasIsaFeature("sve")
108   //
109   ///     CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Zero>>,{{j\d+}}]        loop:none
110   ///     CHECK-DAG: <<Phi:i\d+>>  Phi                                           loop:<<Loop:B\d+>> outer_loop:none
111   ///     CHECK-DAG:               VecStore [{{l\d+}},<<Phi>>,<<Repl>>,{{j\d+}}] loop:<<Loop>>      outer_loop:none
112   //
113   /// CHECK-ELSE:
114   //
115   ///     CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Zero>>]        loop:none
116   ///     CHECK-DAG: <<Phi:i\d+>>  Phi                                  loop:<<Loop:B\d+>> outer_loop:none
117   ///     CHECK-DAG:               VecStore [{{l\d+}},<<Phi>>,<<Repl>>] loop:<<Loop>>      outer_loop:none
118   //
119   /// CHECK-FI:
zeros(short[] x)120   private static void zeros(short[] x) {
121     for (int i = 0; i < x.length; i++) {
122       x[i] = 0;
123     }
124   }
125 
126   /// CHECK-START: void Main.zeroi(int[]) loop_optimization (before)
127   /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0                        loop:none
128   /// CHECK-DAG: <<Phi:i\d+>>  Phi                                  loop:<<Loop:B\d+>> outer_loop:none
129   /// CHECK-DAG:               ArraySet [{{l\d+}},<<Phi>>,<<Zero>>] loop:<<Loop>>      outer_loop:none
130   //
131   /// CHECK-START-ARM64: void Main.zeroi(int[]) loop_optimization (after)
132   /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0                        loop:none
133   /// CHECK-IF:     hasIsaFeature("sve")
134   //
135   ///     CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Zero>>,{{j\d+}}]        loop:none
136   ///     CHECK-DAG: <<Phi:i\d+>>  Phi                                           loop:<<Loop:B\d+>> outer_loop:none
137   ///     CHECK-DAG:               VecStore [{{l\d+}},<<Phi>>,<<Repl>>,{{j\d+}}] loop:<<Loop>>      outer_loop:none
138   //
139   /// CHECK-ELSE:
140   //
141   ///     CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Zero>>]        loop:none
142   ///     CHECK-DAG: <<Phi:i\d+>>  Phi                                  loop:<<Loop:B\d+>> outer_loop:none
143   ///     CHECK-DAG:               VecStore [{{l\d+}},<<Phi>>,<<Repl>>] loop:<<Loop>>      outer_loop:none
144   //
145   /// CHECK-FI:
zeroi(int[] x)146   private static void zeroi(int[] x) {
147     for (int i = 0; i < x.length; i++) {
148       x[i] = 0;
149     }
150   }
151 
152   /// CHECK-START: void Main.zerol(long[]) loop_optimization (before)
153   /// CHECK-DAG: <<Zero:j\d+>> LongConstant 0                       loop:none
154   /// CHECK-DAG: <<Phi:i\d+>>  Phi                                  loop:<<Loop:B\d+>> outer_loop:none
155   /// CHECK-DAG:               ArraySet [{{l\d+}},<<Phi>>,<<Zero>>] loop:<<Loop>>      outer_loop:none
156   //
157   /// CHECK-START-ARM64: void Main.zerol(long[]) loop_optimization (after)
158   /// CHECK-DAG: <<Zero:j\d+>> LongConstant 0                       loop:none
159   /// CHECK-IF:     hasIsaFeature("sve")
160   //
161   ///     CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Zero>>,{{j\d+}}]        loop:none
162   ///     CHECK-DAG: <<Phi:i\d+>>  Phi                                           loop:<<Loop:B\d+>> outer_loop:none
163   ///     CHECK-DAG:               VecStore [{{l\d+}},<<Phi>>,<<Repl>>,{{j\d+}}] loop:<<Loop>>      outer_loop:none
164   //
165   /// CHECK-ELSE:
166   //
167   ///     CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Zero>>]        loop:none
168   ///     CHECK-DAG: <<Phi:i\d+>>  Phi                                  loop:<<Loop:B\d+>> outer_loop:none
169   ///     CHECK-DAG:               VecStore [{{l\d+}},<<Phi>>,<<Repl>>] loop:<<Loop>>      outer_loop:none
170   //
171   /// CHECK-FI:
zerol(long[] x)172   private static void zerol(long[] x) {
173     for (int i = 0; i < x.length; i++) {
174       x[i] = 0;
175     }
176   }
177 
178   /// CHECK-START: void Main.zerof(float[]) loop_optimization (before)
179   /// CHECK-DAG: <<Zero:f\d+>> FloatConstant 0                      loop:none
180   /// CHECK-DAG: <<Phi:i\d+>>  Phi                                  loop:<<Loop:B\d+>> outer_loop:none
181   /// CHECK-DAG:               ArraySet [{{l\d+}},<<Phi>>,<<Zero>>] loop:<<Loop>>      outer_loop:none
182   //
183   /// CHECK-START-ARM64: void Main.zerof(float[]) loop_optimization (after)
184   /// CHECK-DAG: <<Zero:f\d+>> FloatConstant 0                      loop:none
185   /// CHECK-IF:     hasIsaFeature("sve")
186   //
187   ///     CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Zero>>,{{j\d+}}]        loop:none
188   ///     CHECK-DAG: <<Phi:i\d+>>  Phi                                           loop:<<Loop:B\d+>> outer_loop:none
189   ///     CHECK-DAG:               VecStore [{{l\d+}},<<Phi>>,<<Repl>>,{{j\d+}}] loop:<<Loop>>      outer_loop:none
190   //
191   /// CHECK-ELSE:
192   //
193   ///     CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Zero>>]        loop:none
194   ///     CHECK-DAG: <<Phi:i\d+>>  Phi                                  loop:<<Loop:B\d+>> outer_loop:none
195   ///     CHECK-DAG:               VecStore [{{l\d+}},<<Phi>>,<<Repl>>] loop:<<Loop>>      outer_loop:none
196   //
197   /// CHECK-FI:
zerof(float[] x)198   private static void zerof(float[] x) {
199     for (int i = 0; i < x.length; i++) {
200       x[i] = 0;
201     }
202   }
203 
204   /// CHECK-START: void Main.zerod(double[]) loop_optimization (before)
205   /// CHECK-DAG: <<Zero:d\d+>> DoubleConstant 0                     loop:none
206   /// CHECK-DAG: <<Phi:i\d+>>  Phi                                  loop:<<Loop:B\d+>> outer_loop:none
207   /// CHECK-DAG:               ArraySet [{{l\d+}},<<Phi>>,<<Zero>>] loop:<<Loop>>      outer_loop:none
208   //
209   /// CHECK-START-ARM64: void Main.zerod(double[]) loop_optimization (after)
210   /// CHECK-DAG: <<Zero:d\d+>> DoubleConstant 0                     loop:none
211   /// CHECK-IF:     hasIsaFeature("sve")
212   //
213   ///     CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Zero>>,{{j\d+}}]        loop:none
214   ///     CHECK-DAG: <<Phi:i\d+>>  Phi                                           loop:<<Loop:B\d+>> outer_loop:none
215   ///     CHECK-DAG:               VecStore [{{l\d+}},<<Phi>>,<<Repl>>,{{j\d+}}] loop:<<Loop>>      outer_loop:none
216   //
217   /// CHECK-ELSE:
218   //
219   ///     CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Zero>>]        loop:none
220   ///     CHECK-DAG: <<Phi:i\d+>>  Phi                                  loop:<<Loop:B\d+>> outer_loop:none
221   ///     CHECK-DAG:               VecStore [{{l\d+}},<<Phi>>,<<Repl>>] loop:<<Loop>>      outer_loop:none
222   //
223   /// CHECK-FI:
zerod(double[] x)224   private static void zerod(double[] x) {
225     for (int i = 0; i < x.length; i++) {
226       x[i] = 0;
227     }
228   }
229 
main(String[] args)230   public static void main(String[] args) {
231     int total = 1111;
232 
233     boolean[] xz = new boolean[total];
234     byte[]    xb = new byte[total];
235     char[]    xc = new char[total];
236     short[]   xs = new short[total];
237     int[]     xi = new int[total];
238     long[]    xl = new long[total];
239     float[]   xf = new float[total];
240     double[]  xd = new double[total];
241 
242     for (int i = 0; i < total; i++) {
243       xz[i] = true;
244       xb[i] = 1;
245       xc[i] = 1;
246       xs[i] = 1;
247       xi[i] = 1;
248       xl[i] = 1;
249       xf[i] = 1;
250       xd[i] = 1;
251     }
252 
253     for (int i = 0; i < total; i++) {
254       expectEquals(true, xz[i]);
255       expectEquals(1, xb[i]);
256       expectEquals(1, xc[i]);
257       expectEquals(1, xs[i]);
258       expectEquals(1, xi[i]);
259       expectEquals(1, xl[i]);
260       expectEquals(1, xf[i]);
261       expectEquals(1, xd[i]);
262     }
263 
264     zeroz(xz);
265     zerob(xb);
266     zeroc(xc);
267     zeros(xs);
268     zeroi(xi);
269     zerol(xl);
270     zerof(xf);
271     zerod(xd);
272 
273     for (int i = 0; i < total; i++) {
274       expectEquals(false, xz[i]);
275       expectEquals(0, xb[i]);
276       expectEquals(0, xc[i]);
277       expectEquals(0, xs[i]);
278       expectEquals(0, xi[i]);
279       expectEquals(0, xl[i]);
280       expectEquals(0, xf[i]);
281       expectEquals(0, xd[i]);
282     }
283 
284     System.out.println("passed");
285   }
286 
expectEquals(boolean expected, boolean result)287   private static void expectEquals(boolean expected, boolean result) {
288     if (expected != result) {
289       throw new Error("Expected: " + expected + ", found: " + result);
290     }
291   }
292 
expectEquals(int expected, int result)293   private static void expectEquals(int expected, int result) {
294     if (expected != result) {
295       throw new Error("Expected: " + expected + ", found: " + result);
296     }
297   }
298 
expectEquals(long expected, long result)299   private static void expectEquals(long expected, long result) {
300     if (expected != result) {
301       throw new Error("Expected: " + expected + ", found: " + result);
302     }
303   }
304 
expectEquals(float expected, float result)305   private static void expectEquals(float expected, float result) {
306     if (expected != result) {
307       throw new Error("Expected: " + expected + ", found: " + result);
308     }
309   }
310 
expectEquals(double expected, double result)311   private static void expectEquals(double expected, double result) {
312     if (expected != result) {
313       throw new Error("Expected: " + expected + ", found: " + result);
314     }
315   }
316 }
317