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;
>+}

Reply via email to