]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/60930 (Wrong folding of - ((unsigned long long) a * (unsigned...
authorBill Schmidt <wschmidt@linux.vnet.ibm.com>
Fri, 25 Apr 2014 14:28:58 +0000 (14:28 +0000)
committerWilliam Schmidt <wschmidt@gcc.gnu.org>
Fri, 25 Apr 2014 14:28:58 +0000 (14:28 +0000)
[gcc]

2014-04-25  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

PR tree-optimization/60930
* gimple-ssa-strength-reduction.c (create_mul_imm_cand):  Reject
creating a multiply candidate by folding two constant
multiplicands when the result overflows.

[gcc/testsuite]

2014-04-25  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

PR tree-optimization/60930
* gcc.dg/torture/pr60930.c:  New test.

From-SVN: r209805

gcc/ChangeLog
gcc/gimple-ssa-strength-reduction.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr60930.c [new file with mode: 0644]

index b5f0816bc7315a9cd7d389a07dad0f9b978c3e68..228404c3b662967360a1aecd361d49c3d719ab2f 100644 (file)
@@ -1,3 +1,10 @@
+2014-04-25  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
+
+       PR tree-optimization/60930
+       * gimple-ssa-strength-reduction.c (create_mul_imm_cand):  Reject
+       creating a multiply candidate by folding two constant
+       multiplicands when the result overflows.
+
 2014-04-25  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/60960
index ff55d0eff67f1ae716dc6eff975a54ba6800033d..321cb15eb0ab4ae0577d73bdbad78c55f353c663 100644 (file)
@@ -1114,15 +1114,18 @@ create_mul_imm_cand (gimple gs, tree base_in, tree stride_in, bool speed)
             X = Y * c
             ============================
             X = (B + i') * (S * c)  */
-         base = base_cand->base_expr;
-         index = base_cand->index;
          temp = tree_to_double_int (base_cand->stride)
                 * tree_to_double_int (stride_in);
-         stride = double_int_to_tree (TREE_TYPE (stride_in), temp);
-         ctype = base_cand->cand_type;
-         if (has_single_use (base_in))
-           savings = (base_cand->dead_savings 
-                      + stmt_cost (base_cand->cand_stmt, speed));
+         if (double_int_fits_to_tree_p (TREE_TYPE (stride_in), temp))
+           {
+             base = base_cand->base_expr;
+             index = base_cand->index;
+             stride = double_int_to_tree (TREE_TYPE (stride_in), temp);
+             ctype = base_cand->cand_type;
+             if (has_single_use (base_in))
+               savings = (base_cand->dead_savings 
+                          + stmt_cost (base_cand->cand_stmt, speed));
+           }
        }
       else if (base_cand->kind == CAND_ADD && integer_onep (base_cand->stride))
        {
index 728a267812f0e06e482cc876ca9cf642bed31fbc..0d65bef0ad09596f3328cd54d830a30209535aaa 100644 (file)
@@ -1,3 +1,8 @@
+2014-04-25  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
+
+       PR tree-optimization/60930
+       * gcc.dg/torture/pr60930.c:  New test.
+
 2014-04-25  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/60960
diff --git a/gcc/testsuite/gcc.dg/torture/pr60930.c b/gcc/testsuite/gcc.dg/torture/pr60930.c
new file mode 100644 (file)
index 0000000..5e35f19
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do run } */
+
+int x = 1;
+
+__attribute__((noinline, noclone)) void
+foo (unsigned long long t)
+{
+  asm volatile ("" : : "r" (&t));
+  if (t == 1)
+    __builtin_abort ();
+}
+
+int
+main ()
+{
+#if __SIZEOF_LONG_LONG__ >= 8
+  unsigned long long t = 0xffffffffffffffffULL * (0xffffffffUL * x);
+  if (t != 0xffffffff00000001ULL)
+    foo (t);;
+#endif
+  return 0;
+}