Skip to content

Commit 1db206d

Browse files
authored
[AVR] Fix a bug in selection of ANY_EXTEND (#132398)
This is a walk around solution of #132203
1 parent 858f905 commit 1db206d

File tree

4 files changed

+100
-24
lines changed

4 files changed

+100
-24
lines changed

llvm/lib/Target/AVR/AVRInstrInfo.td

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1750,10 +1750,10 @@ def : Pat<(AVRcall(i16 tglobaladdr:$dst)), (RCALLk tglobaladdr:$dst)>;
17501750
def : Pat<(AVRcall(i16 texternalsym:$dst)), (RCALLk texternalsym:$dst)>;
17511751

17521752
// `anyext`
1753-
def : Pat<(i16(anyext i8
1754-
: $src)),
1755-
(INSERT_SUBREG(i16(IMPLICIT_DEF)), i8
1756-
: $src, sub_lo)>;
1753+
// FIMXE: Using INSERT_SUBREG is more efficient, but leads to issue #132203.
1754+
def : Pat<(i16(anyext i8:$src)),
1755+
// (INSERT_SUBREG(i16(IMPLICIT_DEF)), i8:$src, sub_lo)>;
1756+
(ZEXT i8:$src)>;
17571757

17581758
// `trunc`
17591759
def : Pat<(i8(trunc i16 : $src)), (EXTRACT_SUBREG i16 : $src, sub_lo)>;

llvm/test/CodeGen/AVR/hardware-mul.ll

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,22 @@ define i16 @mult16(i16 %a, i16 %b) {
2121
; CHECK-NEXT: mov r25, r0
2222
; CHECK-NEXT: clr r1
2323
; CHECK-NEXT: mul r22, r24
24-
; CHECK-NEXT: mov r20, r0
25-
; CHECK-NEXT: mov r18, r1
24+
; CHECK-NEXT: mov r18, r0
25+
; CHECK-NEXT: mov r19, r1
2626
; CHECK-NEXT: clr r1
27-
; CHECK-NEXT: add r18, r25
27+
; CHECK-NEXT: add r19, r25
2828
; CHECK-NEXT: muls r23, r24
2929
; CHECK-NEXT: clr r1
30-
; CHECK-NEXT: add r18, r0
31-
; CHECK-NEXT: mov r19, r18
32-
; CHECK-NEXT: clr r18
33-
; CHECK-NEXT: mov r24, r20
30+
; CHECK-NEXT: mov r24, r0
31+
; CHECK-NEXT: add r24, r19
32+
; CHECK-NEXT: mov r20, r24
33+
; CHECK-NEXT: clr r21
34+
; CHECK-NEXT: mov r21, r20
35+
; CHECK-NEXT: clr r20
36+
; CHECK-NEXT: mov r24, r18
3437
; CHECK-NEXT: clr r25
35-
; CHECK-NEXT: or r24, r18
36-
; CHECK-NEXT: or r25, r19
38+
; CHECK-NEXT: or r24, r20
39+
; CHECK-NEXT: or r25, r21
3740
; CHECK-NEXT: ret
3841
%mul = mul nsw i16 %b, %a
3942
ret i16 %mul

llvm/test/CodeGen/AVR/inline-asm/inline-asm3.ll

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,10 @@ define void @add_b_i8(i8 signext %0, i8 signext %1) {
184184
; CHECK: ; %bb.0:
185185
; CHECK-NEXT: mov r20, r22
186186
; CHECK-NEXT: mov r22, r24
187-
; CHECK-NEXT: mov r30, r22
187+
; CHECK-NEXT: mov r24, r22
188+
; CHECK-NEXT: clr r25
189+
; CHECK-NEXT: mov r30, r24
190+
; CHECK-NEXT: mov r31, r25
188191
; CHECK-NEXT: ;APP
189192
; CHECK-NEXT: mov r30, r30
190193
; CHECK-NEXT: add r30, r20
@@ -224,14 +227,16 @@ define void @add_b_i16(i16 signext %0, i16 signext %1) {
224227
define void @add_e_i8(i8 signext %0, i8 signext %1) {
225228
; CHECK-LABEL: add_e_i8:
226229
; CHECK: ; %bb.0:
227-
; CHECK-NEXT: mov r30, r22
230+
; CHECK-NEXT: mov r20, r22
228231
; CHECK-NEXT: mov r22, r24
229232
; CHECK-NEXT: mov r26, r22
233+
; CHECK-NEXT: clr r27
234+
; CHECK-NEXT: mov r30, r20
235+
; CHECK-NEXT: clr r31
230236
; CHECK-NEXT: ;APP
231237
; CHECK-NEXT: mov r26, r26
232238
; CHECK-NEXT: add r26, r30
233239
; CHECK-NEXT: ;NO_APP
234-
; CHECK-NEXT: mov r20, r30
235240
; CHECK-NEXT: mov r24, r26
236241
; CHECK-NEXT: rcall foo8
237242
; CHECK-NEXT: ret
@@ -286,14 +291,16 @@ define void @add_t_i8(i8 signext %0, i8 signext %1) {
286291
define void @add_w_i8(i8 signext %0, i8 signext %1) {
287292
; CHECK-LABEL: add_w_i8:
288293
; CHECK: ; %bb.0:
289-
; CHECK-NEXT: mov r26, r22
290-
; CHECK-NEXT: mov r30, r24
294+
; CHECK-NEXT: mov r20, r22
295+
; CHECK-NEXT: mov r22, r24
296+
; CHECK-NEXT: mov r24, r22
297+
; CHECK-NEXT: clr r25
298+
; CHECK-NEXT: mov r30, r20
299+
; CHECK-NEXT: clr r31
291300
; CHECK-NEXT: ;APP
292-
; CHECK-NEXT: mov r24, r30
293-
; CHECK-NEXT: add r24, r26
301+
; CHECK-NEXT: mov r24, r24
302+
; CHECK-NEXT: add r24, r30
294303
; CHECK-NEXT: ;NO_APP
295-
; CHECK-NEXT: mov r22, r30
296-
; CHECK-NEXT: mov r20, r26
297304
; CHECK-NEXT: rcall foo8
298305
; CHECK-NEXT: ret
299306
%3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=w,w,w"(i8 %0, i8 %1)
@@ -333,9 +340,9 @@ define void @add_xyz_i8(i8 signext %0, i8 signext %1) {
333340
; CHECK-NEXT: mov r20, r22
334341
; CHECK-NEXT: mov r22, r24
335342
; CHECK-NEXT: mov r28, r22
336-
; CHECK-NEXT: mov r29, r23
343+
; CHECK-NEXT: clr r29
337344
; CHECK-NEXT: mov r26, r20
338-
; CHECK-NEXT: mov r27, r21
345+
; CHECK-NEXT: clr r27
339346
; CHECK-NEXT: ;APP
340347
; CHECK-NEXT: mov r30, r28
341348
; CHECK-NEXT: add r30, r26

llvm/test/CodeGen/AVR/issue-132203.ll

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc < %s -mtriple=avr -mattr=+movw | FileCheck %s --check-prefix=MOVW
3+
; RUN: llc < %s -mtriple=avr -mattr=-movw | FileCheck %s --check-prefix=NOMOVW
4+
5+
define i16 @food(ptr %this) {
6+
; MOVW-LABEL: food:
7+
; MOVW: ; %bb.0: ; %entry
8+
; MOVW-NEXT: movw r30, r24
9+
; MOVW-NEXT: ldd r24, Z+25
10+
; MOVW-NEXT: clr r25
11+
; MOVW-NEXT: ldd r18, Z+26
12+
; MOVW-NEXT: clr r19
13+
; MOVW-NEXT: sub r24, r18
14+
; MOVW-NEXT: sbc r25, r19
15+
; MOVW-NEXT: andi r24, 63
16+
; MOVW-NEXT: andi r25, 0
17+
; MOVW-NEXT: ret
18+
;
19+
; NOMOVW-LABEL: food:
20+
; NOMOVW: ; %bb.0: ; %entry
21+
; NOMOVW-NEXT: mov r30, r24
22+
; NOMOVW-NEXT: mov r31, r25
23+
; NOMOVW-NEXT: ldd r24, Z+25
24+
; NOMOVW-NEXT: clr r25
25+
; NOMOVW-NEXT: ldd r18, Z+26
26+
; NOMOVW-NEXT: clr r19
27+
; NOMOVW-NEXT: sub r24, r18
28+
; NOMOVW-NEXT: sbc r25, r19
29+
; NOMOVW-NEXT: andi r24, 63
30+
; NOMOVW-NEXT: andi r25, 0
31+
; NOMOVW-NEXT: ret
32+
entry:
33+
%_rx_buffer_head = getelementptr inbounds nuw i8, ptr %this, i16 25
34+
%0 = load volatile i8, ptr %_rx_buffer_head
35+
%conv = zext i8 %0 to i16
36+
%_rx_buffer_tail = getelementptr inbounds nuw i8, ptr %this, i16 26
37+
%1 = load volatile i8, ptr %_rx_buffer_tail
38+
%conv2 = zext i8 %1 to i16
39+
%sub = sub nsw i16 %conv, %conv2
40+
%rem = and i16 %sub, 63
41+
ret i16 %rem
42+
}
43+
44+
define i16 @fooe(i8 %a) {
45+
; MOVW-LABEL: fooe:
46+
; MOVW: ; %bb.0:
47+
; MOVW-NEXT: clr r25
48+
; MOVW-NEXT: subi r24, 0
49+
; MOVW-NEXT: sbci r25, 1
50+
; MOVW-NEXT: andi r24, 1
51+
; MOVW-NEXT: andi r25, 0
52+
; MOVW-NEXT: ret
53+
;
54+
; NOMOVW-LABEL: fooe:
55+
; NOMOVW: ; %bb.0:
56+
; NOMOVW-NEXT: clr r25
57+
; NOMOVW-NEXT: subi r24, 0
58+
; NOMOVW-NEXT: sbci r25, 1
59+
; NOMOVW-NEXT: andi r24, 1
60+
; NOMOVW-NEXT: andi r25, 0
61+
; NOMOVW-NEXT: ret
62+
%1 = zext i8 %a to i16
63+
%2 = sub i16 %1, 256
64+
%3 = and i16 %2, 1
65+
ret i16 %3
66+
}

0 commit comments

Comments
 (0)