[clang] [llvm] [AVR] Fix Avr indvar detection and strength reduction (missed optimization) (PR #152028)

Tom Vijlbrief via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 7 09:30:19 PDT 2025


tomtor wrote:

```
000001f6 <avr_modern_demo::serial::Serial::write_int>:
 1f6:   ef 92           push    r14
 1f8:   0f 93           push    r16
 1fa:   1f 93           push    r17
 1fc:   8a 30           cpi     r24, 0x0A       ; 10
 1fe:   91 05           cpc     r25, r1
 200:   c0 f0           brcs    .+48            ; 0x232 <.Lname69+0x8>
 202:   2d ec           ldi     r18, 0xCD       ; 205
 204:   3c ec           ldi     r19, 0xCC       ; 204
 206:   40 e0           ldi     r20, 0x00       ; 0
 208:   50 e0           ldi     r21, 0x00       ; 0
 20a:   bc 01           movw    r22, r24
 20c:   e8 2e           mov     r14, r24
 20e:   ca 01           movw    r24, r20
 210:   0e 94 cd 02     call    0x59a   ; 0x59a <__mulsi3>
 214:   8c 01           movw    r16, r24
 216:   16 95           lsr     r17
 218:   07 95           ror     r16
 21a:   16 95           lsr     r17
 21c:   07 95           ror     r16
 21e:   16 95           lsr     r17
 220:   07 95           ror     r16
 222:   c8 01           movw    r24, r16
 224:   0e 94 fb 00     call    0x1f6   ; 0x1f6 <avr_modern_demo::serial::Serial::write_int>
 228:   86 ef           ldi     r24, 0xF6       ; 246
 22a:   08 02           muls    r16, r24
 22c:   11 24           eor     r1, r1
 22e:   80 2d           mov     r24, r0
 230:   8e 0d           add     r24, r14
 232:   90 91 04 08     lds     r25, 0x0804     ; 0x800804 <anon.0e9a9fafcd14a44665a97d696f684c31.7+0x7f7a23>
 236:   90 72           andi    r25, 0x20       ; 32
 238:   90 30           cpi     r25, 0x00       ; 0
 23a:   d9 f3           breq    .-10            ; 0x232 <.Lname69+0x8>
 23c:   80 63           ori     r24, 0x30       ; 48
 23e:   80 93 02 08     sts     0x0802, r24     ; 0x800802 <anon.0e9a9fafcd14a44665a97d696f684c31.7+0x7f7a21>
 242:   1f 91           pop     r17
 244:   0f 91           pop     r16
 246:   ef 90           pop     r14
 248:   08 95           ret
```

```
000001f8 <avr_modern_demo::serial::Serial::write_int>:
 1f8:   ef 92           push    r14
 1fa:   ff 92           push    r15
 1fc:   0f 93           push    r16
 1fe:   1f 93           push    r17
 200:   8a 30           cpi     r24, 0x0A       ; 10
 202:   91 05           cpc     r25, r1
 204:   08 f4           brcc    .+2             ; 0x208 <.Lname65+0x7>
 206:   2c c0           rjmp    .+88            ; 0x260 <.Lname73+0xa>
 208:   2d ec           ldi     r18, 0xCD       ; 205
 20a:   3c ec           ldi     r19, 0xCC       ; 204
 20c:   40 e0           ldi     r20, 0x00       ; 0
 20e:   50 e0           ldi     r21, 0x00       ; 0
 210:   7c 01           movw    r14, r24
 212:   bc 01           movw    r22, r24
 214:   ca 01           movw    r24, r20
 216:   0e 94 e3 02     call    0x5c6   ; 0x5c6 <__mulsi3>
 21a:   8c 01           movw    r16, r24
 21c:   16 95           lsr     r17
 21e:   07 95           ror     r16
 220:   16 95           lsr     r17
 222:   07 95           ror     r16
 224:   16 95           lsr     r17
 226:   07 95           ror     r16
 228:   c8 01           movw    r24, r16
 22a:   0e 94 fc 00     call    0x1f8   ; 0x1f8 <avr_modern_demo::serial::Serial::write_int>
 22e:   80 91 04 08     lds     r24, 0x0804     ; 0x800804 <anon.b5803c54398eee9364225baa7d2d2398.7+0x7f79f7>
 232:   80 72           andi    r24, 0x20       ; 32
 234:   80 30           cpi     r24, 0x00       ; 0
 236:   d9 f3           breq    .-10            ; 0x22e <.Lname69+0x4>
 238:   86 ef           ldi     r24, 0xF6       ; 246
 23a:   18 02           muls    r17, r24
 23c:   90 2d           mov     r25, r0
 23e:   11 24           eor     r1, r1
 240:   08 9f           mul     r16, r24
 242:   81 2d           mov     r24, r1
 244:   11 24           eor     r1, r1
 246:   80 1b           sub     r24, r16
 248:   89 0f           add     r24, r25
 24a:   28 2f           mov     r18, r24
 24c:   33 27           eor     r19, r19
 24e:   32 2f           mov     r19, r18
 250:   22 27           eor     r18, r18
 252:   80 2d           mov     r24, r0
 254:   99 27           eor     r25, r25
 256:   82 2b           or      r24, r18
 258:   93 2b           or      r25, r19
 25a:   8e 0d           add     r24, r14
 25c:   9f 1d           adc     r25, r15
 25e:   05 c0           rjmp    .+10            ; 0x26a <.Lname74+0x9>
 260:   20 91 04 08     lds     r18, 0x0804     ; 0x800804 <anon.b5803c54398eee9364225baa7d2d2398.7+0x7f79f7>
 264:   20 72           andi    r18, 0x20       ; 32
 266:   20 30           cpi     r18, 0x00       ; 0
 268:   d9 f3           breq    .-10            ; 0x260 <.Lname73+0xa>
 26a:   80 63           ori     r24, 0x30       ; 48
 26c:   80 93 02 08     sts     0x0802, r24     ; 0x800802 <anon.b5803c54398eee9364225baa7d2d2398.7+0x7f79f5>
 270:   1f 91           pop     r17
 272:   0f 91           pop     r16
 274:   ff 90           pop     r15
 276:   ef 90           pop     r14
 278:   08 95           ret
```

```
            pub fn write_int(&self, i: u16) {
                if i > 9 {
                    self.write_int(i / 10);
                    self.write_int(i % 10);
                } else {
                    self.write_c(b'0' + i as u8);
                }
            }
```

https://github.com/llvm/llvm-project/pull/152028


More information about the llvm-commits mailing list