--- /dev/null
+/* PR tree-optimization/125291 */
+
+char buf[1111];
+char *archive_le16dec_filename = buf;
+unsigned int archive_le16dec_end, archive_le16dec_fn_end,
+ archive_le16dec_filename_size, archive_le16dec_offset;
+char archive_le16dec_p[] = { 21, 0x7f };
+
+[[gnu::noipa]]
+void
+archive_le16dec ()
+{
+ archive_le16dec_filename_size = (short)archive_le16dec_filename_size;
+ unsigned char flagbits = 0, flagbyte;
+ archive_le16dec_end = archive_le16dec_filename_size;
+ archive_le16dec_fn_end = archive_le16dec_filename_size * 2;
+ archive_le16dec_filename_size = flagbits = 0;
+ while (archive_le16dec_offset < archive_le16dec_end
+ && archive_le16dec_filename_size < archive_le16dec_fn_end)
+ {
+ if (!flagbits)
+ {
+ flagbyte = archive_le16dec_p[archive_le16dec_offset++];
+ flagbits = 8;
+ }
+ flagbits -= 2;
+ if (!(flagbyte >> flagbits & 3))
+ archive_le16dec_filename_size++;
+ }
+}
+
+int
+main ()
+{
+ archive_le16dec_filename_size = 2;
+ archive_le16dec ();
+ if (archive_le16dec_filename_size != 1)
+ __builtin_trap ();
+}
&& wi::to_widest (init_cond) == wi::to_widest (left_before)
&& !scev_probably_wraps_p (NULL_TREE, left_before, right, NULL,
loop, false))
- return build_polynomial_chrec (loop->num, init_cond,
- chrec_convert (TREE_TYPE (ev),
- right, NULL,
- false, NULL_TREE));
+ {
+ tree tp = TREE_TYPE (right);
+
+ /* We need a sign-extension to make things like
+ u8(6, 4, 2) => i32(6, 4, 2), instead of i32(6, 260, 514). */
+ if (TYPE_UNSIGNED (tp))
+ right = fold_convert (signed_type_for (tp), right);
+
+ return build_polynomial_chrec (loop->num, init_cond,
+ chrec_convert (TREE_TYPE (ev),
+ right, NULL,
+ false, NULL_TREE));
+ }
return chrec_dont_know;
}