re PR middle-end/92063 (ICE in operation_could_trap_p, at tree-eh.c:2528 when compili...
authorJakub Jelinek <jakub@redhat.com>
Sat, 12 Oct 2019 12:21:45 +0000 (14:21 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 12 Oct 2019 12:21:45 +0000 (14:21 +0200)
PR middle-end/92063
* tree-eh.c (operation_could_trap_helper_p) <case COND_EXPR>
<case VEC_COND_EXPR>: Return false with *handled = false.
(tree_could_trap_p): For {,VEC_}COND_EXPR return false instead of
recursing on the first operand.
* fold-const.c (simple_operand_p_2): Use generic_expr_could_trap_p
instead of tree_could_trap_p.
* tree-ssa-sccvn.c (vn_nary_may_trap): Formatting fixes.

* gcc.c-torture/compile/pr92063.c: New test.

From-SVN: r276915

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr92063.c [new file with mode: 0644]
gcc/tree-eh.c
gcc/tree-ssa-sccvn.c

index 12613f7f639b6553133703cb13f797939e26fbe2..800b8cef5245ac5c9409acf84adafb3800fa1e01 100644 (file)
@@ -1,3 +1,14 @@
+2019-10-12  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/92063
+       * tree-eh.c (operation_could_trap_helper_p) <case COND_EXPR>
+       <case VEC_COND_EXPR>: Return false with *handled = false.
+       (tree_could_trap_p): For {,VEC_}COND_EXPR return false instead of
+       recursing on the first operand.
+       * fold-const.c (simple_operand_p_2): Use generic_expr_could_trap_p
+       instead of tree_could_trap_p.
+       * tree-ssa-sccvn.c (vn_nary_may_trap): Formatting fixes.
+
 2019-10-11  Jim Wilson  <jimw@sifive.com>
 
        PR rtl-optimization/91860
index a99dafec589ade7c49d4596619c4b8e92ff7a69b..58b967e48fee11fee98436e14a50b61c4312fa65 100644 (file)
@@ -4447,8 +4447,7 @@ simple_operand_p_2 (tree exp)
 {
   enum tree_code code;
 
-  if (TREE_SIDE_EFFECTS (exp)
-      || tree_could_trap_p (exp))
+  if (TREE_SIDE_EFFECTS (exp) || generic_expr_could_trap_p (exp))
     return false;
 
   while (CONVERT_EXPR_P (exp))
index 14b5da645ec25063fbb240da095688252d885363..2f46d4dd8572c3d3c39f5b96a750c73a8c059f60 100644 (file)
@@ -1,5 +1,8 @@
 2019-10-12  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/92063
+       * gcc.c-torture/compile/pr92063.c: New test.
+
        * c-c++-common/gomp/declare-variant-2.c: Adjust for error recovery
        improvements.  Add new tests.
        * c-c++-common/gomp/declare-variant-4.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr92063.c b/gcc/testsuite/gcc.c-torture/compile/pr92063.c
new file mode 100644 (file)
index 0000000..bb704ab
--- /dev/null
@@ -0,0 +1,7 @@
+/* PR middle-end/92063 */
+
+int
+foo (int a, int b, int *c, short *d)
+{
+  return (c[0] ? b : 0) == 'y' && ((a ? d[0] : c[0]) ? b : 0) == 'c';
+}
index 7a028735d4ea50bdf68a1bc4c84d929435d2c9fe..54502e6f93c6947ba30c02a6477ba70af09cfd96 100644 (file)
@@ -2499,6 +2499,14 @@ operation_could_trap_helper_p (enum tree_code op,
       /* Constructing an object cannot trap.  */
       return false;
 
+    case COND_EXPR:
+    case VEC_COND_EXPR:
+      /* Whether *COND_EXPR can trap depends on whether the
+        first argument can trap, so signal it as not handled.
+        Whether lhs is floating or not doesn't matter.  */
+      *handled = false;
+      return false;
+
     default:
       /* Any floating arithmetic may trap.  */
       if (fp_operation && flag_trapping_math)
@@ -2614,9 +2622,12 @@ tree_could_trap_p (tree expr)
   if (!expr)
     return false;
 
-  /* For COND_EXPR and VEC_COND_EXPR only the condition may trap.  */
+  /* In COND_EXPR and VEC_COND_EXPR only the condition may trap, but
+     they won't appear as operands in GIMPLE form, so this is just for the
+     GENERIC uses where it needs to recurse on the operands and so
+     *COND_EXPR itself doesn't trap.  */
   if (TREE_CODE (expr) == COND_EXPR || TREE_CODE (expr) == VEC_COND_EXPR)
-    expr = TREE_OPERAND (expr, 0);
+    return false;
 
   code = TREE_CODE (expr);
   t = TREE_TYPE (expr);
index 364d0d0ca4ff8b2fed0d6a0b2a1ec5150a2af2ab..57331ab44dc78c16d97065cd28e8c4cdcbf8d96e 100644 (file)
@@ -5105,18 +5105,15 @@ vn_nary_may_trap (vn_nary_op_t nary)
          honor_nans = flag_trapping_math && !flag_finite_math_only;
          honor_snans = flag_signaling_nans != 0;
        }
-      else if (INTEGRAL_TYPE_P (type)
-              && TYPE_OVERFLOW_TRAPS (type))
+      else if (INTEGRAL_TYPE_P (type) && TYPE_OVERFLOW_TRAPS (type))
        honor_trapv = true;
     }
   if (nary->length >= 2)
     rhs2 = nary->op[1];
   ret = operation_could_trap_helper_p (nary->opcode, fp_operation,
-                                      honor_trapv,
-                                      honor_nans, honor_snans, rhs2,
-                                      &handled);
-  if (handled
-      && ret)
+                                      honor_trapv, honor_nans, honor_snans,
+                                      rhs2, &handled);
+  if (handled && ret)
     return true;
 
   for (i = 0; i < nary->length; ++i)