{
unsigned int prec = TYPE_PRECISION (TREE_TYPE (op));
unsigned rem = prec % (2 * limb_prec);
- int ext = tree_int_cst_sgn (op) < 0 ? -1 : 0;
+ int ext = wi::neg_p (wi::to_wide (op)) ? -1 : 0;
tree c = m_data[m_data_cnt];
unsigned min_prec = TYPE_PRECISION (TREE_TYPE (c));
g = gimple_build_cond (LT_EXPR, idx,
--- /dev/null
+/* PR tree-optimization/113334 */
+/* { dg-do run { target bitint } } */
+/* { dg-options "-std=c23 -pedantic-errors" } */
+/* { dg-skip-if "" { ! run_expensive_tests } { "*" } { "-O0" "-O2" } } */
+/* { dg-skip-if "" { ! run_expensive_tests } { "-flto" } { "" } } */
+
+#if __BITINT_MAXWIDTH__ >= 384
+__attribute__((noipa)) _BitInt(384)
+foo (int s)
+{
+ _BitInt(384) z = (-(unsigned _BitInt(384)) 4) >> s;
+ return z;
+}
+#endif
+
+int
+main ()
+{
+#if __BITINT_MAXWIDTH__ >= 384
+ if (foo (59) != 0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffwb)
+ __builtin_abort ();
+ if (foo (0) != -4wb)
+ __builtin_abort ();
+ if (foo (1) != 0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffewb)
+ __builtin_abort ();
+ if (foo (11) != 0x001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffwb)
+ __builtin_abort ();
+ if (foo (123) != 0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffwb)
+ __builtin_abort ();
+#endif
+ return 0;
+}