aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2023-08-04 11:24:49 +0200
committerRichard Biener <rguenther@suse.de>2023-08-04 12:16:00 +0200
commit04aa0edcace22a7815cfc57575f1f7b1f166ac10 (patch)
treeac6c2802b041b72eb25d191e7b488a4d72f37f5a /gcc
parent2d2f090e67b26457596e7d5aabe629e3da58db94 (diff)
downloadgcc-04aa0edcace22a7815cfc57575f1f7b1f166ac10.zip
gcc-04aa0edcace22a7815cfc57575f1f7b1f166ac10.tar.gz
gcc-04aa0edcace22a7815cfc57575f1f7b1f166ac10.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/match.pd4
1 files changed, 4 insertions, 0 deletions
diff --git a/gcc/match.pd b/gcc/match.pd
index aa49574..2278029 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -1081,6 +1081,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)))