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.
This commit is contained in:
Richard Biener 2023-08-04 11:24:49 +02:00
parent 2d2f090e67
commit 04aa0edcac

View file

@ -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)))