Extend 656-checker-simd-opt test.
This patch adds a more specific test for vectorization
case when we need a runtime test for array references
disambiguation. It also enables checker for x86_64 for
other tests in the file.
Original author: Artem Serov <Artem.Serov@linaro.org>
Test: 656-checker-simd-opt.
Change-Id: I12bbb067fafbc7c22830824a3c06d697b21fcd24
diff --git a/test/656-checker-simd-opt/src/Main.java b/test/656-checker-simd-opt/src/Main.java
index be8c52f..9fc4536 100644
--- a/test/656-checker-simd-opt/src/Main.java
+++ b/test/656-checker-simd-opt/src/Main.java
@@ -28,7 +28,7 @@
/// CHECK-DAG: <<Mul:f\d+>> Mul [<<Get>>,<<Cons>>] loop:<<Loop>> outer_loop:none
/// CHECK-DAG: ArraySet [{{l\d+}},<<Phi>>,<<Mul>>] loop:<<Loop>> outer_loop:none
//
- /// CHECK-START-ARM64: void Main.unroll(float[], float[]) loop_optimization (after)
+ /// CHECK-START-{X86_64,ARM64}: void Main.unroll(float[], float[]) loop_optimization (after)
/// CHECK-DAG: <<Cons:f\d+>> FloatConstant 2.5 loop:none
/// CHECK-IF: hasIsaFeature("sve")
@@ -65,7 +65,7 @@
}
}
- /// CHECK-START-ARM64: void Main.stencil(int[], int[], int) loop_optimization (after)
+ /// CHECK-START-{X86_64,ARM64}: void Main.stencil(int[], int[], int) loop_optimization (after)
/// CHECK-DAG: <<CP1:i\d+>> IntConstant 1 loop:none
/// CHECK-DAG: <<CP2:i\d+>> IntConstant 2 loop:none
/// CHECK-IF: hasIsaFeature("sve")
@@ -100,6 +100,62 @@
}
}
+ // Array size is chosen to be such a constant, that the loop trip count (in the test below)
+ // is a multiple of vector length and unroll factor; hence clean up is needed exclusively for
+ // the array references test.
+ public static final int STENCIL_ARRAY_SIZE = 130;
+
+ /// CHECK-START-{X86_64,ARM64}: void Main.$noinline$stencilConstSize(int[], int[]) loop_optimization (after)
+ /// CHECK-DAG: <<C0:i\d+>> IntConstant 0
+ /// CHECK-DAG: <<CP1:i\d+>> IntConstant 1
+ /// CHECK-DAG: <<CP2:i\d+>> IntConstant 2
+ /// CHECK-DAG: <<Arr0:l\d+>> ParameterValue
+ /// CHECK-DAG: <<Arr1:l\d+>> ParameterValue
+ /// CHECK-DAG: <<ArrCh:z\d+>> NotEqual [<<Arr0>>,<<Arr1>>] loop:none
+ /// CHECK-DAG: <<TCSel:i\d+>> Select [<<C0>>,{{i\d+}},<<ArrCh>>] loop:none
+ /// CHECK-DAG: <<PhiV:i\d+>> Phi [<<C0>>,{{i\d+}}] loop:<<LoopV:B\d+>> outer_loop:none
+ //
+ /// CHECK-IF: hasIsaFeature("sve")
+ //
+ /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<PhiV>>,{{i\d+}}] loop:<<LoopV>> outer_loop:none
+ /// CHECK-DAG: <<Add1:i\d+>> Add [<<PhiV>>,<<CP1>>] loop:<<LoopV>> outer_loop:none
+ /// CHECK-DAG: <<Get1:d\d+>> VecLoad [{{l\d+}},<<PhiV>>,<<LoopP>>] loop:<<LoopV>> outer_loop:none
+ /// CHECK-DAG: <<Get2:d\d+>> VecLoad [{{l\d+}},<<Add1>>,<<LoopP>>] loop:<<LoopV>> outer_loop:none
+ /// CHECK-DAG: <<Add2:d\d+>> VecAdd [<<Get1>>,<<Get2>>,<<LoopP>>] loop:<<LoopV>> outer_loop:none
+ /// CHECK-DAG: <<Add3:i\d+>> Add [<<PhiV>>,<<CP2>>] loop:<<LoopV>> outer_loop:none
+ /// CHECK-DAG: <<Get3:d\d+>> VecLoad [{{l\d+}},<<Add3>>,<<LoopP>>] loop:<<LoopV>> outer_loop:none
+ /// CHECK-DAG: <<Add4:d\d+>> VecAdd [<<Add2>>,<<Get3>>,<<LoopP>>] loop:<<LoopV>> outer_loop:none
+ /// CHECK-DAG: VecStore [{{l\d+}},<<Add1>>,<<Add4>>,<<LoopP>>] loop:<<LoopV>> outer_loop:none
+ //
+ /// CHECK-ELSE:
+ //
+ /// CHECK-DAG: <<Add1:i\d+>> Add [<<PhiV>>,<<CP1>>] loop:<<LoopV>> outer_loop:none
+ /// CHECK-DAG: <<Get1:d\d+>> VecLoad [{{l\d+}},<<PhiV>>] loop:<<LoopV>> outer_loop:none
+ /// CHECK-DAG: <<Get2:d\d+>> VecLoad [{{l\d+}},<<Add1>>] loop:<<LoopV>> outer_loop:none
+ /// CHECK-DAG: <<Add2:d\d+>> VecAdd [<<Get1>>,<<Get2>>] loop:<<LoopV>> outer_loop:none
+ /// CHECK-DAG: <<Add3:i\d+>> Add [<<PhiV>>,<<CP2>>] loop:<<LoopV>> outer_loop:none
+ /// CHECK-DAG: <<Get3:d\d+>> VecLoad [{{l\d+}},<<Add3>>] loop:<<LoopV>> outer_loop:none
+ /// CHECK-DAG: <<Add4:d\d+>> VecAdd [<<Add2>>,<<Get3>>] loop:<<LoopV>> outer_loop:none
+ /// CHECK-DAG: VecStore [{{l\d+}},<<Add1>>,<<Add4>>] loop:<<LoopV>> outer_loop:none
+ //
+ /// CHECK-FI:
+ //
+ // Cleanup loop.
+ //
+ /// CHECK-DAG: <<PhiS:i\d+>> Phi [<<PhiV>>,{{i\d+}}] loop:<<LoopS:B\d+>> outer_loop:none
+ /// CHECK-DAG: ArrayGet loop:<<LoopS>> outer_loop:none
+ /// CHECK-DAG: ArrayGet loop:<<LoopS>> outer_loop:none
+ /// CHECK-DAG: ArrayGet loop:<<LoopS>> outer_loop:none
+ /// CHECK-DAG: ArraySet loop:<<LoopS>> outer_loop:none
+ //
+ // Checks the disambiguation runtime test for array references.
+ //
+ private static void $noinline$stencilConstSize(int[] a, int[] b) {
+ for (int i = 1; i < STENCIL_ARRAY_SIZE - 1; i++) {
+ a[i] = b[i - 1] + b[i] + b[i + 1];
+ }
+ }
+
/// CHECK-START: void Main.stencilAddInt(int[], int[], int) loop_optimization (before)
/// CHECK-DAG: <<CP1:i\d+>> IntConstant 1 loop:none
/// CHECK-DAG: <<CM1:i\d+>> IntConstant -1 loop:none
@@ -217,7 +273,7 @@
/// CHECK-DAG: <<Add2>> Add [<<Phi2>>,<<Get>>] loop:<<Loop>> outer_loop:none
/// CHECK-DAG: <<Add1>> Add [<<Phi1>>,<<L1>>] loop:<<Loop>> outer_loop:none
//
- /// CHECK-START-ARM64: long Main.longInductionReduction(long[]) loop_optimization (after)
+ /// CHECK-START-{X86_64,ARM64}: long Main.longInductionReduction(long[]) loop_optimization (after)
/// CHECK-DAG: <<L0:j\d+>> LongConstant 0 loop:none
/// CHECK-DAG: <<L1:j\d+>> LongConstant 1 loop:none
/// CHECK-DAG: <<I0:i\d+>> IntConstant 0 loop:none
@@ -260,7 +316,7 @@
/// CHECK-DAG: ArraySet [{{l\d+}},<<Phi>>,<<Cnv>>] loop:<<Loop>> outer_loop:none
/// CHECK-DAG: <<Add>> Add [<<Phi>>,<<I1>>] loop:<<Loop>> outer_loop:none
//
- /// CHECK-START-ARM64: void Main.intVectorLongInvariant(int[], long[]) loop_optimization (after)
+ /// CHECK-START-{X86_64,ARM64}: void Main.intVectorLongInvariant(int[], long[]) loop_optimization (after)
/// CHECK-DAG: <<I0:i\d+>> IntConstant 0 loop:none
/// CHECK-DAG: <<I1:i\d+>> IntConstant 1 loop:none
/// CHECK-DAG: <<Get:j\d+>> ArrayGet [{{l\d+}},<<I0>>] loop:none
@@ -300,7 +356,7 @@
/// CHECK-DAG: ArraySet [{{l\d+}},<<Phi>>,<<Cnv2>>] loop:<<Loop>> outer_loop:none
/// CHECK-DAG: <<Add>> Add [<<Phi>>,<<I1>>] loop:<<Loop>> outer_loop:none
//
- /// CHECK-START-ARM64: void Main.longCanBeDoneWithInt(int[], int[]) loop_optimization (after)
+ /// CHECK-START-{X86_64,ARM64}: void Main.longCanBeDoneWithInt(int[], int[]) loop_optimization (after)
/// CHECK-DAG: <<I0:i\d+>> IntConstant 0 loop:none
/// CHECK-DAG: <<L1:j\d+>> LongConstant 1 loop:none
/// CHECK-DAG: <<Cnv:i\d+>> TypeConversion [<<L1>>] loop:none
@@ -345,13 +401,17 @@
}
}
+ private static void initArrayStencil(int[] arr) {
+ for (int i = 0; i < arr.length; i++) {
+ arr[i] = i;
+ }
+ }
+
static void testStencil1() {
int[] a = new int[100];
int[] b = new int[100];
- for (int i = 0; i < 100; i++) {
- a[i] = 0;
- b[i] = i;
- }
+ initArrayStencil(b);
+
stencil(a, b, 100);
for (int i = 1; i < 99; i++) {
int e = i + i + i;
@@ -360,13 +420,35 @@
}
}
+ // Checks the disambiguation runtime test for array references.
+ static void testStencilConstSize() {
+ int[] a = new int[STENCIL_ARRAY_SIZE];
+ int[] b = new int[STENCIL_ARRAY_SIZE];
+ initArrayStencil(b);
+
+ for (int i = 1; i < STENCIL_ARRAY_SIZE - 1; i++) {
+ $noinline$stencilConstSize(a, b);
+ // (i - 1) + i + (i + 1) = 3 * i.
+ int e = i + i + i;
+ expectEquals(e, a[i]);
+ expectEquals(i, b[i]);
+ }
+
+ initArrayStencil(b);
+ $noinline$stencilConstSize(b, b);
+
+ for (int i = 1; i < STENCIL_ARRAY_SIZE - 1; i++) {
+ // The formula of the ith member of recurrent def: b[i] = b[i-1] + (i) + (i+1).
+ int e = i * (i + 2);
+ expectEquals(e, b[i]);
+ }
+ }
+
static void testStencil2() {
int[] a = new int[100];
int[] b = new int[100];
- for (int i = 0; i < 100; i++) {
- a[i] = 0;
- b[i] = i;
- }
+ initArrayStencil(b);
+
stencilSubInt(a, b, 100);
for (int i = 1; i < 99; i++) {
int e = i + i + i;
@@ -378,10 +460,8 @@
static void testStencil3() {
int[] a = new int[100];
int[] b = new int[100];
- for (int i = 0; i < 100; i++) {
- a[i] = 0;
- b[i] = i;
- }
+ initArrayStencil(b);
+
stencilAddInt(a, b, 100);
for (int i = 1; i < 99; i++) {
int e = i + i + i;
@@ -408,6 +488,7 @@
public static void main(String[] args) {
testUnroll();
testStencil1();
+ testStencilConstSize();
testStencil2();
testStencil3();
testTypes();