102 lines · plain
1; RUN: llc -mtriple=thumbv7 -mcpu=cortex-m0 < %s -disable-lsr | FileCheck %s2; FIXME: LSR mangles the last two testcases pretty badly. When this is fixed, remove3; the -disable-lsr above.4 5; CHECK-LABEL: @f6; CHECK: ldm {{r[0-9]}}!, {r{{[0-9]}}}7define i32 @f(ptr readonly %a, ptr readnone %b) {8 %1 = icmp eq ptr %a, %b9 br i1 %1, label %._crit_edge, label %.lr.ph10 11.lr.ph: ; preds = %.lr.ph, %012 %i.02 = phi i32 [ %3, %.lr.ph ], [ 0, %0 ]13 %.01 = phi ptr [ %4, %.lr.ph ], [ %a, %0 ]14 %2 = load i32, ptr %.01, align 415 %3 = add nsw i32 %2, %i.0216 %4 = getelementptr inbounds i32, ptr %.01, i32 117 %5 = icmp eq ptr %4, %b18 br i1 %5, label %._crit_edge, label %.lr.ph19 20._crit_edge: ; preds = %.lr.ph, %021 %i.0.lcssa = phi i32 [ 0, %0 ], [ %3, %.lr.ph ]22 ret i32 %i.0.lcssa23}24 25; CHECK-LABEL: @g26; CHECK-NOT: ldm27define i32 @g(ptr readonly %a, ptr readnone %b) {28 %1 = icmp eq ptr %a, %b29 br i1 %1, label %._crit_edge, label %.lr.ph30 31.lr.ph: ; preds = %.lr.ph, %032 %i.02 = phi i32 [ %3, %.lr.ph ], [ 0, %0 ]33 %.01 = phi ptr [ %4, %.lr.ph ], [ %a, %0 ]34 %2 = load i32, ptr %.01, align 435 %3 = add nsw i32 %2, %i.0236 %4 = getelementptr inbounds i32, ptr %.01, i32 237 %5 = icmp eq ptr %4, %b38 br i1 %5, label %._crit_edge, label %.lr.ph39 40._crit_edge: ; preds = %.lr.ph, %041 %i.0.lcssa = phi i32 [ 0, %0 ], [ %3, %.lr.ph ]42 ret i32 %i.0.lcssa43}44 45; CHECK-LABEL: @h46; CHECK: stm {{r[0-9]}}!, {r{{[0-9]}}}47define void @h(ptr %a, ptr readnone %b) {48 %1 = icmp eq ptr %a, %b49 br i1 %1, label %._crit_edge, label %.lr.ph50 51.lr.ph: ; preds = %.lr.ph, %052 %i.02 = phi i32 [ %2, %.lr.ph ], [ 0, %0 ]53 %.01 = phi ptr [ %3, %.lr.ph ], [ %a, %0 ]54 %2 = add nsw i32 %i.02, 155 store i32 %i.02, ptr %.01, align 456 %3 = getelementptr inbounds i32, ptr %.01, i32 157 %4 = icmp eq ptr %3, %b58 br i1 %4, label %._crit_edge, label %.lr.ph59 60._crit_edge: ; preds = %.lr.ph, %061 ret void62}63 64; CHECK-LABEL: @j65; CHECK-NOT: stm66define void @j(ptr %a, ptr readnone %b) {67 %1 = icmp eq ptr %a, %b68 br i1 %1, label %._crit_edge, label %.lr.ph69 70.lr.ph: ; preds = %.lr.ph, %071 %i.02 = phi i32 [ %2, %.lr.ph ], [ 0, %0 ]72 %.01 = phi ptr [ %3, %.lr.ph ], [ %a, %0 ]73 %2 = add nsw i32 %i.02, 174 store i32 %i.02, ptr %.01, align 475 %3 = getelementptr inbounds i32, ptr %.01, i32 276 %4 = icmp eq ptr %3, %b77 br i1 %4, label %._crit_edge, label %.lr.ph78 79._crit_edge: ; preds = %.lr.ph, %080 ret void81}82 83; Make sure we don't transform str->stm when unaligned loads are allowed.84; CHECK-LABEL: @nostrictalign85; CHECK: str r2, [r0]86define void @nostrictalign(ptr %a, ptr readnone %b) "target-features"="-strict-align" {87 %1 = icmp eq ptr %a, %b88 br i1 %1, label %._crit_edge, label %.lr.ph89 90.lr.ph: ; preds = %.lr.ph, %091 %i.02 = phi i32 [ %2, %.lr.ph ], [ 0, %0 ]92 %.01 = phi ptr [ %3, %.lr.ph ], [ %a, %0 ]93 %2 = add nsw i32 %i.02, 194 store i32 %i.02, ptr %.01, align 195 %3 = getelementptr inbounds i32, ptr %.01, i32 196 %4 = icmp eq ptr %3, %b97 br i1 %4, label %._crit_edge, label %.lr.ph98 99._crit_edge: ; preds = %.lr.ph, %0100 ret void101}102