]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
middle-end/104464 - ISEL and non-call EH #2
authorRichard Biener <rguenther@suse.de>
Wed, 9 Feb 2022 13:52:24 +0000 (14:52 +0100)
committerRichard Biener <rguenther@suse.de>
Wed, 9 Feb 2022 14:50:02 +0000 (15:50 +0100)
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.

gcc/gimple-isel.cc
gcc/testsuite/gcc.dg/pr104464.c [new file with mode: 0644]

index 1d93766b704e08070dd9be48556e3ae9ee3c786f..3635585bf454d1426b17bbb69b6188949ad60a15 100644 (file)
@@ -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 (file)
index 0000000..ed6a22c
--- /dev/null
@@ -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]);
+}