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);
}
--- /dev/null
+/* PR middle-end/117847 */
+/* { dg-do run { target bitint } } */
+/* { dg-options "-std=c23" } */
+/* { dg-skip-if "" { ! run_expensive_tests } { "*" } { "-O0" "-O2" } } */
+/* { dg-skip-if "" { ! run_expensive_tests } { "-flto" } { "" } } */
+
+#if __BITINT_MAXWIDTH__ >= 512
+typedef unsigned _BitInt(512) B;
+
+__attribute__((noipa)) B
+foo (B a, int r)
+{
+ B b = __builtin_stdc_rotate_left (a, r);
+ return b;
+}
+#endif
+
+int
+main ()
+{
+#if __BITINT_MAXWIDTH__ >= 512
+ B a = 0x4ad4fdecc8717d7c6f8b1afb82fdb742477ef2ab34057d1dcc79ba30c38a352dea3253c8c25126d98da02213ad54b90d2998f947941ea4b45e71c61dc1fe3192uwb;
+ B x = foo (a, 0);
+ if (x != a)
+ __builtin_abort ();
+#endif
+}