]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/54703 (_mm_sub_pd is incorrectly substituted with vandnps)
authorJakub Jelinek <jakub@redhat.com>
Thu, 27 Sep 2012 10:48:07 +0000 (12:48 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 27 Sep 2012 10:48:07 +0000 (12:48 +0200)
PR target/54703
* simplify-rtx.c (simplify_binary_operation_1): Perform
(x - (x & y)) -> (x & ~y) optimization only for integral
modes.

* gcc.target/i386/pr54703.c: New test.

From-SVN: r191801

gcc/ChangeLog
gcc/simplify-rtx.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr54703.c [new file with mode: 0644]

index 5850528c51e9d7f46688a793f1593a64e22e74a7..747039adfcef83491887f54789abdcc6ddcc568b 100644 (file)
@@ -1,3 +1,10 @@
+2012-09-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/54703
+       * simplify-rtx.c (simplify_binary_operation_1): Perform
+       (x - (x & y)) -> (x & ~y) optimization only for integral
+       modes.
+
 2012-09-27  Marc Glisse  <marc.glisse@inria.fr>
 
        PR c/53024
index 6b4b9f05d6550cd96e1413397ff6c6e5a2812508..af85ccc0836858895a4599be4386e6a1665d6bec 100644 (file)
@@ -2239,7 +2239,7 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
                                    neg_const_int (mode, op1));
 
       /* (x - (x & y)) -> (x & ~y) */
-      if (GET_CODE (op1) == AND)
+      if (INTEGRAL_MODE_P (mode) && GET_CODE (op1) == AND)
        {
          if (rtx_equal_p (op0, XEXP (op1, 0)))
            {
index ac9e619db75c8fc9817dfc294c79b8e1c7379580..c23166ee24a82bb545709169009b0dd792a6194d 100644 (file)
@@ -1,3 +1,8 @@
+2012-09-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/54703
+       * gcc.target/i386/pr54703.c: New test.
+
 2012-09-27  Richard Guenther  <rguenther@suse.de>
 
        PR lto/54709
diff --git a/gcc/testsuite/gcc.target/i386/pr54703.c b/gcc/testsuite/gcc.target/i386/pr54703.c
new file mode 100644 (file)
index 0000000..e30c293
--- /dev/null
@@ -0,0 +1,36 @@
+/* PR target/54703 */
+/* { dg-do run { target sse2_runtime } } */
+/* { dg-options "-O -msse2" } */
+/* { dg-additional-options "-mavx -mtune=bdver1" { target avx_runtime } } */
+
+extern void abort (void);
+typedef double V __attribute__((vector_size(16)));
+
+union {
+  unsigned long long m[2];
+  V v;
+} u = { { 0xffffffffff000000ULL, 0xffffffffff000000ULL } };
+
+static inline V
+foo (V x)
+{
+  V y = __builtin_ia32_andpd (x, u.v);
+  V z = __builtin_ia32_subpd (x, y);
+  return __builtin_ia32_mulpd (y, z);
+}
+
+void
+test (V *x)
+{
+  V a = { 2.1, 2.1 };
+  *x = foo (foo (a));
+}
+
+int
+main ()
+{
+  test (&u.v);
+  if (u.m[0] != 0x3acbf487f0a30550ULL || u.m[1] != u.m[0])
+    abort ();
+  return 0;
+}