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.
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.
/* 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). */
--- /dev/null
+/* { dg-options "-O3" } */
+
+unsigned int a, b;
+
+void
+foo (void)
+{
+ for (b = 0; b < 13; b += 2)
+ a &= !!b;
+}
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