re PR tree-optimization/86479 ([graphite] ICE in gimplify_modify_expr, at gimplify...
authorRichard Biener <rguenther@suse.de>
Thu, 12 Jul 2018 07:11:50 +0000 (07:11 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 12 Jul 2018 07:11:50 +0000 (07:11 +0000)
2018-07-12  Richard Biener  <rguenther@suse.de>

PR middle-end/86479
* fold-const.c (fold_binary_op_with_conditional_arg): Do not
move possibly trapping operations into the conditional.

* gcc.dg/graphite/pr86479.c: New testcase.

From-SVN: r262574

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/graphite/pr86479.c [new file with mode: 0644]

index d8a65861e5ac42b7723d2b72d0b5f491b4463d8f..c36a8a83c264a4e388ce09052431974f73ea79d8 100644 (file)
@@ -1,3 +1,9 @@
+2018-07-12  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/86479
+       * fold-const.c (fold_binary_op_with_conditional_arg): Do not
+       move possibly trapping operations into the conditional.
+
 2018-07-12  Richard Biener  <rguenther@suse.de>
 
        * tree-ssa-sccvn.c (mprts_hook_cnt): Remove.
index 97c435fa5e0dcf4345b10ea214ffc244cd6e2b7d..ac65dcfaf1deb8f656f0c94fbdf21bb5288f0949 100644 (file)
@@ -6587,6 +6587,13 @@ fold_binary_op_with_conditional_arg (location_t loc,
   tree rhs = NULL_TREE;
   enum tree_code cond_code = COND_EXPR;
 
+  /* Do not move possibly trapping operations into the conditional as this
+     pessimizes code and causes gimplification issues when applied late.  */
+  if (operation_could_trap_p (code, FLOAT_TYPE_P (type),
+                             ANY_INTEGRAL_TYPE_P (type)
+                             && TYPE_OVERFLOW_TRAPS (type), op1))
+    return NULL_TREE;
+
   if (TREE_CODE (cond) == COND_EXPR
       || TREE_CODE (cond) == VEC_COND_EXPR)
     {
index e8df3b63a45a5e1cfba6726b49fc82792ea63a30..0958a1a57b21cbdf63788bfe9278344da50805db 100644 (file)
@@ -1,3 +1,8 @@
+2018-07-12  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/86479
+       * gcc.dg/graphite/pr86479.c: New testcase.
+
 2018-07-11  Jakub Jelinek  <jakub@redhat.com>
 
        * gcc.target/i386/avx512bw-vpcmpb-2.c (CMP): Use SIZE macro instead
diff --git a/gcc/testsuite/gcc.dg/graphite/pr86479.c b/gcc/testsuite/gcc.dg/graphite/pr86479.c
new file mode 100644 (file)
index 0000000..7df6354
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -floop-nest-optimize -fnon-call-exceptions -fno-guess-branch-probability -fno-tree-loop-im" } */
+
+__INTPTR_TYPE__ uf;
+
+void
+m7 (__INTPTR_TYPE__ *aw, __INTPTR_TYPE__ ws)
+{
+  __INTPTR_TYPE__ *e5 = &ws;
+
+  if (ws < 1)
+    {
+      int cq = 0;
+
+      while (cq < 1)
+        {
+          int *ng;
+          int *ud;
+
+          *e5 *= uf < 0;
+
+          for (*ng = 0; *ng < 2; ++*ng)
+            {
+            }
+
+          ws /= cq;
+          *aw *= ws;
+
+          for (*ud = 0; *ud < 2; ++*ud)
+            {
+            }
+        }
+    }
+
+  if (ws < 2)
+    e5 = &uf;
+
+  *e5 = 0;
+}