blob: 7016dfc577f6082b0bac16653ae194651174318f [file] [log] [blame]
Hal Finkelf5867a72014-07-25 21:45:17 +00001; RUN: opt < %s -instcombine -S | FileCheck %s
2target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
3target triple = "x86_64-unknown-linux-gnu"
4
Hal Finkel60db0582014-09-07 18:57:58 +00005define i32 @foo1(i32* %a) #0 {
6entry:
David Blaikiea79ac142015-02-27 21:17:42 +00007 %0 = load i32, i32* %a, align 4
Hal Finkel60db0582014-09-07 18:57:58 +00008
9; Check that the alignment has been upgraded and that the assume has not
10; been removed:
11; CHECK-LABEL: @foo1
David Blaikiea79ac142015-02-27 21:17:42 +000012; CHECK-DAG: load i32, i32* %a, align 32
Daniel Jasperaec2fa32016-12-19 08:22:17 +000013; CHECK-DAG: call void @llvm.assume
Hal Finkel60db0582014-09-07 18:57:58 +000014; CHECK: ret i32
15
16 %ptrint = ptrtoint i32* %a to i64
17 %maskedptr = and i64 %ptrint, 31
18 %maskcond = icmp eq i64 %maskedptr, 0
19 tail call void @llvm.assume(i1 %maskcond)
20
21 ret i32 %0
22}
23
Hal Finkel60db0582014-09-07 18:57:58 +000024define i32 @foo2(i32* %a) #0 {
25entry:
26; Same check as in @foo1, but make sure it works if the assume is first too.
27; CHECK-LABEL: @foo2
David Blaikiea79ac142015-02-27 21:17:42 +000028; CHECK-DAG: load i32, i32* %a, align 32
Daniel Jasperaec2fa32016-12-19 08:22:17 +000029; CHECK-DAG: call void @llvm.assume
Hal Finkel60db0582014-09-07 18:57:58 +000030; CHECK: ret i32
31
32 %ptrint = ptrtoint i32* %a to i64
33 %maskedptr = and i64 %ptrint, 31
34 %maskcond = icmp eq i64 %maskedptr, 0
35 tail call void @llvm.assume(i1 %maskcond)
36
David Blaikiea79ac142015-02-27 21:17:42 +000037 %0 = load i32, i32* %a, align 4
Hal Finkel60db0582014-09-07 18:57:58 +000038 ret i32 %0
39}
40
Hal Finkelf5867a72014-07-25 21:45:17 +000041declare void @llvm.assume(i1) #1
42
Hal Finkel93873cc12014-09-07 21:28:34 +000043define i32 @simple(i32 %a) #1 {
44entry:
45
46; CHECK-LABEL: @simple
47; CHECK: call void @llvm.assume
48; CHECK: ret i32 4
49
50 %cmp = icmp eq i32 %a, 4
Daniel Jasperaec2fa32016-12-19 08:22:17 +000051 tail call void @llvm.assume(i1 %cmp)
Hal Finkel93873cc12014-09-07 21:28:34 +000052 ret i32 %a
53}
54
Hal Finkelf5867a72014-07-25 21:45:17 +000055define i32 @can1(i1 %a, i1 %b, i1 %c) {
56entry:
57 %and1 = and i1 %a, %b
58 %and = and i1 %and1, %c
59 tail call void @llvm.assume(i1 %and)
60
61; CHECK-LABEL: @can1
62; CHECK: call void @llvm.assume(i1 %a)
63; CHECK: call void @llvm.assume(i1 %b)
64; CHECK: call void @llvm.assume(i1 %c)
65; CHECK: ret i32
66
67 ret i32 5
68}
69
Hal Finkelf5867a72014-07-25 21:45:17 +000070define i32 @can2(i1 %a, i1 %b, i1 %c) {
71entry:
72 %v = or i1 %a, %b
73 %w = xor i1 %v, 1
74 tail call void @llvm.assume(i1 %w)
75
76; CHECK-LABEL: @can2
77; CHECK: %[[V1:[^ ]+]] = xor i1 %a, true
78; CHECK: call void @llvm.assume(i1 %[[V1]])
79; CHECK: %[[V2:[^ ]+]] = xor i1 %b, true
80; CHECK: call void @llvm.assume(i1 %[[V2]])
81; CHECK: ret i32
82
83 ret i32 5
84}
85
Hal Finkel60db0582014-09-07 18:57:58 +000086define i32 @bar1(i32 %a) #0 {
87entry:
88 %and1 = and i32 %a, 3
89
90; CHECK-LABEL: @bar1
Daniel Jasperaec2fa32016-12-19 08:22:17 +000091; CHECK: call void @llvm.assume
Hal Finkel60db0582014-09-07 18:57:58 +000092; CHECK: ret i32 1
93
94 %and = and i32 %a, 7
95 %cmp = icmp eq i32 %and, 1
96 tail call void @llvm.assume(i1 %cmp)
97
98 ret i32 %and1
99}
100
Hal Finkel60db0582014-09-07 18:57:58 +0000101define i32 @bar2(i32 %a) #0 {
102entry:
103; CHECK-LABEL: @bar2
Daniel Jasperaec2fa32016-12-19 08:22:17 +0000104; CHECK: call void @llvm.assume
Hal Finkel60db0582014-09-07 18:57:58 +0000105; CHECK: ret i32 1
106
107 %and = and i32 %a, 7
108 %cmp = icmp eq i32 %and, 1
109 tail call void @llvm.assume(i1 %cmp)
110
111 %and1 = and i32 %a, 3
112 ret i32 %and1
113}
114
Hal Finkel60db0582014-09-07 18:57:58 +0000115define i32 @bar3(i32 %a, i1 %x, i1 %y) #0 {
116entry:
117 %and1 = and i32 %a, 3
118
119; Don't be fooled by other assumes around.
120; CHECK-LABEL: @bar3
Daniel Jasperaec2fa32016-12-19 08:22:17 +0000121; CHECK: call void @llvm.assume
Hal Finkel60db0582014-09-07 18:57:58 +0000122; CHECK: ret i32 1
123
124 tail call void @llvm.assume(i1 %x)
125
126 %and = and i32 %a, 7
127 %cmp = icmp eq i32 %and, 1
128 tail call void @llvm.assume(i1 %cmp)
129
130 tail call void @llvm.assume(i1 %y)
131
132 ret i32 %and1
133}
134
Hal Finkel60db0582014-09-07 18:57:58 +0000135define i32 @bar4(i32 %a, i32 %b) {
136entry:
137 %and1 = and i32 %b, 3
138
139; CHECK-LABEL: @bar4
Daniel Jasperaec2fa32016-12-19 08:22:17 +0000140; CHECK: call void @llvm.assume
141; CHECK: call void @llvm.assume
Hal Finkel60db0582014-09-07 18:57:58 +0000142; CHECK: ret i32 1
143
144 %and = and i32 %a, 7
145 %cmp = icmp eq i32 %and, 1
146 tail call void @llvm.assume(i1 %cmp)
147
148 %cmp2 = icmp eq i32 %a, %b
149 tail call void @llvm.assume(i1 %cmp2)
150
151 ret i32 %and1
152}
153
154define i32 @icmp1(i32 %a) #0 {
Sanjay Pateleaa143c2017-01-09 19:43:26 +0000155; CHECK-LABEL: @icmp1(
156; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 5
157; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])
158; CHECK-NEXT: ret i32 1
159;
Hal Finkel60db0582014-09-07 18:57:58 +0000160 %cmp = icmp sgt i32 %a, 5
161 tail call void @llvm.assume(i1 %cmp)
162 %conv = zext i1 %cmp to i32
163 ret i32 %conv
Hal Finkel60db0582014-09-07 18:57:58 +0000164}
165
Hal Finkel60db0582014-09-07 18:57:58 +0000166define i32 @icmp2(i32 %a) #0 {
Sanjay Pateleaa143c2017-01-09 19:43:26 +0000167; CHECK-LABEL: @icmp2(
168; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 5
169; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])
170; CHECK-NEXT: ret i32 0
171;
Hal Finkel60db0582014-09-07 18:57:58 +0000172 %cmp = icmp sgt i32 %a, 5
173 tail call void @llvm.assume(i1 %cmp)
Sanjay Pateleaa143c2017-01-09 19:43:26 +0000174 %t0 = zext i1 %cmp to i32
175 %lnot.ext = xor i32 %t0, 1
Hal Finkel60db0582014-09-07 18:57:58 +0000176 ret i32 %lnot.ext
Hal Finkel60db0582014-09-07 18:57:58 +0000177}
178
Sanjay Patel96669962017-01-17 18:15:49 +0000179; If the 'not' of a condition is known true, then the condition must be false.
Sanjay Patel8f4910e2017-01-09 20:18:30 +0000180
181define i1 @assume_not(i1 %cond) {
182; CHECK-LABEL: @assume_not(
183; CHECK-NEXT: [[NOTCOND:%.*]] = xor i1 [[COND:%.*]], true
184; CHECK-NEXT: call void @llvm.assume(i1 [[NOTCOND]])
Sanjay Patel96669962017-01-17 18:15:49 +0000185; CHECK-NEXT: ret i1 false
Sanjay Patel8f4910e2017-01-09 20:18:30 +0000186;
187 %notcond = xor i1 %cond, true
188 call void @llvm.assume(i1 %notcond)
189 ret i1 %cond
190}
191
Philip Reames66c6de62014-11-11 23:33:19 +0000192declare void @escape(i32* %a)
193
Sanjay Patelada846a2017-01-03 19:32:11 +0000194; Canonicalize a nonnull assumption on a load into metadata form.
195
Philip Reames66c6de62014-11-11 23:33:19 +0000196define i1 @nonnull1(i32** %a) {
Sanjay Patelada846a2017-01-03 19:32:11 +0000197; CHECK-LABEL: @nonnull1(
198; CHECK-NEXT: [[LOAD:%.*]] = load i32*, i32** %a, align 8, !nonnull !0
199; CHECK-NEXT: tail call void @escape(i32* nonnull [[LOAD]])
200; CHECK-NEXT: ret i1 false
201;
David Blaikiea79ac142015-02-27 21:17:42 +0000202 %load = load i32*, i32** %a
Philip Reames66c6de62014-11-11 23:33:19 +0000203 %cmp = icmp ne i32* %load, null
204 tail call void @llvm.assume(i1 %cmp)
205 tail call void @escape(i32* %load)
206 %rval = icmp eq i32* %load, null
207 ret i1 %rval
Philip Reames66c6de62014-11-11 23:33:19 +0000208}
209
210; Make sure the above canonicalization applies only
211; to pointer types. Doing otherwise would be illegal.
Sanjay Patelada846a2017-01-03 19:32:11 +0000212
Philip Reames66c6de62014-11-11 23:33:19 +0000213define i1 @nonnull2(i32* %a) {
Sanjay Patelada846a2017-01-03 19:32:11 +0000214; CHECK-LABEL: @nonnull2(
215; CHECK-NEXT: [[LOAD:%.*]] = load i32, i32* %a, align 4
216; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[LOAD]], 0
217; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])
218; CHECK-NEXT: [[RVAL:%.*]] = icmp eq i32 [[LOAD]], 0
219; CHECK-NEXT: ret i1 [[RVAL]]
220;
David Blaikiea79ac142015-02-27 21:17:42 +0000221 %load = load i32, i32* %a
Philip Reames66c6de62014-11-11 23:33:19 +0000222 %cmp = icmp ne i32 %load, 0
223 tail call void @llvm.assume(i1 %cmp)
224 %rval = icmp eq i32 %load, 0
225 ret i1 %rval
Philip Reames66c6de62014-11-11 23:33:19 +0000226}
227
228; Make sure the above canonicalization does not trigger
229; if the assume is control dependent on something else
Sanjay Patelada846a2017-01-03 19:32:11 +0000230
Philip Reames66c6de62014-11-11 23:33:19 +0000231define i1 @nonnull3(i32** %a, i1 %control) {
Sanjay Patelada846a2017-01-03 19:32:11 +0000232; CHECK-LABEL: @nonnull3(
233; CHECK-NEXT: entry:
234; CHECK-NEXT: [[LOAD:%.*]] = load i32*, i32** %a, align 8
235; CHECK-NEXT: br i1 %control, label %taken, label %not_taken
236; CHECK: taken:
237; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32* [[LOAD]], null
238; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])
239; CHECK-NEXT: [[RVAL:%.*]] = icmp eq i32* [[LOAD]], null
240; CHECK-NEXT: ret i1 [[RVAL]]
241; CHECK: not_taken:
242; CHECK-NEXT: ret i1 true
243;
Philip Reames66c6de62014-11-11 23:33:19 +0000244entry:
David Blaikiea79ac142015-02-27 21:17:42 +0000245 %load = load i32*, i32** %a
Philip Reames66c6de62014-11-11 23:33:19 +0000246 %cmp = icmp ne i32* %load, null
247 br i1 %control, label %taken, label %not_taken
248taken:
249 tail call void @llvm.assume(i1 %cmp)
250 %rval = icmp eq i32* %load, null
251 ret i1 %rval
252not_taken:
253 ret i1 true
Philip Reames66c6de62014-11-11 23:33:19 +0000254}
255
256; Make sure the above canonicalization does not trigger
Sanjay Patelada846a2017-01-03 19:32:11 +0000257; if the path from the load to the assume is potentially
Philip Reames66c6de62014-11-11 23:33:19 +0000258; interrupted by an exception being thrown
Sanjay Patelada846a2017-01-03 19:32:11 +0000259
Philip Reames66c6de62014-11-11 23:33:19 +0000260define i1 @nonnull4(i32** %a) {
Sanjay Patelada846a2017-01-03 19:32:11 +0000261; CHECK-LABEL: @nonnull4(
262; CHECK-NEXT: [[LOAD:%.*]] = load i32*, i32** %a, align 8
263; CHECK-NEXT: tail call void @escape(i32* [[LOAD]])
264; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32* [[LOAD]], null
265; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])
266; CHECK-NEXT: [[RVAL:%.*]] = icmp eq i32* [[LOAD]], null
267; CHECK-NEXT: ret i1 [[RVAL]]
268;
David Blaikiea79ac142015-02-27 21:17:42 +0000269 %load = load i32*, i32** %a
Philip Reames66c6de62014-11-11 23:33:19 +0000270 ;; This call may throw!
271 tail call void @escape(i32* %load)
272 %cmp = icmp ne i32* %load, null
273 tail call void @llvm.assume(i1 %cmp)
274 %rval = icmp eq i32* %load, null
275 ret i1 %rval
Philip Reames66c6de62014-11-11 23:33:19 +0000276}
277
Sanjay Patel6fb13572018-01-09 18:56:03 +0000278; PR35846 - https://bugs.llvm.org/show_bug.cgi?id=35846
279
280define i32 @assumption_conflicts_with_known_bits(i32 %a, i32 %b) {
281; CHECK-LABEL: @assumption_conflicts_with_known_bits(
282; CHECK-NEXT: tail call void @llvm.assume(i1 false)
283; CHECK-NEXT: ret i32 0
284;
285 %and1 = and i32 %b, 3
286 %B1 = lshr i32 %and1, %and1
287 %B3 = shl nuw nsw i32 %and1, %B1
288 %cmp = icmp eq i32 %B3, 1
289 tail call void @llvm.assume(i1 %cmp)
290 %cmp2 = icmp eq i32 %B1, %B3
291 tail call void @llvm.assume(i1 %cmp2)
292 ret i32 %and1
293}
294
Philip Reames66c6de62014-11-11 23:33:19 +0000295
Hal Finkelf5867a72014-07-25 21:45:17 +0000296attributes #0 = { nounwind uwtable }
297attributes #1 = { nounwind }
298