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.

Reply via email to