xref: /llvm-project/llvm/test/Transforms/CodeGenPrepare/ARM/branch-on-zero.ll (revision ab12bba0aad800c1805eca2ea937da958c1854c8)
1d539357eSDavid Green; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2f1ec0d12SNick Anderson; RUN: opt -S -passes='require<profile-summary>,function(codegenprepare)' < %s | FileCheck %s
3d539357eSDavid Green
4d539357eSDavid Greentarget datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5d539357eSDavid Greentarget triple = "thumbv8.1m.main-none-eabi"
6d539357eSDavid Green
7d539357eSDavid Greendefine i32 @lshr3_then(i32 %a) {
8d539357eSDavid Green; CHECK-LABEL: @lshr3_then(
9d539357eSDavid Green; CHECK-NEXT:  entry:
10dd5c5202SDavid Green; CHECK-NEXT:    [[L:%.*]] = lshr i32 [[A:%.*]], 3
11dd5c5202SDavid Green; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[L]], 0
12dd5c5202SDavid Green; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
13d539357eSDavid Green; CHECK:       then:
14d539357eSDavid Green; CHECK-NEXT:    ret i32 0
15d539357eSDavid Green; CHECK:       else:
16d539357eSDavid Green; CHECK-NEXT:    ret i32 [[L]]
17d539357eSDavid Green;
18d539357eSDavid Greenentry:
19d539357eSDavid Green  %c = icmp ult i32 %a, 8
20d539357eSDavid Green  br i1 %c, label %then, label %else
21d539357eSDavid Green
22d539357eSDavid Greenthen:
23d539357eSDavid Green  ret i32 0
24d539357eSDavid Green
25d539357eSDavid Greenelse:
26d539357eSDavid Green  %l = lshr i32 %a, 3
27d539357eSDavid Green  ret i32 %l
28d539357eSDavid Green}
29d539357eSDavid Green
30d539357eSDavid Greendefine i32 @lshr5_else(i32 %a) {
31d539357eSDavid Green; CHECK-LABEL: @lshr5_else(
32d539357eSDavid Green; CHECK-NEXT:  entry:
33dd5c5202SDavid Green; CHECK-NEXT:    [[L:%.*]] = lshr i32 [[A:%.*]], 5
34dd5c5202SDavid Green; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[L]], 0
35dd5c5202SDavid Green; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
36d539357eSDavid Green; CHECK:       then:
37d539357eSDavid Green; CHECK-NEXT:    ret i32 [[L]]
38d539357eSDavid Green; CHECK:       else:
39d539357eSDavid Green; CHECK-NEXT:    ret i32 0
40d539357eSDavid Green;
41d539357eSDavid Greenentry:
42d539357eSDavid Green  %c = icmp ult i32 %a, 32
43d539357eSDavid Green  br i1 %c, label %then, label %else
44d539357eSDavid Green
45d539357eSDavid Greenthen:
46d539357eSDavid Green  %l = lshr i32 %a, 5
47d539357eSDavid Green  ret i32 %l
48d539357eSDavid Green
49d539357eSDavid Greenelse:
50d539357eSDavid Green  ret i32 0
51d539357eSDavid Green}
52d539357eSDavid Green
53d539357eSDavid Greendefine i32 @lshr2_entry(i32 %a) {
54d539357eSDavid Green; CHECK-LABEL: @lshr2_entry(
55d539357eSDavid Green; CHECK-NEXT:  entry:
56d539357eSDavid Green; CHECK-NEXT:    [[L:%.*]] = lshr i32 [[A:%.*]], 1
57dd5c5202SDavid Green; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[L]], 0
58dd5c5202SDavid Green; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
59d539357eSDavid Green; CHECK:       then:
60d539357eSDavid Green; CHECK-NEXT:    ret i32 [[L]]
61d539357eSDavid Green; CHECK:       else:
62d539357eSDavid Green; CHECK-NEXT:    ret i32 0
63d539357eSDavid Green;
64d539357eSDavid Greenentry:
65d539357eSDavid Green  %l = lshr i32 %a, 1
66d539357eSDavid Green  %c = icmp ult i32 %a, 2
67d539357eSDavid Green  br i1 %c, label %then, label %else
68d539357eSDavid Green
69d539357eSDavid Greenthen:
70d539357eSDavid Green  ret i32 %l
71d539357eSDavid Green
72d539357eSDavid Greenelse:
73d539357eSDavid Green  ret i32 0
74d539357eSDavid Green}
75d539357eSDavid Green
76d539357eSDavid Greendefine i32 @lshr5mismatch(i32 %a) {
77d539357eSDavid Green; CHECK-LABEL: @lshr5mismatch(
78d539357eSDavid Green; CHECK-NEXT:  entry:
79d539357eSDavid Green; CHECK-NEXT:    [[C:%.*]] = icmp ult i32 [[A:%.*]], 17
80d539357eSDavid Green; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
81d539357eSDavid Green; CHECK:       then:
82d539357eSDavid Green; CHECK-NEXT:    [[L:%.*]] = lshr i32 [[A]], 5
83d539357eSDavid Green; CHECK-NEXT:    ret i32 [[L]]
84d539357eSDavid Green; CHECK:       else:
85d539357eSDavid Green; CHECK-NEXT:    ret i32 0
86d539357eSDavid Green;
87d539357eSDavid Greenentry:
88d539357eSDavid Green  %c = icmp ult i32 %a, 17
89d539357eSDavid Green  br i1 %c, label %then, label %else
90d539357eSDavid Green
91d539357eSDavid Greenthen:
92d539357eSDavid Green  %l = lshr i32 %a, 5
93d539357eSDavid Green  ret i32 %l
94d539357eSDavid Green
95d539357eSDavid Greenelse:
96d539357eSDavid Green  ret i32 0
97d539357eSDavid Green}
98d539357eSDavid Green
99d539357eSDavid Greendefine i32 @ashr5_else(i32 %a) {
100d539357eSDavid Green; CHECK-LABEL: @ashr5_else(
101d539357eSDavid Green; CHECK-NEXT:  entry:
102dd5c5202SDavid Green; CHECK-NEXT:    [[L:%.*]] = ashr i32 [[A:%.*]], 5
103dd5c5202SDavid Green; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[L]], 0
104dd5c5202SDavid Green; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
105d539357eSDavid Green; CHECK:       then:
106d539357eSDavid Green; CHECK-NEXT:    ret i32 [[L]]
107d539357eSDavid Green; CHECK:       else:
108d539357eSDavid Green; CHECK-NEXT:    ret i32 0
109d539357eSDavid Green;
110d539357eSDavid Greenentry:
111d539357eSDavid Green  %c = icmp ult i32 %a, 32
112d539357eSDavid Green  br i1 %c, label %then, label %else
113d539357eSDavid Green
114d539357eSDavid Greenthen:
115d539357eSDavid Green  %l = ashr i32 %a, 5
116d539357eSDavid Green  ret i32 %l
117d539357eSDavid Green
118d539357eSDavid Greenelse:
119d539357eSDavid Green  ret i32 0
120d539357eSDavid Green}
121d539357eSDavid Green
122d539357eSDavid Greendefine i32 @add10_else(i32 %a) {
123d539357eSDavid Green; CHECK-LABEL: @add10_else(
124d539357eSDavid Green; CHECK-NEXT:  entry:
125d539357eSDavid Green; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[A:%.*]], 10
126d539357eSDavid Green; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
127d539357eSDavid Green; CHECK:       then:
128d539357eSDavid Green; CHECK-NEXT:    ret i32 0
129d539357eSDavid Green; CHECK:       else:
130d539357eSDavid Green; CHECK-NEXT:    [[L:%.*]] = add i32 [[A]], 10
131d539357eSDavid Green; CHECK-NEXT:    ret i32 [[L]]
132d539357eSDavid Green;
133d539357eSDavid Greenentry:
134d539357eSDavid Green  %c = icmp eq i32 %a, 10
135d539357eSDavid Green  br i1 %c, label %then, label %else
136d539357eSDavid Green
137d539357eSDavid Greenthen:
138d539357eSDavid Green  ret i32 0
139d539357eSDavid Green
140d539357eSDavid Greenelse:
141d539357eSDavid Green  %l = add i32 %a, 10
142d539357eSDavid Green  ret i32 %l
143d539357eSDavid Green}
144d539357eSDavid Green
145d539357eSDavid Greendefine i32 @addm10_then(i32 %a) {
146d539357eSDavid Green; CHECK-LABEL: @addm10_then(
147d539357eSDavid Green; CHECK-NEXT:  entry:
148dd5c5202SDavid Green; CHECK-NEXT:    [[L:%.*]] = add i32 [[A:%.*]], -10
149dd5c5202SDavid Green; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[L]], 0
150dd5c5202SDavid Green; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
151d539357eSDavid Green; CHECK:       then:
152d539357eSDavid Green; CHECK-NEXT:    ret i32 [[L]]
153d539357eSDavid Green; CHECK:       else:
154d539357eSDavid Green; CHECK-NEXT:    ret i32 0
155d539357eSDavid Green;
156d539357eSDavid Greenentry:
157d539357eSDavid Green  %c = icmp eq i32 %a, 10
158d539357eSDavid Green  br i1 %c, label %then, label %else
159d539357eSDavid Green
160d539357eSDavid Greenthen:
161d539357eSDavid Green  %l = add i32 %a, -10
162d539357eSDavid Green  ret i32 %l
163d539357eSDavid Green
164d539357eSDavid Greenelse:
165d539357eSDavid Green  ret i32 0
166d539357eSDavid Green}
167d539357eSDavid Green
168d539357eSDavid Greendefine i32 @add_missmatch(i32 %a) {
169d539357eSDavid Green; CHECK-LABEL: @add_missmatch(
170d539357eSDavid Green; CHECK-NEXT:  entry:
171d539357eSDavid Green; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[A:%.*]], 10
172d539357eSDavid Green; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
173d539357eSDavid Green; CHECK:       then:
174d539357eSDavid Green; CHECK-NEXT:    [[L:%.*]] = add i32 [[A]], 10
175d539357eSDavid Green; CHECK-NEXT:    ret i32 [[L]]
176d539357eSDavid Green; CHECK:       else:
177d539357eSDavid Green; CHECK-NEXT:    ret i32 0
178d539357eSDavid Green;
179d539357eSDavid Greenentry:
180d539357eSDavid Green  %c = icmp eq i32 %a, 10
181d539357eSDavid Green  br i1 %c, label %then, label %else
182d539357eSDavid Green
183d539357eSDavid Greenthen:
184d539357eSDavid Green  %l = add i32 %a, 10
185d539357eSDavid Green  ret i32 %l
186d539357eSDavid Green
187d539357eSDavid Greenelse:
188d539357eSDavid Green  ret i32 0
189d539357eSDavid Green}
190d539357eSDavid Green
191d539357eSDavid Greendefine i32 @sub10_else(i32 %a) {
192d539357eSDavid Green; CHECK-LABEL: @sub10_else(
193d539357eSDavid Green; CHECK-NEXT:  entry:
194dd5c5202SDavid Green; CHECK-NEXT:    [[L:%.*]] = sub i32 [[A:%.*]], 10
195dd5c5202SDavid Green; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[L]], 0
196dd5c5202SDavid Green; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
197d539357eSDavid Green; CHECK:       then:
198d539357eSDavid Green; CHECK-NEXT:    ret i32 0
199d539357eSDavid Green; CHECK:       else:
200d539357eSDavid Green; CHECK-NEXT:    ret i32 [[L]]
201d539357eSDavid Green;
202d539357eSDavid Greenentry:
203d539357eSDavid Green  %c = icmp eq i32 %a, 10
204d539357eSDavid Green  br i1 %c, label %then, label %else
205d539357eSDavid Green
206d539357eSDavid Greenthen:
207d539357eSDavid Green  ret i32 0
208d539357eSDavid Green
209d539357eSDavid Greenelse:
210d539357eSDavid Green  %l = sub i32 %a, 10
211d539357eSDavid Green  ret i32 %l
212d539357eSDavid Green}
213d539357eSDavid Green
214*ab12bba0SYingwei Zhengdefine i32 @sub10_else_drop_nuw(i32 %a) {
215*ab12bba0SYingwei Zheng; CHECK-LABEL: @sub10_else_drop_nuw(
216*ab12bba0SYingwei Zheng; CHECK-NEXT:  entry:
217*ab12bba0SYingwei Zheng; CHECK-NEXT:    [[L:%.*]] = sub i32 [[A:%.*]], 10
218*ab12bba0SYingwei Zheng; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[L]], 0
219*ab12bba0SYingwei Zheng; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
220*ab12bba0SYingwei Zheng; CHECK:       then:
221*ab12bba0SYingwei Zheng; CHECK-NEXT:    ret i32 0
222*ab12bba0SYingwei Zheng; CHECK:       else:
223*ab12bba0SYingwei Zheng; CHECK-NEXT:    ret i32 [[L]]
224*ab12bba0SYingwei Zheng;
225*ab12bba0SYingwei Zhengentry:
226*ab12bba0SYingwei Zheng  %c = icmp eq i32 %a, 10
227*ab12bba0SYingwei Zheng  br i1 %c, label %then, label %else
228*ab12bba0SYingwei Zheng
229*ab12bba0SYingwei Zhengthen:
230*ab12bba0SYingwei Zheng  ret i32 0
231*ab12bba0SYingwei Zheng
232*ab12bba0SYingwei Zhengelse:
233*ab12bba0SYingwei Zheng  %l = sub nuw i32 %a, 10
234*ab12bba0SYingwei Zheng  ret i32 %l
235*ab12bba0SYingwei Zheng}
236*ab12bba0SYingwei Zheng
237d539357eSDavid Greendefine i32 @subm10_then(i32 %a) {
238d539357eSDavid Green; CHECK-LABEL: @subm10_then(
239d539357eSDavid Green; CHECK-NEXT:  entry:
240dd5c5202SDavid Green; CHECK-NEXT:    [[L:%.*]] = sub i32 [[A:%.*]], -10
241dd5c5202SDavid Green; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[L]], 0
242dd5c5202SDavid Green; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
243d539357eSDavid Green; CHECK:       then:
244d539357eSDavid Green; CHECK-NEXT:    ret i32 [[L]]
245d539357eSDavid Green; CHECK:       else:
246d539357eSDavid Green; CHECK-NEXT:    ret i32 0
247d539357eSDavid Green;
248d539357eSDavid Greenentry:
249d539357eSDavid Green  %c = icmp eq i32 %a, -10
250d539357eSDavid Green  br i1 %c, label %then, label %else
251d539357eSDavid Green
252d539357eSDavid Greenthen:
253d539357eSDavid Green  %l = sub i32 %a, -10
254d539357eSDavid Green  ret i32 %l
255d539357eSDavid Green
256d539357eSDavid Greenelse:
257d539357eSDavid Green  ret i32 0
258d539357eSDavid Green}
259d539357eSDavid Green
260d539357eSDavid Greendefine i64 @lshr64(i64 %a) {
261d539357eSDavid Green; CHECK-LABEL: @lshr64(
262d539357eSDavid Green; CHECK-NEXT:  entry:
263dd5c5202SDavid Green; CHECK-NEXT:    [[L:%.*]] = lshr i64 [[A:%.*]], 40
264dd5c5202SDavid Green; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i64 [[L]], 0
265dd5c5202SDavid Green; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
266d539357eSDavid Green; CHECK:       then:
267d539357eSDavid Green; CHECK-NEXT:    ret i64 0
268d539357eSDavid Green; CHECK:       else:
269d539357eSDavid Green; CHECK-NEXT:    ret i64 [[L]]
270d539357eSDavid Green;
271d539357eSDavid Greenentry:
272d539357eSDavid Green  %c = icmp ult i64 %a, 1099511627776
273d539357eSDavid Green  br i1 %c, label %then, label %else
274d539357eSDavid Green
275d539357eSDavid Greenthen:
276d539357eSDavid Green  ret i64 0
277d539357eSDavid Green
278d539357eSDavid Greenelse:
279d539357eSDavid Green  %l = lshr i64 %a, 40
280d539357eSDavid Green  ret i64 %l
281d539357eSDavid Green}
282d539357eSDavid Green
283d539357eSDavid Greendefine i128 @lshr128(i128 %a) {
284d539357eSDavid Green; CHECK-LABEL: @lshr128(
285d539357eSDavid Green; CHECK-NEXT:  entry:
286dd5c5202SDavid Green; CHECK-NEXT:    [[L:%.*]] = lshr i128 [[A:%.*]], 65
287dd5c5202SDavid Green; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i128 [[L]], 0
288dd5c5202SDavid Green; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
289d539357eSDavid Green; CHECK:       then:
290d539357eSDavid Green; CHECK-NEXT:    ret i128 0
291d539357eSDavid Green; CHECK:       else:
292d539357eSDavid Green; CHECK-NEXT:    ret i128 [[L]]
293d539357eSDavid Green;
294d539357eSDavid Greenentry:
295d539357eSDavid Green  %c = icmp ult i128 %a, 36893488147419103232
296d539357eSDavid Green  br i1 %c, label %then, label %else
297d539357eSDavid Green
298d539357eSDavid Greenthen:
299d539357eSDavid Green  ret i128 0
300d539357eSDavid Green
301d539357eSDavid Greenelse:
302d539357eSDavid Green  %l = lshr i128 %a, 65
303d539357eSDavid Green  ret i128 %l
304d539357eSDavid Green}
305d539357eSDavid Green
306d539357eSDavid Greendefine i32 @addm1_dom(i32 %a) {
307d539357eSDavid Green; CHECK-LABEL: @addm1_dom(
308d539357eSDavid Green; CHECK-NEXT:  entry:
309d539357eSDavid Green; CHECK-NEXT:    [[C1:%.*]] = icmp eq i32 [[A:%.*]], 100
310d539357eSDavid Green; CHECK-NEXT:    br i1 [[C1]], label [[IF:%.*]], label [[ELSE:%.*]]
311d539357eSDavid Green; CHECK:       if:
312d539357eSDavid Green; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[A]], -1
313d539357eSDavid Green; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE]]
314d539357eSDavid Green; CHECK:       then:
315d539357eSDavid Green; CHECK-NEXT:    ret i32 0
316d539357eSDavid Green; CHECK:       else:
317d539357eSDavid Green; CHECK-NEXT:    [[L:%.*]] = add i32 [[A]], 1
318d539357eSDavid Green; CHECK-NEXT:    ret i32 [[L]]
319d539357eSDavid Green;
320d539357eSDavid Greenentry:
321d539357eSDavid Green  %c1 = icmp eq i32 %a, 100
322d539357eSDavid Green  br i1 %c1, label %if, label %else
323d539357eSDavid Green
324d539357eSDavid Greenif:
325d539357eSDavid Green  %c = icmp eq i32 %a, -1
326d539357eSDavid Green  br i1 %c, label %then, label %else
327d539357eSDavid Green
328d539357eSDavid Greenthen:
329d539357eSDavid Green  ret i32 0
330d539357eSDavid Green
331d539357eSDavid Greenelse:
332d539357eSDavid Green  %l = add i32 %a, 1
333d539357eSDavid Green  ret i32 %l
334d539357eSDavid Green}
335d539357eSDavid Green
336d539357eSDavid Greendeclare void @other()
337