186 lines · plain
1; RUN: llc -mattr=avr6,sram < %s -mtriple=avr-none -verify-machineinstrs | FileCheck %s2 3define i8 @load8(ptr %x) {4; CHECK-LABEL: load8:5; CHECK: ld r24, {{[XYZ]}}6 %1 = load i8, ptr %x7 ret i8 %18}9 10define i16 @load16(ptr %x) {11; CHECK-LABEL: load16:12; CHECK: ld r24, [[PTR:[YZ]]]13; CHECK: ldd r25, [[PTR]]+114 %1 = load i16, ptr %x15 ret i16 %116}17 18define i8 @load8disp(ptr %x) {19; CHECK-LABEL: load8disp:20; CHECK: ldd r24, {{[YZ]}}+6321 %1 = getelementptr inbounds i8, ptr %x, i64 6322 %2 = load i8, ptr %123 ret i8 %224}25 26define i8 @load8nodisp(ptr %x) {27; CHECK-LABEL: load8nodisp:28; CHECK: movw r26, r2429; CHECK: subi r26, 19230; CHECK: sbci r27, 25531; CHECK: ld r24, {{[XYZ]}}32 %1 = getelementptr inbounds i8, ptr %x, i64 6433 %2 = load i8, ptr %134 ret i8 %235}36 37define i16 @load16disp(ptr %x) {38; CHECK-LABEL: load16disp:39; CHECK: ldd r24, [[PTR:[YZ]]]+6240; CHECK: ldd r25, [[PTR]]+6341 %1 = getelementptr inbounds i16, ptr %x, i64 3142 %2 = load i16, ptr %143 ret i16 %244}45 46define i16 @load16nodisp(ptr %x) {47; CHECK-LABEL: load16nodisp:48; CHECK: subi r24, 19249; CHECK: sbci r25, 25550; CHECK: movw r30, r2451; CHECK: ld r24, [[PTR:[YZ]]]52; CHECK: ldd r25, [[PTR]]+153 %1 = getelementptr inbounds i16, ptr %x, i64 3254 %2 = load i16, ptr %155 ret i16 %256}57 58define i8 @load8postinc(ptr %x, i8 %y) {59; CHECK-LABEL: load8postinc:60; CHECK: ld {{.*}}, {{[XYZ]}}+61entry:62 %tobool6 = icmp eq i8 %y, 063 br i1 %tobool6, label %while.end, label %while.body64while.body: ; preds = %entry, %while.body65 %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, -169 %incdec.ptr = getelementptr inbounds i8, ptr %x.addr.07, i16 170 %0 = load i8, ptr %x.addr.0771 %add = add i8 %0, %r.0972 %tobool = icmp eq i8 %dec, 073 br i1 %tobool, label %while.end, label %while.body74while.end: ; preds = %while.body, %entry75 %r.0.lcssa = phi i8 [ 0, %entry ], [ %add, %while.body ]76 ret i8 %r.0.lcssa77}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, 085 br i1 %tobool2, label %while.end, label %while.body86while.body: ; preds = %entry, %while.body87 %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, -191 %incdec.ptr = getelementptr inbounds i16, ptr %x.addr.03, i16 192 %0 = load i16, ptr %x.addr.0393 %add = add nsw i16 %0, %r.0594 %tobool = icmp eq i16 %dec, 095 br i1 %tobool, label %while.end, label %while.body96while.end: ; preds = %while.body, %entry97 %r.0.lcssa = phi i16 [ 0, %entry ], [ %add, %while.body ]98 ret i16 %r.0.lcssa99}100 101define i16 @load16postincloopreduce(ptr %p, i16 %cnt) {102; CHECK-LABEL: load16postincloopreduce:103; CHECK: ld {{.*}}, {{[XYZ]}}+104; CHECK: ld {{.*}}, {{[XYZ]}}+105entry:106 %cmp3 = icmp sgt i16 %cnt, 0107 br i1 %cmp3, label %for.body, label %for.cond.cleanup108for.cond.cleanup: ; preds = %for.body, %entry109 %sum.0.lcssa = phi i16 [ 0, %entry ], [ %add, %for.body ]110 ret i16 %sum.0.lcssa111for.body: ; preds = %entry, %for.body112 %i.06 = phi i16 [ %inc, %for.body ], [ 0, %entry ]113 %sum.05 = phi i16 [ %add, %for.body ], [ 0, %entry ]114 %p.addr.04 = phi ptr [ %incdec.ptr, %for.body ], [ %p, %entry ]115 %incdec.ptr = getelementptr inbounds nuw i8, ptr %p.addr.04, i16 2116 %0 = load i16, ptr %p.addr.04, align 1117 %add = add nsw i16 %0, %sum.05118 %inc = add nuw nsw i16 %i.06, 1119 %exitcond.not = icmp eq i16 %inc, %cnt120 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body121}122 123define i8 @load8predec(ptr %x, i8 %y) {124; CHECK-LABEL: load8predec:125; TODO: ld {{.*}}, -{{[XYZ]}}126; CHECK: sbiw r26, 1127; CHECK: ld {{.*}}, X128entry:129 %tobool6 = icmp eq i8 %y, 0130 br i1 %tobool6, label %while.end, label %while.body131while.body: ; preds = %entry, %while.body132 %r.09 = phi i8 [ %add, %while.body ], [ 0, %entry ]133 %y.addr.08 = phi i8 [ %dec, %while.body ], [ %y, %entry ]134 %x.addr.07 = phi ptr [ %incdec.ptr, %while.body ], [ %x, %entry ]135 %dec = add i8 %y.addr.08, -1136 %incdec.ptr = getelementptr inbounds i8, ptr %x.addr.07, i16 -1137 %0 = load i8, ptr %incdec.ptr138 %add = add i8 %0, %r.09139 %tobool = icmp eq i8 %dec, 0140 br i1 %tobool, label %while.end, label %while.body141while.end: ; preds = %while.body, %entry142 %r.0.lcssa = phi i8 [ 0, %entry ], [ %add, %while.body ]143 ret i8 %r.0.lcssa144}145 146define i16 @load16predec(ptr %x, i16 %y) {147; CHECK-LABEL: load16predec:148; TODO: ld {{.*}}, -{{[XYZ]}}149; TODO: ld {{.*}}, -{{[XYZ]}}150; CHECK: sbiw r24, 2151; CHECK: movw r30, r24152; CHECK: ld {{.*}}, Z153; CHECK: ldd {{.*}}, Z+1154entry:155 %tobool2 = icmp eq i16 %y, 0156 br i1 %tobool2, label %while.end, label %while.body157while.body: ; preds = %entry, %while.body158 %r.05 = phi i16 [ %add, %while.body ], [ 0, %entry ]159 %y.addr.04 = phi i16 [ %dec, %while.body ], [ %y, %entry ]160 %x.addr.03 = phi ptr [ %incdec.ptr, %while.body ], [ %x, %entry ]161 %dec = add nsw i16 %y.addr.04, -1162 %incdec.ptr = getelementptr inbounds i16, ptr %x.addr.03, i16 -1163 %0 = load i16, ptr %incdec.ptr164 %add = add nsw i16 %0, %r.05165 %tobool = icmp eq i16 %dec, 0166 br i1 %tobool, label %while.end, label %while.body167while.end: ; preds = %while.body, %entry168 %r.0.lcssa = phi i16 [ 0, %entry ], [ %add, %while.body ]169 ret i16 %r.0.lcssa170}171 172define ptr addrspace(1) @load16_postinc_progmem(ptr addrspace(1) readonly %0) {173; CHECK-LABEL: load16_postinc_progmem:174; CHECK: movw r30, [[REG0:r[0-9]+]]175; CHECK: lpm [[REG1:r[0-9]+]], Z+176; CHECK: lpm [[REG1:r[0-9]+]], Z177; CHECK: call foo178; CHECK: adiw [[REG0:r[0-9]+]], 2179 %2 = load i16, ptr addrspace(1) %0, align 1180 tail call addrspace(1) void @foo(i16 %2)181 %3 = getelementptr inbounds i16, ptr addrspace(1) %0, i16 1182 ret ptr addrspace(1) %3183}184 185declare void @foo(i16)186