On April 27, 2021 5:12:35 PM GMT+02:00, Richard Sandiford <richard.sandif...@arm.com> wrote: >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?
Hmm, I now remember why I didn't adjust this. Because on GENERIC the compares are still there and tree_could_trap_p uses the same helper in the end, thus it cannot handle VEC_COND_EXPR this way I think. Can you double check? Richard. >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; >+}