1; RUN: llc -mtriple=thumbv7 -mcpu=cortex-m0 < %s -disable-lsr | FileCheck %s 2; FIXME: LSR mangles the last two testcases pretty badly. When this is fixed, remove 3; the -disable-lsr above. 4 5; CHECK-LABEL: @f 6; CHECK: ldm {{r[0-9]}}!, {r{{[0-9]}}} 7define i32 @f(i32* readonly %a, i32* readnone %b) { 8 %1 = icmp eq i32* %a, %b 9 br i1 %1, label %._crit_edge, label %.lr.ph 10 11.lr.ph: ; preds = %.lr.ph, %0 12 %i.02 = phi i32 [ %3, %.lr.ph ], [ 0, %0 ] 13 %.01 = phi i32* [ %4, %.lr.ph ], [ %a, %0 ] 14 %2 = load i32, i32* %.01, align 4 15 %3 = add nsw i32 %2, %i.02 16 %4 = getelementptr inbounds i32, i32* %.01, i32 1 17 %5 = icmp eq i32* %4, %b 18 br i1 %5, label %._crit_edge, label %.lr.ph 19 20._crit_edge: ; preds = %.lr.ph, %0 21 %i.0.lcssa = phi i32 [ 0, %0 ], [ %3, %.lr.ph ] 22 ret i32 %i.0.lcssa 23} 24 25; CHECK-LABEL: @g 26; CHECK-NOT: ldm 27define i32 @g(i32* readonly %a, i32* readnone %b) { 28 %1 = icmp eq i32* %a, %b 29 br i1 %1, label %._crit_edge, label %.lr.ph 30 31.lr.ph: ; preds = %.lr.ph, %0 32 %i.02 = phi i32 [ %3, %.lr.ph ], [ 0, %0 ] 33 %.01 = phi i32* [ %4, %.lr.ph ], [ %a, %0 ] 34 %2 = load i32, i32* %.01, align 4 35 %3 = add nsw i32 %2, %i.02 36 %4 = getelementptr inbounds i32, i32* %.01, i32 2 37 %5 = icmp eq i32* %4, %b 38 br i1 %5, label %._crit_edge, label %.lr.ph 39 40._crit_edge: ; preds = %.lr.ph, %0 41 %i.0.lcssa = phi i32 [ 0, %0 ], [ %3, %.lr.ph ] 42 ret i32 %i.0.lcssa 43} 44 45; CHECK-LABEL: @h 46; CHECK: stm {{r[0-9]}}!, {r{{[0-9]}}} 47define void @h(i32* %a, i32* readnone %b) { 48 %1 = icmp eq i32* %a, %b 49 br i1 %1, label %._crit_edge, label %.lr.ph 50 51.lr.ph: ; preds = %.lr.ph, %0 52 %i.02 = phi i32 [ %2, %.lr.ph ], [ 0, %0 ] 53 %.01 = phi i32* [ %3, %.lr.ph ], [ %a, %0 ] 54 %2 = add nsw i32 %i.02, 1 55 store i32 %i.02, i32* %.01, align 4 56 %3 = getelementptr inbounds i32, i32* %.01, i32 1 57 %4 = icmp eq i32* %3, %b 58 br i1 %4, label %._crit_edge, label %.lr.ph 59 60._crit_edge: ; preds = %.lr.ph, %0 61 ret void 62} 63 64; CHECK-LABEL: @j 65; CHECK-NOT: stm 66define void @j(i32* %a, i32* readnone %b) { 67 %1 = icmp eq i32* %a, %b 68 br i1 %1, label %._crit_edge, label %.lr.ph 69 70.lr.ph: ; preds = %.lr.ph, %0 71 %i.02 = phi i32 [ %2, %.lr.ph ], [ 0, %0 ] 72 %.01 = phi i32* [ %3, %.lr.ph ], [ %a, %0 ] 73 %2 = add nsw i32 %i.02, 1 74 store i32 %i.02, i32* %.01, align 4 75 %3 = getelementptr inbounds i32, i32* %.01, i32 2 76 %4 = icmp eq i32* %3, %b 77 br i1 %4, label %._crit_edge, label %.lr.ph 78 79._crit_edge: ; preds = %.lr.ph, %0 80 ret void 81} 82