https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61298

--- Comment #4 from baoshan <pangbw at gmail dot com> ---
(In reply to Peter Bergner from comment #3)

>> I can say that unsigned_reg_p() probably doesn't catch every case
>> where we're doing an unsigned compare and force it to use non
> signed compare.   Since you have a subreg, have you looked at
> how SUBREG_PROMOTED_UNSIGNED_P is set?  Is that supposed to be
> set for your case?

Yes, SUBREG_PROMOTED_UNSIGNED_P is supposed to be set for this case, it has
been set originally, but the setting is lost while doing mode converting in
function convert_modes():expr.c, do you think the following code is good enough
to fix this issue?

 rtx
  convert_modes (enum machine_mode mode, enum machine_mode oldmode, rtx x, int
unsignedp)
  {
    rtx temp;

    /* If FROM is a SUBREG that indicates that we have already done at least    
       the required extension, strip it.  */

    if (GET_CODE (x) == SUBREG && SUBREG_PROMOTED_VAR_P (x)
        && GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))) >= GET_MODE_SIZE (mode)
        && SUBREG_PROMOTED_UNSIGNED_P (x) == unsignedp) {
      x = gen_lowpart (mode, SUBREG_REG (x));
      if(GET_CODE (x) == SUBREG) {
        SUBREG_PROMOTED_VAR_P (x) = 1;
        SUBREG_PROMOTED_UNSIGNED_SET (x, unsignedp);
      }
    }
.
.
.

Reply via email to