blob: 5c3800e97093039867a6811a88aa1b6d05da9fc3 [file] [log] [blame]
John Brawn75d76e52017-06-28 14:11:15 +00001; 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: ite 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:
John Brawn97cc2832017-07-12 13:23:10 +000098; 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
John Brawn75d76e52017-06-28 14:11:15 +0000109define i32 @diamond2(i32 %n, i32 %m, 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
John Brawn97cc2832017-07-12 13:23:10 +0000116 %arrayidx = getelementptr inbounds i32, i32* %p, i32 2
117 store i32 %n, i32* %arrayidx, align 4
John Brawn75d76e52017-06-28 14:11:15 +0000118 br label %if.end
119
120if.else:
121 store i32 %m, 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}