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.