[Bug target/49687] New: AVR: Missed optimization for widening MUL

gjl at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Sat Jul 9 09:36:00 GMT 2011


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49687

           Summary: AVR: Missed optimization for widening MUL
           Product: gcc
           Version: 4.6.1
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: gjl@gcc.gnu.org
            Target: avr


With avr-gcc 4.6.1 and 
-Os -mmcu=atmega88 -S -dp

int mul8_55 (char x)
{
    return x * 55;
}

gets compiled to 

mul8_55:
    ldi r25,lo8(55)     ;  7    *movqi/2    [length = 1]
    muls r24,r25     ;  8    mulqihi3    [length = 3]
    movw r24,r0
    clr r1
    ret     ;  26    return    [length = 1]

which is fine.  If the constant is 126, however, the result is bloated and
might be related to PR36467, i.e. MUL* is better than shift.

mul8_126:
    clr r25     ;  7    extendqihi2/1    [length = 3]
    sbrc r24,7
    com r25
    movw r18,r24     ;  28    *movhi/1    [length = 1]
    lsl r18     ;  33    *ashlhi3_const/2    [length = 2]
    rol r19
    lsr r25     ;  34    *ashlhi3_const/5    [length = 5]
    mov r25,r24
    clr r24
    ror r25
    ror r24
    sub r24,r18     ;  12    subhi3/1    [length = 2]
    sbc r25,r19
    ret     ;  31    return    [length = 1]

If the constant is 155, a MUL is invented, but a widening MUL would be smarter:

mul8_155:
    mov r20,r24     ;  6    extendqihi2/2    [length = 4]
    clr r21
    sbrc r20,7
    com r21
    ldi r18,lo8(155)     ;  7    *movhi/4    [length = 2]
    ldi r19,hi8(155)
    mul r20,r18     ;  8    *mulhi3_enh    [length = 7]
    movw r24,r0
    mul r20,r19
    add r25,r0
    mul r21,r18
    add r25,r0
    clr r1
    ret     ;  26    return    [length = 1]



More information about the Gcc-bugs mailing list