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