summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2022-02-04 12:03:49 +0100
committerEric Botcazou <ebotcazou@adacore.com>2022-02-04 12:10:05 +0100
commitbd14cdceb9c6f4800e25a9fbca635a1d4c06fd32 (patch)
treef095dd4c180fc306e7fba96b4025132bd4d12adf
parent876e70d4681332a600492173af0c7259e5a438c6 (diff)
downloadgcc-bd14cdceb9c6f4800e25a9fbca635a1d4c06fd32.tar.gz
Disable new 1/X optimization with -fnon-call-exceptions
The trapping behavior of the operation needs to be preserved when the -fnon-call-exceptions switch is in effect. This also adds the same guards to similar optimizations. gcc/ PR tree-optimization/104356 * match.pd (X / bool_range_Y is X): Add guard. (X / X is one): Likewise. (X / abs (X) is X < 0 ? -1 : 1): Likewise. (X / -X is -1): Likewise. (1 / X -> X == 1): Likewise.
-rw-r--r--gcc/match.pd19
1 files changed, 14 insertions, 5 deletions
diff --git a/gcc/match.pd b/gcc/match.pd
index b942cb2930a..10ff867e854 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -401,27 +401,35 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
/* X / bool_range_Y is X. */
(simplify
(div @0 SSA_NAME@1)
- (if (INTEGRAL_TYPE_P (type) && ssa_name_has_boolean_range (@1))
+ (if (INTEGRAL_TYPE_P (type)
+ && ssa_name_has_boolean_range (@1)
+ && !flag_non_call_exceptions)
@0))
/* X / X is one. */
(simplify
(div @0 @0)
/* But not for 0 / 0 so that we can get the proper warnings and errors.
And not for _Fract types where we can't build 1. */
- (if (!integer_zerop (@0) && !ALL_FRACT_MODE_P (TYPE_MODE (type)))
+ (if (!ALL_FRACT_MODE_P (TYPE_MODE (type))
+ && !integer_zerop (@0)
+ && (!flag_non_call_exceptions || tree_expr_nonzero_p (@0)))
{ build_one_cst (type); }))
/* X / abs (X) is X < 0 ? -1 : 1. */
(simplify
(div:C @0 (abs @0))
(if (INTEGRAL_TYPE_P (type)
- && TYPE_OVERFLOW_UNDEFINED (type))
+ && TYPE_OVERFLOW_UNDEFINED (type)
+ && !integer_zerop (@0)
+ && (!flag_non_call_exceptions || tree_expr_nonzero_p (@0)))
(cond (lt @0 { build_zero_cst (type); })
{ build_minus_one_cst (type); } { build_one_cst (type); })))
/* X / -X is -1. */
(simplify
(div:C @0 (negate @0))
(if ((INTEGRAL_TYPE_P (type) || VECTOR_INTEGER_TYPE_P (type))
- && TYPE_OVERFLOW_UNDEFINED (type))
+ && TYPE_OVERFLOW_UNDEFINED (type)
+ && !integer_zerop (@0)
+ && (!flag_non_call_exceptions || tree_expr_nonzero_p (@0)))
{ build_minus_one_cst (type); })))
/* For unsigned integral types, FLOOR_DIV_EXPR is the same as
@@ -443,8 +451,9 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(simplify
(trunc_div integer_onep@0 @1)
(if (INTEGRAL_TYPE_P (type)
+ && TYPE_PRECISION (type) > 1
&& !integer_zerop (@1)
- && TYPE_PRECISION (type) > 1)
+ && (!flag_non_call_exceptions || tree_expr_nonzero_p (@1)))
(if (TYPE_UNSIGNED (type))
(convert (eq:boolean_type_node @1 { build_one_cst (type); }))
(with { tree utype = unsigned_type_for (type); }