]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/110838 - less aggressively fold out-of-bound shifts
authorRichard Biener <rguenther@suse.de>
Fri, 4 Aug 2023 09:24:49 +0000 (11:24 +0200)
committerAndre Vieira <andre.simoesdiasvieira@arm.com>
Tue, 26 Mar 2024 14:58:02 +0000 (14:58 +0000)
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)

gcc/match.pd

index 6812853df6754d93d854008685b989c0a633d0c2..47e48fa2ca5e54cd2806cd34dee40b826651f58b 100644 (file)
@@ -1002,6 +1002,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)))