• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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