g++.dg/alias-checks.C requires vect_double outside vect.exp, where
-msse2 would have got enabled, but that effective_target passes even
when SSE2 is indeed disabled and we're testing on ancient 32-bit
hardware that doesn't even support SSE2.  Without SSE2, vectors of
doubles aren't really available, and so we don't get the expected
vectorizations and the test fails.

ISTM, from the way vect_double is documented, that testing for
sse2_runtime would be called for, but that feels excessive: since
vect.exp enables -msse2 for compile-time vect tests, even when runtime
support is not present, we should ideally be able to exercise
compile-time vect_double tests.  But we can't test for (let alone
cache results) with test- or testset compiler flags, or with compiler
macros they'd define, or even depending on whether we're running a
compile- or run-time test.  (The preexisting tests for __tune_atom__
make me uncomfortable already.)

So I'm sticking to the documented behavior of vect_double, even if
that will lose us some compile-time vect_double testing on targets
that can't run SSE2 code.  Most x86 variants in use have SSE2 anyway,
so it's probably not a significant loss.

I've amended vect_doubleint_cvt and vect_intdouble_cvt while at that,
though there aren't any failing uses thereof AFAICT.

But then, when we attempt to test alias-checks.C on a target that
supports SSE2, but doesn't have it enabled, vect_double passes and we
still don't get the desired vectorization, because we haven't enabled
it.  Instead of adding machine-specific options to alias-checks.C, I'm
moving it under g++.dg/vect/ and renaming it so that it gets, and
doesn't override, the default vector options for each platform.

Regstrapped on x86_64-linux-gnu.  Also tested with ppc-vx7r2,
ppc64-vx7r2, arm-vx7r2, aarch64-vx7r2, x86_64-vx7r2, and x86-vx7r2.  Ok
to install?


for  gcc/testsuite/ChangeLog

        * lib/target-supports.exp
        (check_effective_target_vect_double): Check for sse2_runtime.
        (check_effective_target_vect_doubleint_cvt): Likewise.
        (check_effective_target_vect_intdouble_cvt): Likewise.
        * g++.dg/alias-checks.C: Rename to...
        * g++.dg/vect/vect-alias-checks.C: ... this.  Don't override
        vector options.
---
 gcc/testsuite/g++.dg/alias-checks.C           |   86 -------------------------
 gcc/testsuite/g++.dg/vect/vect-alias-checks.C |   86 +++++++++++++++++++++++++
 gcc/testsuite/lib/target-supports.exp         |    3 +
 3 files changed, 89 insertions(+), 86 deletions(-)
 delete mode 100644 gcc/testsuite/g++.dg/alias-checks.C
 create mode 100644 gcc/testsuite/g++.dg/vect/vect-alias-checks.C

diff --git a/gcc/testsuite/g++.dg/alias-checks.C 
b/gcc/testsuite/g++.dg/alias-checks.C
deleted file mode 100644
index b8ff3ad605c23..0000000000000
--- a/gcc/testsuite/g++.dg/alias-checks.C
+++ /dev/null
@@ -1,86 +0,0 @@
-
-// { dg-do compile }
-// { dg-require-effective-target c++17 }
-// { dg-require-effective-target vect_double }
-// { dg-options "-O3 -fdump-tree-vect-all" }
-// { dg-skip-if "required hosted libstdc++ for cmath and iostream" { ! 
hostedlib } }
-
-#include <cstdlib>
-#include <cmath>
-#include <iostream>
-void DoIfClause(double *l, double *r, const double *m2, const double *m1,
-        const double *c, const double *p1, const double *p2, int istart, int 
iend)
-{
-    constexpr double w5alpha[3][3] = {{1.0 / 3.0, -7.0 / 6.0, 11.0 / 6.0},
-        {-1.0 / 6.0, 5.0 / 6.0, 1.0 / 3.0},
-        {1.0 / 3.0, 5.0 / 6.0, -1.0 / 6.0}};
-    constexpr double w5gamma[3] = {0.1, 0.6, 0.3};
-    constexpr double eps = 1e-100;
-    constexpr double thirteen_thirds = 13.0 / 3.0;
-
-    for (int i = istart; i <= iend; ++i) {
-        const double q0 = m2[i];
-        const double q1 = m1[i];
-        const double q2 = c[i];
-        const double q3 = p1[i];
-        const double q4 = p2[i];
-        double &ql = l[i];
-        double &qr = r[i];
-        double a = q0 - 2 * q1 + q2;
-        double b = q0 - 4.0 * q1 + 3.0 * q2;
-        double beta0 = thirteen_thirds * a * a + b * b + eps;
-        a = q1 - 2.0 * q2 + q3;
-        b = q3 - q1;
-        double beta1 = thirteen_thirds * a * a + b * b + eps;
-        a = q2 - 2.0 * q3 + q4;
-        b = q4 - 4.0 * q3 + 3.0 * q2;
-        double beta2 = thirteen_thirds * a * a + b * b + eps;
-        const double tau5 = std::abs(beta2 - beta0);
-
-        beta0 = (beta0 + tau5) / beta0;
-        beta1 = (beta1 + tau5) / beta1;
-        beta2 = (beta2 + tau5) / beta2;
-
-        double w0 = w5gamma[0] * beta0 + eps;
-        double w1 = w5gamma[1] * beta1 + eps;
-        double w2 = w5gamma[2] * beta2 + eps;
-        double wsum = 1.0 / (w0 + w1 + w2);
-        ql = w0 * (w5alpha[0][0] * q0 + w5alpha[0][1] * q1 + w5alpha[0][2] * 
q2);
-        ql += w1 * (w5alpha[1][0] * q1 + w5alpha[1][1] * q2 + w5alpha[1][2] * 
q3);
-        ql += w2 * (w5alpha[2][0] * q2 + w5alpha[2][1] * q3 + w5alpha[2][2] * 
q4);
-        ql *= wsum;
-        const double alpha_l = 3.0 * wsum * w0 * w1 * w2 /
-            (w5gamma[2] * w0 * w1 + w5gamma[1] * w0 * w2 +
-             w5gamma[0] * w1 * w2) +
-            eps;
-
-        w0 = w5gamma[0] * beta2 + eps;
-        w1 = w5gamma[1] * beta1 + eps;
-        w2 = w5gamma[2] * beta0 + eps;
-        wsum = 1.0 / (w0 + w1 + w2);
-        qr = w0 * (w5alpha[0][0] * q4 + w5alpha[0][1] * q3 + w5alpha[0][2] * 
q2);
-        qr += w1 * (w5alpha[1][0] * q3 + w5alpha[1][1] * q2 + w5alpha[1][2] * 
q1);
-        qr += w2 * (w5alpha[2][0] * q2 + w5alpha[2][1] * q1 + w5alpha[2][2] * 
q0);
-        qr *= wsum;
-        const double alpha_r = 3.0 * wsum * w0 * w1 * w2 /
-            (w5gamma[2] * w0 * w1 + w5gamma[1] * w0 * w2 +
-             w5gamma[0] * w1 * w2) +
-            eps;
-
-        double dq = q3 - q2;
-        {
-            const double dm = q2 - q1;
-            const double dp = dq;
-            const double dc = (dm * dp > 0.0) * 0.5 * (dm + dp);
-            dq = 0.5 * std::copysign(
-                    std::min(std::fabs(dc),
-                        2.0 * std::min(std::fabs(dm), std::fabs(dp))),
-                    dc);
-        }
-
-        const double alpha_lin = 2.0 * alpha_l * alpha_r / (alpha_l + alpha_r);
-        ql = alpha_lin * ql + (1.0 - alpha_lin) * (q2 + dq);
-        qr = alpha_lin * qr + (1.0 - alpha_lin) * (q2 - dq);
-    }
-}
-/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */
diff --git a/gcc/testsuite/g++.dg/vect/vect-alias-checks.C 
b/gcc/testsuite/g++.dg/vect/vect-alias-checks.C
new file mode 100644
index 0000000000000..97c97d2c99e0d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/vect/vect-alias-checks.C
@@ -0,0 +1,86 @@
+
+// { dg-do compile }
+// { dg-require-effective-target c++17 }
+// { dg-require-effective-target vect_double }
+// { dg-additional-options "-O3 -fdump-tree-vect-all" }
+// { dg-skip-if "required hosted libstdc++ for cmath and iostream" { ! 
hostedlib } }
+
+#include <cstdlib>
+#include <cmath>
+#include <iostream>
+void DoIfClause(double *l, double *r, const double *m2, const double *m1,
+        const double *c, const double *p1, const double *p2, int istart, int 
iend)
+{
+    constexpr double w5alpha[3][3] = {{1.0 / 3.0, -7.0 / 6.0, 11.0 / 6.0},
+        {-1.0 / 6.0, 5.0 / 6.0, 1.0 / 3.0},
+        {1.0 / 3.0, 5.0 / 6.0, -1.0 / 6.0}};
+    constexpr double w5gamma[3] = {0.1, 0.6, 0.3};
+    constexpr double eps = 1e-100;
+    constexpr double thirteen_thirds = 13.0 / 3.0;
+
+    for (int i = istart; i <= iend; ++i) {
+        const double q0 = m2[i];
+        const double q1 = m1[i];
+        const double q2 = c[i];
+        const double q3 = p1[i];
+        const double q4 = p2[i];
+        double &ql = l[i];
+        double &qr = r[i];
+        double a = q0 - 2 * q1 + q2;
+        double b = q0 - 4.0 * q1 + 3.0 * q2;
+        double beta0 = thirteen_thirds * a * a + b * b + eps;
+        a = q1 - 2.0 * q2 + q3;
+        b = q3 - q1;
+        double beta1 = thirteen_thirds * a * a + b * b + eps;
+        a = q2 - 2.0 * q3 + q4;
+        b = q4 - 4.0 * q3 + 3.0 * q2;
+        double beta2 = thirteen_thirds * a * a + b * b + eps;
+        const double tau5 = std::abs(beta2 - beta0);
+
+        beta0 = (beta0 + tau5) / beta0;
+        beta1 = (beta1 + tau5) / beta1;
+        beta2 = (beta2 + tau5) / beta2;
+
+        double w0 = w5gamma[0] * beta0 + eps;
+        double w1 = w5gamma[1] * beta1 + eps;
+        double w2 = w5gamma[2] * beta2 + eps;
+        double wsum = 1.0 / (w0 + w1 + w2);
+        ql = w0 * (w5alpha[0][0] * q0 + w5alpha[0][1] * q1 + w5alpha[0][2] * 
q2);
+        ql += w1 * (w5alpha[1][0] * q1 + w5alpha[1][1] * q2 + w5alpha[1][2] * 
q3);
+        ql += w2 * (w5alpha[2][0] * q2 + w5alpha[2][1] * q3 + w5alpha[2][2] * 
q4);
+        ql *= wsum;
+        const double alpha_l = 3.0 * wsum * w0 * w1 * w2 /
+            (w5gamma[2] * w0 * w1 + w5gamma[1] * w0 * w2 +
+             w5gamma[0] * w1 * w2) +
+            eps;
+
+        w0 = w5gamma[0] * beta2 + eps;
+        w1 = w5gamma[1] * beta1 + eps;
+        w2 = w5gamma[2] * beta0 + eps;
+        wsum = 1.0 / (w0 + w1 + w2);
+        qr = w0 * (w5alpha[0][0] * q4 + w5alpha[0][1] * q3 + w5alpha[0][2] * 
q2);
+        qr += w1 * (w5alpha[1][0] * q3 + w5alpha[1][1] * q2 + w5alpha[1][2] * 
q1);
+        qr += w2 * (w5alpha[2][0] * q2 + w5alpha[2][1] * q1 + w5alpha[2][2] * 
q0);
+        qr *= wsum;
+        const double alpha_r = 3.0 * wsum * w0 * w1 * w2 /
+            (w5gamma[2] * w0 * w1 + w5gamma[1] * w0 * w2 +
+             w5gamma[0] * w1 * w2) +
+            eps;
+
+        double dq = q3 - q2;
+        {
+            const double dm = q2 - q1;
+            const double dp = dq;
+            const double dc = (dm * dp > 0.0) * 0.5 * (dm + dp);
+            dq = 0.5 * std::copysign(
+                    std::min(std::fabs(dc),
+                        2.0 * std::min(std::fabs(dm), std::fabs(dp))),
+                    dc);
+        }
+
+        const double alpha_lin = 2.0 * alpha_l * alpha_r / (alpha_l + alpha_r);
+        ql = alpha_lin * ql + (1.0 - alpha_lin) * (q2 + dq);
+        qr = alpha_lin * qr + (1.0 - alpha_lin) * (q2 - dq);
+    }
+}
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */
diff --git a/gcc/testsuite/lib/target-supports.exp 
b/gcc/testsuite/lib/target-supports.exp
index 3653f322dc3bc..8a8bc8b50df28 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -4840,6 +4840,7 @@ proc check_effective_target_vect_intfloat_cvt { } {
 proc check_effective_target_vect_doubleint_cvt { } {
     return [check_cached_effective_target vect_doubleint_cvt {
       expr { ([check_effective_target_x86]
+             && [check_effective_target_sse2_runtime]
              && [check_no_compiler_messages vect_doubleint_cvt assembly {
                   #ifdef __tune_atom__
                   # error No double vectorizer support.
@@ -4863,6 +4864,7 @@ proc check_effective_target_vect_doubleint_cvt { } {
 proc check_effective_target_vect_intdouble_cvt { } {
     return [check_cached_effective_target vect_intdouble_cvt {
       expr { ([check_effective_target_x86]
+             && [check_effective_target_sse2_runtime]
              && [check_no_compiler_messages vect_intdouble_cvt assembly {
                  #ifdef __tune_atom__
                  # error No double vectorizer support.
@@ -8473,6 +8475,7 @@ proc check_effective_target_vect_float_strict { } {
 proc check_effective_target_vect_double { } {
     return [check_cached_effective_target vect_double {
        expr { ([check_effective_target_x86]
+               && [check_effective_target_sse2_runtime]
                && [check_no_compiler_messages vect_double assembly {
                  #ifdef __tune_atom__
                  # error No double vectorizer support.

-- 
Alexandre Oliva, happy hacker            https://blog.lx.oliva.nom.br/
Free Software Activist     FSFLA co-founder     GNU Toolchain Engineer
More tolerance and less prejudice are key for inclusion and diversity.
Excluding neuro-others for not behaving ""normal"" is *not* inclusive!

Reply via email to