https://gcc.gnu.org/g:b602b32ff06726a6ede59b10e0f5b84f9f546e4c
commit r14-11150-gb602b32ff06726a6ede59b10e0f5b84f9f546e4c Author: Jakub Jelinek <ja...@redhat.com> Date: Tue Dec 3 11:16:37 2024 +0100 bitintlower: Fix up ?ROTATE_EXPR lowering [PR117847] In the ?ROTATE_EXPR lowering I forgot to handle rotation by 0 correctly. INTEGER_CST 0 is very unlikely, it would be probably folded away, but a non-constant count can't use just p - n because then the shift count is out of bounds for zero. In the FE I use n == 0 ? x : (x << n) | (x >> (p - n)) but bitintlower here isn't prepared at this point to have bb split and am not sure if using COND_EXPR is a good idea either, so the patch uses (p - n) % p. Perhaps I should just disable lowering the rotate in the FE for the non-mode precision BITINT_TYPEs too. 2024-12-03 Jakub Jelinek <ja...@redhat.com> PR middle-end/117847 * gimple-lower-bitint.cc (gimple_lower_bitint) <case LROTATE_EXPR>: Use m = (p - n) % p instead of m = p - n for the other shift count. (cherry picked from commit 0b89341f124eadc689682d01193309225adfec23) Diff: --- gcc/gimple-lower-bitint.cc | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/gcc/gimple-lower-bitint.cc b/gcc/gimple-lower-bitint.cc index e4e628b786b9..2072e54db772 100644 --- a/gcc/gimple-lower-bitint.cc +++ b/gcc/gimple-lower-bitint.cc @@ -6227,11 +6227,20 @@ gimple_lower_bitint (void) tree p = build_int_cst (TREE_TYPE (n), TYPE_PRECISION (type)); if (TREE_CODE (n) == INTEGER_CST) - m = fold_build2 (MINUS_EXPR, TREE_TYPE (n), p, n); + { + if (integer_zerop (n)) + m = n; + else + m = fold_build2 (MINUS_EXPR, TREE_TYPE (n), p, n); + } else { + tree tem = make_ssa_name (TREE_TYPE (n)); + g = gimple_build_assign (tem, MINUS_EXPR, p, n); + gsi_insert_before (&gsi, g, GSI_SAME_STMT); + gimple_set_location (g, loc); m = make_ssa_name (TREE_TYPE (n)); - g = gimple_build_assign (m, MINUS_EXPR, p, n); + g = gimple_build_assign (m, TRUNC_MOD_EXPR, tem, p); gsi_insert_before (&gsi, g, GSI_SAME_STMT); gimple_set_location (g, loc); }