1; RUN: llc -mattr=avr6,sram < %s -mtriple=avr -verify-machineinstrs | FileCheck %s 2 3define i8 @load8(ptr %x) { 4; CHECK-LABEL: load8: 5; CHECK: ld r24, {{[XYZ]}} 6 %1 = load i8, ptr %x 7 ret i8 %1 8} 9 10define i16 @load16(ptr %x) { 11; CHECK-LABEL: load16: 12; CHECK: ld r24, [[PTR:[YZ]]] 13; CHECK: ldd r25, [[PTR]]+1 14 %1 = load i16, ptr %x 15 ret i16 %1 16} 17 18define i8 @load8disp(ptr %x) { 19; CHECK-LABEL: load8disp: 20; CHECK: ldd r24, {{[YZ]}}+63 21 %1 = getelementptr inbounds i8, ptr %x, i64 63 22 %2 = load i8, ptr %1 23 ret i8 %2 24} 25 26define i8 @load8nodisp(ptr %x) { 27; CHECK-LABEL: load8nodisp: 28; CHECK: movw r26, r24 29; CHECK: subi r26, 192 30; CHECK: sbci r27, 255 31; CHECK: ld r24, {{[XYZ]}} 32 %1 = getelementptr inbounds i8, ptr %x, i64 64 33 %2 = load i8, ptr %1 34 ret i8 %2 35} 36 37define i16 @load16disp(ptr %x) { 38; CHECK-LABEL: load16disp: 39; CHECK: ldd r24, [[PTR:[YZ]]]+62 40; CHECK: ldd r25, [[PTR]]+63 41 %1 = getelementptr inbounds i16, ptr %x, i64 31 42 %2 = load i16, ptr %1 43 ret i16 %2 44} 45 46define i16 @load16nodisp(ptr %x) { 47; CHECK-LABEL: load16nodisp: 48; CHECK: subi r24, 192 49; CHECK: sbci r25, 255 50; CHECK: movw r30, r24 51; CHECK: ld r24, [[PTR:[YZ]]] 52; CHECK: ldd r25, [[PTR]]+1 53 %1 = getelementptr inbounds i16, ptr %x, i64 32 54 %2 = load i16, ptr %1 55 ret i16 %2 56} 57 58define i8 @load8postinc(ptr %x, i8 %y) { 59; CHECK-LABEL: load8postinc: 60; CHECK: ld {{.*}}, {{[XYZ]}}+ 61entry: 62 %tobool6 = icmp eq i8 %y, 0 63 br i1 %tobool6, label %while.end, label %while.body 64while.body: ; preds = %entry, %while.body 65 %r.09 = phi i8 [ %add, %while.body ], [ 0, %entry ] 66 %y.addr.08 = phi i8 [ %dec, %while.body ], [ %y, %entry ] 67 %x.addr.07 = phi ptr [ %incdec.ptr, %while.body ], [ %x, %entry ] 68 %dec = add i8 %y.addr.08, -1 69 %incdec.ptr = getelementptr inbounds i8, ptr %x.addr.07, i16 1 70 %0 = load i8, ptr %x.addr.07 71 %add = add i8 %0, %r.09 72 %tobool = icmp eq i8 %dec, 0 73 br i1 %tobool, label %while.end, label %while.body 74while.end: ; preds = %while.body, %entry 75 %r.0.lcssa = phi i8 [ 0, %entry ], [ %add, %while.body ] 76 ret i8 %r.0.lcssa 77} 78 79define i16 @load16postinc(ptr %x, i16 %y) { 80; CHECK-LABEL: load16postinc: 81; CHECK: ld {{.*}}, {{[XYZ]}}+ 82; CHECK: ld {{.*}}, {{[XYZ]}}+ 83entry: 84 %tobool2 = icmp eq i16 %y, 0 85 br i1 %tobool2, label %while.end, label %while.body 86while.body: ; preds = %entry, %while.body 87 %r.05 = phi i16 [ %add, %while.body ], [ 0, %entry ] 88 %y.addr.04 = phi i16 [ %dec, %while.body ], [ %y, %entry ] 89 %x.addr.03 = phi ptr [ %incdec.ptr, %while.body ], [ %x, %entry ] 90 %dec = add nsw i16 %y.addr.04, -1 91 %incdec.ptr = getelementptr inbounds i16, ptr %x.addr.03, i16 1 92 %0 = load i16, ptr %x.addr.03 93 %add = add nsw i16 %0, %r.05 94 %tobool = icmp eq i16 %dec, 0 95 br i1 %tobool, label %while.end, label %while.body 96while.end: ; preds = %while.body, %entry 97 %r.0.lcssa = phi i16 [ 0, %entry ], [ %add, %while.body ] 98 ret i16 %r.0.lcssa 99} 100 101define i8 @load8predec(ptr %x, i8 %y) { 102; CHECK-LABEL: load8predec: 103; CHECK: ld {{.*}}, -{{[XYZ]}} 104entry: 105 %tobool6 = icmp eq i8 %y, 0 106 br i1 %tobool6, label %while.end, label %while.body 107while.body: ; preds = %entry, %while.body 108 %r.09 = phi i8 [ %add, %while.body ], [ 0, %entry ] 109 %y.addr.08 = phi i8 [ %dec, %while.body ], [ %y, %entry ] 110 %x.addr.07 = phi ptr [ %incdec.ptr, %while.body ], [ %x, %entry ] 111 %dec = add i8 %y.addr.08, -1 112 %incdec.ptr = getelementptr inbounds i8, ptr %x.addr.07, i16 -1 113 %0 = load i8, ptr %incdec.ptr 114 %add = add i8 %0, %r.09 115 %tobool = icmp eq i8 %dec, 0 116 br i1 %tobool, label %while.end, label %while.body 117while.end: ; preds = %while.body, %entry 118 %r.0.lcssa = phi i8 [ 0, %entry ], [ %add, %while.body ] 119 ret i8 %r.0.lcssa 120} 121 122define i16 @load16predec(ptr %x, i16 %y) { 123; CHECK-LABEL: load16predec: 124; CHECK: ld {{.*}}, -{{[XYZ]}} 125; CHECK: ld {{.*}}, -{{[XYZ]}} 126entry: 127 %tobool2 = icmp eq i16 %y, 0 128 br i1 %tobool2, label %while.end, label %while.body 129while.body: ; preds = %entry, %while.body 130 %r.05 = phi i16 [ %add, %while.body ], [ 0, %entry ] 131 %y.addr.04 = phi i16 [ %dec, %while.body ], [ %y, %entry ] 132 %x.addr.03 = phi ptr [ %incdec.ptr, %while.body ], [ %x, %entry ] 133 %dec = add nsw i16 %y.addr.04, -1 134 %incdec.ptr = getelementptr inbounds i16, ptr %x.addr.03, i16 -1 135 %0 = load i16, ptr %incdec.ptr 136 %add = add nsw i16 %0, %r.05 137 %tobool = icmp eq i16 %dec, 0 138 br i1 %tobool, label %while.end, label %while.body 139while.end: ; preds = %while.body, %entry 140 %r.0.lcssa = phi i16 [ 0, %entry ], [ %add, %while.body ] 141 ret i16 %r.0.lcssa 142} 143 144define ptr addrspace(1) @load16_postinc_progmem(ptr addrspace(1) readonly %0) { 145; CHECK-LABEL: load16_postinc_progmem: 146; CHECK: movw r30, [[REG0:r[0-9]+]] 147; CHECK: lpm [[REG1:r[0-9]+]], Z+ 148; CHECK: lpm [[REG1:r[0-9]+]], Z 149; CHECK: call foo 150; CHECK: adiw [[REG0:r[0-9]+]], 2 151 %2 = load i16, ptr addrspace(1) %0, align 1 152 tail call addrspace(1) void @foo(i16 %2) 153 %3 = getelementptr inbounds i16, ptr addrspace(1) %0, i16 1 154 ret ptr addrspace(1) %3 155} 156 157declare void @foo(i16) 158