The problem with these patterns is they will do a copy of the comparison
so for non-call exceptions (and trapping math), we could copy a statement
that can throw internally and then remove the landing pad information.
Or in the case of throwing externally, always create a copy from GIMPLE_COND.

That is if we have:
```
_2 = _1 < 0.0;
if (_2 != 0)
```
this pattern will cause a copy to be produced:
```
_2 = _1 < 0.0;
_3 = _1 < 0.0;
if (_3 != 0)
```

So let's restrict these pattern to only non-call exception throwing comparisons.
There is a pattern below that already handles `bool_name != 0` into `bool_name`
which will be used in the case of the non-call exceptions throwing comparisons.

Bootstrapped and tested on x86_64-linux-gnu.

gcc/ChangeLog:

        * match.pd (`(ne (cmp) 0)`, `(eq (cmp) 1)`): Restrict to comparisons
        that don't throw.

Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
---
 gcc/match.pd | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/gcc/match.pd b/gcc/match.pd
index ab496d923cc..e99ed40fbd1 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -6900,12 +6900,22 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
  /* The following bits are handled by fold_binary_op_with_conditional_arg.  */
  (simplify
   (ne (cmp@2 @0 @1) integer_zerop)
-  (if (types_match (type, TREE_TYPE (@2)))
-   (cmp @0 @1)))
+  /* For non-call exceptions, don't copy stmts that might throw (trap). */
+  (if (!flag_exceptions
+       || !(cfun && cfun->can_throw_non_call_exceptions)
+       || !operation_could_trap_p (cmp, FLOAT_TYPE_P (TREE_TYPE (@0)),
+                                  false, NULL_TREE))
+   (if (types_match (type, TREE_TYPE (@2)))
+    (cmp @0 @1))))
  (simplify
   (eq (cmp@2 @0 @1) integer_truep)
-  (if (types_match (type, TREE_TYPE (@2)))
-   (cmp @0 @1)))
+  /* For non-call exceptions, don't copy stmts that might throw (trap). */
+  (if (!flag_exceptions
+       || !(cfun && cfun->can_throw_non_call_exceptions)
+       || !operation_could_trap_p (cmp, FLOAT_TYPE_P (TREE_TYPE (@0)),
+                                  false, NULL_TREE))
+   (if (types_match (type, TREE_TYPE (@2)))
+    (cmp @0 @1))))
  (simplify
   (ne (cmp@2 @0 @1) integer_truep)
   (if (types_match (type, TREE_TYPE (@2)))
-- 
2.43.0

Reply via email to