aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2022-02-09 14:52:24 +0100
committerRichard Biener <rguenther@suse.de>2022-02-09 15:50:02 +0100
commit8f8f8c68b434eb32756284dd8e80cfbdff524a20 (patch)
treec144d16b7b6ee44c9dd4a650e7f18c1110254695
parentd80f2248c5962318c77624a0eab05b81c59add1b (diff)
downloadgcc-8f8f8c68b434eb32756284dd8e80cfbdff524a20.zip
gcc-8f8f8c68b434eb32756284dd8e80cfbdff524a20.tar.gz
gcc-8f8f8c68b434eb32756284dd8e80cfbdff524a20.tar.bz2
middle-end/104464 - ISEL and non-call EH #2
The following adjusts the earlier change to still allow an uncritical replacement. 2022-02-09 Richard Biener <rguenther@suse.de> PR middle-end/104464 * gimple-isel.cc (gimple_expand_vec_cond_expr): Postpone throwing check to after unproblematic replacement. * gcc.dg/pr104464.c: New testcase.
-rw-r--r--gcc/gimple-isel.cc28
-rw-r--r--gcc/testsuite/gcc.dg/pr104464.c11
2 files changed, 25 insertions, 14 deletions
diff --git a/gcc/gimple-isel.cc b/gcc/gimple-isel.cc
index 1d93766..3635585 100644
--- a/gcc/gimple-isel.cc
+++ b/gcc/gimple-isel.cc
@@ -178,11 +178,7 @@ gimple_expand_vec_cond_expr (struct function *fun, gimple_stmt_iterator *gsi,
}
gassign *def_stmt = dyn_cast<gassign *> (SSA_NAME_DEF_STMT (op0));
- if (def_stmt
- /* When the compare has EH we do not want to forward it when
- it has multiple uses and in general because of the complication
- with EH redirection. */
- && !stmt_can_throw_internal (fun, def_stmt))
+ if (def_stmt)
{
tcode = gimple_assign_rhs_code (def_stmt);
op0a = gimple_assign_rhs1 (def_stmt);
@@ -195,7 +191,6 @@ gimple_expand_vec_cond_expr (struct function *fun, gimple_stmt_iterator *gsi,
tcode);
/* Try to fold x CMP y ? -1 : 0 to x CMP y. */
-
if (can_compute_op0
&& integer_minus_onep (op1)
&& integer_zerop (op2)
@@ -207,14 +202,19 @@ gimple_expand_vec_cond_expr (struct function *fun, gimple_stmt_iterator *gsi,
return new_stmt;
}
- if (can_compute_op0
- && used_vec_cond_exprs >= 2
- && (get_vcond_mask_icode (mode, TYPE_MODE (op0_type))
- != CODE_FOR_nothing))
- {
- /* Keep the SSA name and use vcond_mask. */
- tcode = TREE_CODE (op0);
- }
+ /* When the compare has EH we do not want to forward it when
+ it has multiple uses and in general because of the complication
+ with EH redirection. */
+ if (stmt_can_throw_internal (fun, def_stmt))
+ tcode = TREE_CODE (op0);
+
+ /* If we can compute op0 and have multiple uses, keep the SSA
+ name and use vcond_mask. */
+ else if (can_compute_op0
+ && used_vec_cond_exprs >= 2
+ && (get_vcond_mask_icode (mode, TYPE_MODE (op0_type))
+ != CODE_FOR_nothing))
+ tcode = TREE_CODE (op0);
}
else
tcode = TREE_CODE (op0);
diff --git a/gcc/testsuite/gcc.dg/pr104464.c b/gcc/testsuite/gcc.dg/pr104464.c
new file mode 100644
index 0000000..ed6a22c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr104464.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fnon-call-exceptions -fno-tree-dce -fno-tree-forwprop -fsignaling-nans" } */
+
+typedef double __attribute__((__vector_size__(16))) F;
+F f;
+
+void
+foo(void)
+{
+ f += (F)(f != (F){}[0]);
+}