• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc < %s -mtriple=thumbv7m -mcpu=cortex-m7 | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-BP
2; RUN: llc < %s -mtriple=thumbv7m -mcpu=cortex-m3 | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-NOBP
3
4declare void @otherfn()
5
6; CHECK-LABEL: triangle1:
7; CHECK: itt ne
8; CHECK: movne
9; CHECK: strne
10define i32 @triangle1(i32 %n, i32* %p) {
11entry:
12  %tobool = icmp eq i32 %n, 0
13  br i1 %tobool, label %if.end, label %if.then
14
15if.then:
16  store i32 1, i32* %p, align 4
17  br label %if.end
18
19if.end:
20  tail call void @otherfn()
21  ret i32 0
22}
23
24; CHECK-LABEL: triangle2:
25; CHECK-BP: itttt ne
26; CHECK-BP: movne
27; CHECK-BP: strne
28; CHECK-BP: movne
29; CHECK-BP: strne
30; CHECK-NOBP: cbz
31; CHECK-NOBP: movs
32; CHECK-NOBP: str
33; CHECK-NOBP: movs
34; CHECK-NOBP: str
35define i32 @triangle2(i32 %n, i32* %p, i32* %q) {
36entry:
37  %tobool = icmp eq i32 %n, 0
38  br i1 %tobool, label %if.end, label %if.then
39
40if.then:
41  store i32 1, i32* %p, align 4
42  store i32 2, i32* %q, align 4
43  br label %if.end
44
45if.end:
46  tail call void @otherfn()
47  ret i32 0
48}
49
50; CHECK-LABEL: triangle3:
51; CHECK: cbz
52; CHECK: movs
53; CHECK: str
54; CHECK: movs
55; CHECK: str
56; CHECK: movs
57; CHECK: str
58define i32 @triangle3(i32 %n, i32* %p, i32* %q, i32* %r) {
59entry:
60  %tobool = icmp eq i32 %n, 0
61  br i1 %tobool, label %if.end, label %if.then
62
63if.then:
64  store i32 1, i32* %p, align 4
65  store i32 2, i32* %q, align 4
66  store i32 3, i32* %r, align 4
67  br label %if.end
68
69if.end:
70  tail call void @otherfn()
71  ret i32 0
72}
73
74; CHECK-LABEL: diamond1:
75; CHECK: itee eq
76; CHECK: ldreq
77; CHECK: strne
78define i32 @diamond1(i32 %n, i32* %p) {
79entry:
80  %tobool = icmp eq i32 %n, 0
81  br i1 %tobool, label %if.else, label %if.then
82
83if.then:
84  store i32 %n, i32* %p, align 4
85  br label %if.end
86
87if.else:
88  %0 = load i32, i32* %p, align 4
89  br label %if.end
90
91if.end:
92  %n.addr.0 = phi i32 [ %n, %if.then ], [ %0, %if.else ]
93  tail call void @otherfn()
94  ret i32 %n.addr.0
95}
96
97; CHECK-LABEL: diamond2:
98; CHECK-BP: cbz
99; CHECK-BP: str
100; CHECK-BP: str
101; CHECK-BP: b
102; CHECK-BP: str
103; CHECK-BP: ldr
104; CHECK-NOBP: ittee
105; CHECK-NOBP: streq
106; CHECK-NOBP: ldreq
107; CHECK-NOBP: strne
108; CHECK-NOBP: strne
109define i32 @diamond2(i32 %n, i32* %p, i32* %q) {
110entry:
111  %tobool = icmp eq i32 %n, 0
112  br i1 %tobool, label %if.else, label %if.then
113
114if.then:
115  store i32 %n, i32* %p, align 4
116  %arrayidx = getelementptr inbounds i32, i32* %p, i32 2
117  store i32 %n, i32* %arrayidx, align 4
118  br label %if.end
119
120if.else:
121  store i32 %n, i32* %q, align 4
122  %0 = load i32, i32* %p, align 4
123  br label %if.end
124
125if.end:
126  %n.addr.0 = phi i32 [ %n, %if.then ], [ %0, %if.else ]
127  tail call void @otherfn()
128  ret i32 %n.addr.0
129}
130
131; CHECK-LABEL: diamond3:
132; CHECK: cbz
133; CHECK: movs
134; CHECK: str
135; CHECK: b
136; CHECK: ldr
137; CHECK: ldr
138; CHECK: adds
139define i32 @diamond3(i32 %n, i32* %p, i32* %q) {
140entry:
141  %tobool = icmp eq i32 %n, 0
142  br i1 %tobool, label %if.else, label %if.then
143
144if.then:
145  store i32 1, i32* %p, align 4
146  br label %if.end
147
148if.else:
149  %0 = load i32, i32* %p, align 4
150  %1 = load i32, i32* %q, align 4
151  %add = add nsw i32 %1, %0
152  br label %if.end
153
154if.end:
155  %n.addr.0 = phi i32 [ %n, %if.then ], [ %add, %if.else ]
156  tail call void @otherfn()
157  ret i32 %n.addr.0
158}
159