https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119731
--- Comment #18 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Oh I think I know how to fix this case.
In scalar_min_max_arsh, Replace:
/* Its not easy to operate on alu32 bounds here because it depends
* on bits being shifted in from upper 32-bits. Take easy way out
* and mark unbounded so we can recalculate later from tnum.
*/
__mark_reg32_unbounded(dst_reg);
With:
/* When shifting, we track the signed 32bit values as the new value of 64bit
values. */
dst_reg->s32_min_value = dst_reg->smin_value;
dst_reg->s32_max_value = dst_reg->smax_value;
/* If the truncation of the min/max for 32bit is different, just mark it as
unbounded. */
if (dst_reg->s32_min_value != dst_reg->smin_value || dst_reg->s32_max_value !=
dst_reg->smax_value)
__mark_reg32_unbounded (dst_reg);
Or something to that effect I think is the correct fix.