Now that VEC_COND_EXPR has normal unnested operands,
operation_could_trap_p can treat it like any other expression.

This fixes many testsuite ICEs for SVE, but it turns out that none
of the tests in gcc.target/aarch64/sve were affected.  Anyone testing
on non-SVE aarch64 therefore wouldn't have seen it.

Tested on aarch64-linux-gnu (with and without SVE).  OK to install?

Richard


gcc/
        PR middle-end/100284
        * gimple.c (gimple_could_trap_p_1): Remove VEC_COND_EXPR test.
        * tree-eh.c (operation_could_trap_p): Handle VEC_COND_EXPR rather
        than asserting on it.

gcc/testsuite/
        PR middle-end/100284
        * gcc.target/aarch64/sve/pr81003.c: New test.
---
 gcc/gimple.c                                   |  3 ---
 gcc/testsuite/gcc.target/aarch64/sve/pr81003.c | 10 ++++++++++
 gcc/tree-eh.c                                  |  6 +++---
 3 files changed, 13 insertions(+), 6 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr81003.c

diff --git a/gcc/gimple.c b/gcc/gimple.c
index d067656d315..f1044e9c630 100644
--- a/gcc/gimple.c
+++ b/gcc/gimple.c
@@ -2161,9 +2161,6 @@ gimple_could_trap_p_1 (gimple *s, bool include_mem, bool 
include_stores)
       /* For COND_EXPR only the condition may trap.  */
       if (op == COND_EXPR)
        return tree_could_trap_p (gimple_assign_rhs1 (s));
-      /* A VEC_COND_EXPR cannot trap.  */
-      else if (op == VEC_COND_EXPR)
-       return false;
 
       /* For comparisons we need to check rhs operand types instead of rhs type
          (which is BOOLEAN_TYPE).  */
diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c
index a68778b9809..601285c401c 100644
--- a/gcc/tree-eh.c
+++ b/gcc/tree-eh.c
@@ -2541,9 +2541,9 @@ operation_could_trap_p (enum tree_code op, bool 
fp_operation, bool honor_trapv,
   bool honor_snans = fp_operation && flag_signaling_nans != 0;
   bool handled;
 
-  /* This function cannot tell whether or not COND_EXPR and VEC_COND_EXPR could
-     trap, because that depends on the respective condition op.  */
-  gcc_assert (op != COND_EXPR && op != VEC_COND_EXPR);
+  /* This function cannot tell whether or not COND_EXPR could trap,
+     because that depends on its condition op.  */
+  gcc_assert (op != COND_EXPR);
 
   if (TREE_CODE_CLASS (op) != tcc_comparison
       && TREE_CODE_CLASS (op) != tcc_unary
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr81003.c 
b/gcc/testsuite/gcc.target/aarch64/sve/pr81003.c
new file mode 100644
index 00000000000..661a6f97d6d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/pr81003.c
@@ -0,0 +1,10 @@
+/* { dg-options "-O3" } */
+
+unsigned int a, b;
+
+void
+foo (void)
+{
+  for (b = 0; b < 13; b += 2)
+    a &= !!b;
+}

Reply via email to