120
|
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]}}}
|
|
7 define 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
|
|
27 define 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]}}}
|
|
47 define 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
|
|
66 define 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 }
|