xref: /llvm-project/llvm/test/CodeGen/AVR/pseudo/ELPMWRdZ.mir (revision acb4d143bdb75930eae8dc700e16e4950b8cc2c8)
1# RUN: llc -mtriple=avr -mattr=+lpm -mattr=+elpm -mattr=+lpmx -mattr=+elpmx \
2# RUN:     -mattr=+movw -start-before=greedy %s -o - | FileCheck %s
3# RUN: llc -mtriple=avr -mattr=+lpm -mattr=+elpm -mattr=-lpmx -mattr=-elpmx \
4# RUN:     -mattr=+addsubiw -mattr=+movw -start-before=greedy %s -o - \
5# RUN:     | FileCheck --check-prefix=NOX %s
6# RUN: llc -mtriple=avr -mattr=+lpm -mattr=+elpm -mattr=-lpmx -mattr=-elpmx \
7# RUN:     -mattr=-addsubiw -mattr=+movw -start-before=greedy %s -o - \
8# RUN:     | FileCheck --check-prefix=NOADIWNOX %s
9
10# This test checks the expansion of the 16-bit ELPM pseudo instruction and that
11# the register allocator won't use R31R30 as an output register (which would
12# lead to undefined behavior).
13
14--- |
15  target triple = "avr--"
16  define void @test_elpmwrdz() {
17  entry:
18    ret void
19  }
20  define void @test_elpmwrdz_2() {
21  entry:
22    ret void
23  }
24...
25
26---
27name:            test_elpmwrdz
28tracksRegLiveness: true
29body: |
30  bb.0.entry:
31    liveins: $r31r30
32
33    ; CHECK-LABEL: test_elpmwrdz
34    ; CHECK:      elpm r24, Z+
35    ; CHECK-NEXT: elpm r25, Z
36    ; CHECK-NEXT: movw r30, r24
37
38    ; NOX-LABEL: test_elpmwrdz
39    ; NOX:       ; %bb.0:
40    ; NOX-NEXT:    ldi r18, 1
41    ; NOX-NEXT:    out
42    ; NOX-NEXT:    elpm
43    ; NOX-NEXT:    mov r24, r0
44    ; NOX-NEXT:    adiw r30, 1
45    ; NOX-NEXT:    elpm
46    ; NOX-NEXT:    mov r25, r0
47    ; NOX-NEXT:    movw r30, r24
48
49    ; NOADIWNOX-LABEL: test_elpmwrdz
50    ; NOADIWNOX:       ; %bb.0:
51    ; NOADIWNOX-NEXT:    ldi r18, 1
52    ; NOADIWNOX-NEXT:    out
53    ; NOADIWNOX-NEXT:    elpm
54    ; NOADIWNOX-NEXT:    mov r24, r0
55    ; NOADIWNOX-NEXT:    subi r30, 255
56    ; NOADIWNOX-NEXT:    sbci r31, 255
57    ; NOADIWNOX-NEXT:    elpm
58    ; NOADIWNOX-NEXT:    mov r25, r0
59    ; NOADIWNOX-NEXT:    movw r30, r24
60
61    %1:zreg = COPY killed $r31r30
62    %2:ld8 = LDIRdK 1
63    %3:dregs = ELPMWRdZ %1, %2, implicit-def dead $r0
64    $r31r30 = COPY %3
65    RET implicit $r31r30
66...
67
68---
69name:            test_elpmwrdz_2
70tracksRegLiveness: true
71body: |
72  bb.0.entry:
73    liveins: $r31r30
74
75    ; CHECK-LABEL: test_elpmwrdz_2
76    ; CHECK:       ; %bb.0:
77    ; CHECK-NEXT:    ldi r24, 1
78    ; CHECK-NEXT:    out 59, r24
79    ; CHECK-NEXT:    elpm r18, Z+
80    ; CHECK-NEXT:    elpm r19, Z
81    ; CHECK-NEXT:    sbiw r30, 1
82    ; CHECK-NEXT:    ret
83
84    ; NOX-LABEL: test_elpmwrdz_2
85    ; NOX:       ; %bb.0:
86    ; NOX-NEXT:    ldi r24, 1
87    ; NOX-NEXT:    out 59, r24
88    ; NOX-NEXT:    elpm
89    ; NOX-NEXT:    mov r18, r0
90    ; NOX-NEXT:    adiw r30, 1
91    ; NOX-NEXT:    elpm
92    ; NOX-NEXT:    mov r19, r0
93    ; NOX-NEXT:    sbiw r30, 1
94    ; NOX-NEXT:    ret
95
96    ; NOADIWNOX-LABEL: test_elpmwrdz_2
97    ; NOADIWNOX:       ; %bb.0:
98    ; NOADIWNOX-NEXT:    ldi r24, 1
99    ; NOADIWNOX-NEXT:    out  59, r24
100    ; NOADIWNOX-NEXT:    elpm
101    ; NOADIWNOX-NEXT:    mov r18, r0
102    ; NOADIWNOX-NEXT:    subi r30, 255
103    ; NOADIWNOX-NEXT:    sbci r31, 255
104    ; NOADIWNOX-NEXT:    elpm
105    ; NOADIWNOX-NEXT:    mov r19, r0
106    ; NOADIWNOX-NEXT:    subi r30, 1
107    ; NOADIWNOX-NEXT:    sbci r31, 0
108
109    %1:zreg = COPY $r31r30
110    %2:ld8 = LDIRdK 1
111    %3:dregs = ELPMWRdZ %1, %2, implicit-def dead $r0
112    RET implicit $r31r30
113...
114