[gcc r12-10294] tree-optimization/110838 - less aggressively fold out-of-bound shifts
Andre Simoes Dias Vieira
avieira@gcc.gnu.org
Tue Mar 26 15:05:31 GMT 2024
https://gcc.gnu.org/g:d0eed43ff39a0bad4a02f8af7a4795e06aea6f80
commit r12-10294-gd0eed43ff39a0bad4a02f8af7a4795e06aea6f80
Author: Richard Biener <rguenther@suse.de>
Date: Fri Aug 4 11:24:49 2023 +0200
tree-optimization/110838 - less aggressively fold out-of-bound shifts
The following adjusts the shift simplification patterns to avoid
touching out-of-bound shift value arithmetic right shifts of
possibly negative values. While simplifying those to zero isn't
wrong it's violating the principle of least surprise.
PR tree-optimization/110838
* match.pd (([rl]shift @0 out-of-bounds) -> zero): Restrict
the arithmetic right-shift case to non-negative operands.
(cherry picked from commit 04aa0edcace22a7815cfc57575f1f7b1f166ac10)
Diff:
---
gcc/match.pd | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/gcc/match.pd b/gcc/match.pd
index 843b939fc34..c5a4426e76b 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -909,6 +909,10 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(simplify
(shift @0 uniform_integer_cst_p@1)
(if ((GIMPLE || !sanitize_flags_p (SANITIZE_SHIFT_EXPONENT))
+ /* Leave arithmetic right shifts of possibly negative values alone. */
+ && (TYPE_UNSIGNED (type)
+ || shift == LSHIFT_EXPR
+ || tree_expr_nonnegative_p (@0))
/* Use a signed compare to leave negative shift counts alone. */
&& wi::ges_p (wi::to_wide (uniform_integer_cst_p (@1)),
element_precision (type)))
More information about the Gcc-cvs
mailing list