114 lines · plain
1# RUN: llc -mtriple=avr -mattr=+lpm -mattr=+elpm -mattr=+lpmx -mattr=+elpmx \2# RUN: -mattr=+movw -start-before=greedy %s -o - | FileCheck %s3# 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 %s6# 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 %s9 10# This test checks the expansion of the 16-bit ELPM pseudo instruction and that11# the register allocator won't use R31R30 as an output register (which would12# lead to undefined behavior).13 14--- |15 target triple = "avr--"16 define void @test_elpmwrdz() {17 entry:18 ret void19 }20 define void @test_elpmwrdz_2() {21 entry:22 ret void23 }24...25 26---27name: test_elpmwrdz28tracksRegLiveness: true29body: |30 bb.0.entry:31 liveins: $r31r3032 33 ; CHECK-LABEL: test_elpmwrdz34 ; CHECK: elpm r24, Z+35 ; CHECK-NEXT: elpm r25, Z36 ; CHECK-NEXT: movw r30, r2437 38 ; NOX-LABEL: test_elpmwrdz39 ; NOX: ; %bb.0:40 ; NOX-NEXT: ldi r18, 141 ; NOX-NEXT: out42 ; NOX-NEXT: elpm43 ; NOX-NEXT: mov r24, r044 ; NOX-NEXT: adiw r30, 145 ; NOX-NEXT: elpm46 ; NOX-NEXT: mov r25, r047 ; NOX-NEXT: movw r30, r2448 49 ; NOADIWNOX-LABEL: test_elpmwrdz50 ; NOADIWNOX: ; %bb.0:51 ; NOADIWNOX-NEXT: ldi r18, 152 ; NOADIWNOX-NEXT: out53 ; NOADIWNOX-NEXT: elpm54 ; NOADIWNOX-NEXT: mov r24, r055 ; NOADIWNOX-NEXT: subi r30, 25556 ; NOADIWNOX-NEXT: sbci r31, 25557 ; NOADIWNOX-NEXT: elpm58 ; NOADIWNOX-NEXT: mov r25, r059 ; NOADIWNOX-NEXT: movw r30, r2460 61 %1:zreg = COPY killed $r31r3062 %2:ld8 = LDIRdK 163 %3:dregs = ELPMWRdZ %1, %2, implicit-def dead $r064 $r31r30 = COPY %365 RET implicit $r31r3066...67 68---69name: test_elpmwrdz_270tracksRegLiveness: true71body: |72 bb.0.entry:73 liveins: $r31r3074 75 ; CHECK-LABEL: test_elpmwrdz_276 ; CHECK: ; %bb.0:77 ; CHECK-NEXT: ldi r24, 178 ; CHECK-NEXT: out 59, r2479 ; CHECK-NEXT: elpm r18, Z+80 ; CHECK-NEXT: elpm r19, Z81 ; CHECK-NEXT: sbiw r30, 182 ; CHECK-NEXT: ret83 84 ; NOX-LABEL: test_elpmwrdz_285 ; NOX: ; %bb.0:86 ; NOX-NEXT: ldi r24, 187 ; NOX-NEXT: out 59, r2488 ; NOX-NEXT: elpm89 ; NOX-NEXT: mov r18, r090 ; NOX-NEXT: adiw r30, 191 ; NOX-NEXT: elpm92 ; NOX-NEXT: mov r19, r093 ; NOX-NEXT: sbiw r30, 194 ; NOX-NEXT: ret95 96 ; NOADIWNOX-LABEL: test_elpmwrdz_297 ; NOADIWNOX: ; %bb.0:98 ; NOADIWNOX-NEXT: ldi r24, 199 ; NOADIWNOX-NEXT: out 59, r24100 ; NOADIWNOX-NEXT: elpm101 ; NOADIWNOX-NEXT: mov r18, r0102 ; NOADIWNOX-NEXT: subi r30, 255103 ; NOADIWNOX-NEXT: sbci r31, 255104 ; NOADIWNOX-NEXT: elpm105 ; NOADIWNOX-NEXT: mov r19, r0106 ; NOADIWNOX-NEXT: subi r30, 1107 ; NOADIWNOX-NEXT: sbci r31, 0108 109 %1:zreg = COPY $r31r30110 %2:ld8 = LDIRdK 1111 %3:dregs = ELPMWRdZ %1, %2, implicit-def dead $r0112 RET implicit $r31r30113...114