blob: 8733a857cbae85c06d8719e9ad733604ab6f162f [file] [log] [blame]
Jingyue Wu42f1d672015-07-28 18:22:40 +00001; RUN: opt < %s -S -analyze -scalar-evolution | FileCheck %s
2
3; Positive and negative tests for inferring flags like nsw from
4; reasoning about how a poison value from overflow would trigger
5; undefined behavior.
6
7define void @foo() {
8 ret void
9}
10
11; Example where an add should get the nsw flag, so that a sext can be
12; distributed over the add.
13define void @test-add-nsw(float* %input, i32 %offset, i32 %numIterations) {
14; CHECK-LABEL: @test-add-nsw
15entry:
16 br label %loop
17loop:
18 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
19
20; CHECK: %index32 =
21; CHECK: --> {%offset,+,1}<nsw>
22 %index32 = add nsw i32 %i, %offset
23
24; CHECK: %index64 =
25; CHECK: --> {(sext i32 %offset to i64),+,1}<nsw>
26 %index64 = sext i32 %index32 to i64
27
28 %ptr = getelementptr inbounds float, float* %input, i64 %index64
29 %nexti = add nsw i32 %i, 1
30 %f = load float, float* %ptr, align 4
31 call void @foo()
32 %exitcond = icmp eq i32 %nexti, %numIterations
33 br i1 %exitcond, label %exit, label %loop
34exit:
35 ret void
36}
37
38; Example where an add should get the nuw flag.
39define void @test-add-nuw(float* %input, i32 %offset, i32 %numIterations) {
40; CHECK-LABEL: @test-add-nuw
41entry:
42 br label %loop
43loop:
44 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
45
46; CHECK: %index32 =
47; CHECK: --> {%offset,+,1}<nuw>
48 %index32 = add nuw i32 %i, %offset
49
50 %ptr = getelementptr inbounds float, float* %input, i32 %index32
51 %nexti = add nuw i32 %i, 1
52 %f = load float, float* %ptr, align 4
53 %exitcond = icmp eq i32 %nexti, %numIterations
54 br i1 %exitcond, label %exit, label %loop
55
56exit:
57 ret void
58}
59
Sanjoy Das70c2bbd2016-05-29 00:31:18 +000060define void @test-add-nuw-from-icmp(float* %input, i32 %offset,
61 i32 %numIterations) {
62; CHECK-LABEL: @test-add-nuw-from-icmp
63entry:
64 br label %loop
65loop:
66 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
67
68; CHECK: %index32 =
69; CHECK: --> {%offset,+,1}<nuw>
70 %index32 = add nuw i32 %i, %offset
71 %cmp = icmp sgt i32 %index32, 0
72 %cmp.idx = sext i1 %cmp to i32
73
74 %ptr = getelementptr inbounds float, float* %input, i32 %cmp.idx
75 %nexti = add nuw i32 %i, 1
76 %f = load float, float* %ptr, align 4
77 %exitcond = icmp eq i32 %nexti, %numIterations
78 br i1 %exitcond, label %exit, label %loop
79
80exit:
81 ret void
82}
83
Jingyue Wu42f1d672015-07-28 18:22:40 +000084; With no load to trigger UB from poison, we cannot infer nsw.
85define void @test-add-no-load(float* %input, i32 %offset, i32 %numIterations) {
86; CHECK-LABEL: @test-add-no-load
87entry:
88 br label %loop
89loop:
90 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
91
92; CHECK: %index32 =
93; CHECK: --> {%offset,+,1}<nw>
94 %index32 = add nsw i32 %i, %offset
95
96 %ptr = getelementptr inbounds float, float* %input, i32 %index32
97 %nexti = add nuw i32 %i, 1
98 %exitcond = icmp eq i32 %nexti, %numIterations
99 br i1 %exitcond, label %exit, label %loop
100
101exit:
102 ret void
103}
104
105; The current code is only supposed to look at the loop header, so
106; it should not infer nsw in this case, as that would require looking
107; outside the loop header.
108define void @test-add-not-header(float* %input, i32 %offset, i32 %numIterations) {
109; CHECK-LABEL: @test-add-not-header
110entry:
111 br label %loop
112loop:
113 %i = phi i32 [ %nexti, %loop2 ], [ 0, %entry ]
114 br label %loop2
115loop2:
116
117; CHECK: %index32 =
118; CHECK: --> {%offset,+,1}<nw>
119 %index32 = add nsw i32 %i, %offset
120
121 %ptr = getelementptr inbounds float, float* %input, i32 %index32
122 %nexti = add nsw i32 %i, 1
123 %f = load float, float* %ptr, align 4
124 %exitcond = icmp eq i32 %nexti, %numIterations
125 br i1 %exitcond, label %exit, label %loop
126exit:
127 ret void
128}
129
130; Same thing as test-add-not-header, but in this case only the load
131; instruction is outside the loop header.
132define void @test-add-not-header2(float* %input, i32 %offset, i32 %numIterations) {
133; CHECK-LABEL: @test-add-not-header2
134entry:
135 br label %loop
136loop:
137 %i = phi i32 [ %nexti, %loop2 ], [ 0, %entry ]
138
139; CHECK: %index32 =
Sanjoy Dasa6155b62016-04-22 17:41:06 +0000140; CHECK: --> {%offset,+,1}<nsw>
Jingyue Wu42f1d672015-07-28 18:22:40 +0000141 %index32 = add nsw i32 %i, %offset
142
143 %ptr = getelementptr inbounds float, float* %input, i32 %index32
144 %nexti = add nsw i32 %i, 1
145 br label %loop2
146loop2:
147 %f = load float, float* %ptr, align 4
148 %exitcond = icmp eq i32 %nexti, %numIterations
149 br i1 %exitcond, label %exit, label %loop
150exit:
151 ret void
152}
153
Sanjoy Dasa6155b62016-04-22 17:41:06 +0000154; Similar to test-add-not-header, but in this case the load
155; instruction may not be executed.
156define void @test-add-not-header3(float* %input, i32 %offset, i32 %numIterations,
157 i1* %cond_buf) {
158; CHECK-LABEL: @test-add-not-header3
159entry:
160 br label %loop
161loop:
162 %i = phi i32 [ %nexti, %loop2 ], [ 0, %entry ]
163
164; CHECK: %index32 =
165; CHECK: --> {%offset,+,1}<nw>
166 %index32 = add nsw i32 %i, %offset
167
168 %ptr = getelementptr inbounds float, float* %input, i32 %index32
169 %nexti = add nsw i32 %i, 1
170 %cond = load volatile i1, i1* %cond_buf
171 br i1 %cond, label %loop2, label %exit
172loop2:
173 %f = load float, float* %ptr, align 4
174 %exitcond = icmp eq i32 %nexti, %numIterations
175 br i1 %exitcond, label %exit, label %loop
176exit:
177 ret void
178}
179
180; Same thing as test-add-not-header2, except we have a few extra
181; blocks.
182define void @test-add-not-header4(float* %input, i32 %offset, i32 %numIterations) {
183; CHECK-LABEL: @test-add-not-header4
184entry:
185 br label %loop
186loop:
187 %i = phi i32 [ %nexti, %loop2 ], [ 0, %entry ]
188
189; CHECK: %index32 =
190; CHECK: --> {%offset,+,1}<nsw>
191 %index32 = add nsw i32 %i, %offset
192
193 %ptr = getelementptr inbounds float, float* %input, i32 %index32
194 %nexti = add nsw i32 %i, 1
195 br label %loop3
196loop3:
197 br label %loop4
198loop4:
199 br label %loop2
200loop2:
201 %f = load float, float* %ptr, align 4
202 %exitcond = icmp eq i32 %nexti, %numIterations
203 br i1 %exitcond, label %exit, label %loop
204exit:
205 ret void
206}
207
Sanjoy Das08989c72017-04-30 19:41:19 +0000208; Demonstrate why we need a Visited set in llvm::programUndefinedIfFullPoison.
Sanjoy Dasa6155b62016-04-22 17:41:06 +0000209define void @test-add-not-header5(float* %input, i32 %offset) {
210; CHECK-LABEL: @test-add-not-header5
211entry:
212 br label %loop
213loop:
214 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
215
216; CHECK: %index32 =
217; CHECK: --> {%offset,+,1}<nw>
218 %index32 = add nsw i32 %i, %offset
219
220 %ptr = getelementptr inbounds float, float* %input, i32 %index32
221 %nexti = add nsw i32 %i, 1
222 br label %loop
223
224exit:
225 ret void
226}
227
Jingyue Wu42f1d672015-07-28 18:22:40 +0000228; The call instruction makes it not guaranteed that the add will be
229; executed, since it could run forever or throw an exception, so we
230; cannot assume that the UB is realized.
231define void @test-add-call(float* %input, i32 %offset, i32 %numIterations) {
232; CHECK-LABEL: @test-add-call
233entry:
234 br label %loop
235loop:
236 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
237
238; CHECK: %index32 =
239; CHECK: --> {%offset,+,1}<nw>
240 call void @foo()
241 %index32 = add nsw i32 %i, %offset
242
243 %ptr = getelementptr inbounds float, float* %input, i32 %index32
244 %nexti = add nsw i32 %i, 1
245 %f = load float, float* %ptr, align 4
246 %exitcond = icmp eq i32 %nexti, %numIterations
247 br i1 %exitcond, label %exit, label %loop
248exit:
249 ret void
250}
251
252; Same issue as test-add-call, but this time the call is between the
253; producer of poison and the load that consumes it.
254define void @test-add-call2(float* %input, i32 %offset, i32 %numIterations) {
255; CHECK-LABEL: @test-add-call2
256entry:
257 br label %loop
258loop:
259 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
260
261; CHECK: %index32 =
262; CHECK: --> {%offset,+,1}<nw>
263 %index32 = add nsw i32 %i, %offset
264
265 %ptr = getelementptr inbounds float, float* %input, i32 %index32
266 %nexti = add nsw i32 %i, 1
267 call void @foo()
268 %f = load float, float* %ptr, align 4
269 %exitcond = icmp eq i32 %nexti, %numIterations
270 br i1 %exitcond, label %exit, label %loop
271exit:
272 ret void
273}
274
Sanjoy Das5cd6c5ca2017-02-22 06:52:32 +0000275; Any poison input makes getelementptr produce poison
276define void @test-gep-propagates-poison(float* %input, i32 %offset, i32 %numIterations) {
277; CHECK-LABEL: @test-gep-propagates-poison
Jingyue Wu42f1d672015-07-28 18:22:40 +0000278entry:
279 br label %loop
280loop:
281 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
282
283; CHECK: %index32 =
Sanjoy Das5cd6c5ca2017-02-22 06:52:32 +0000284; CHECK: --> {%offset,+,1}<nsw>
Jingyue Wu42f1d672015-07-28 18:22:40 +0000285 %index32 = add nsw i32 %i, %offset
286
287 %ptr = getelementptr float, float* %input, i32 %index32
288 %nexti = add nsw i32 %i, 1
289 %f = load float, float* %ptr, align 4
290 %exitcond = icmp eq i32 %nexti, %numIterations
291 br i1 %exitcond, label %exit, label %loop
292exit:
293 ret void
294}
295
296; Multiplication by a non-zero constant propagates poison if there is
297; a nuw or nsw flag on the multiplication.
298define void @test-add-mul-propagates(float* %input, i32 %offset, i32 %numIterations) {
299; CHECK-LABEL: @test-add-mul-propagates
300entry:
301 br label %loop
302loop:
303 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
304
305; CHECK: %index32 =
306; CHECK: --> {%offset,+,1}<nsw>
307 %index32 = add nsw i32 %i, %offset
308
309 %indexmul = mul nuw i32 %index32, 2
310 %ptr = getelementptr inbounds float, float* %input, i32 %indexmul
311 %nexti = add nsw i32 %i, 1
312 %f = load float, float* %ptr, align 4
313 %exitcond = icmp eq i32 %nexti, %numIterations
314 br i1 %exitcond, label %exit, label %loop
315exit:
316 ret void
317}
318
Sanjoy Das5cd6c5ca2017-02-22 06:52:32 +0000319; Any poison input to multiplication propages poison.
320define void @test-mul-propagates-poison(float* %input, i32 %offset, i32 %numIterations) {
321; CHECK-LABEL: @test-mul-propagates-poison
Jingyue Wu42f1d672015-07-28 18:22:40 +0000322entry:
323 br label %loop
324loop:
325 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
326
327; CHECK: %index32 =
Sanjoy Das5cd6c5ca2017-02-22 06:52:32 +0000328; CHECK: --> {%offset,+,1}<nsw>
Jingyue Wu42f1d672015-07-28 18:22:40 +0000329 %index32 = add nsw i32 %i, %offset
330
331 %indexmul = mul nsw i32 %index32, %offset
332 %ptr = getelementptr inbounds float, float* %input, i32 %indexmul
333 %nexti = add nsw i32 %i, 1
334 %f = load float, float* %ptr, align 4
335 %exitcond = icmp eq i32 %nexti, %numIterations
336 br i1 %exitcond, label %exit, label %loop
337exit:
338 ret void
339}
340
Sanjoy Das5cd6c5ca2017-02-22 06:52:32 +0000341define void @test-mul-propagates-poison-2(float* %input, i32 %offset, i32 %numIterations) {
342; CHECK-LABEL: @test-mul-propagates-poison-2
Jingyue Wu42f1d672015-07-28 18:22:40 +0000343entry:
344 br label %loop
345loop:
346 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
347
348; CHECK: %index32 =
Sanjoy Das5cd6c5ca2017-02-22 06:52:32 +0000349; CHECK: --> {%offset,+,1}<nsw>
Jingyue Wu42f1d672015-07-28 18:22:40 +0000350 %index32 = add nsw i32 %i, %offset
351
352 %indexmul = mul i32 %index32, 2
353 %ptr = getelementptr inbounds float, float* %input, i32 %indexmul
354 %nexti = add nsw i32 %i, 1
355 %f = load float, float* %ptr, align 4
356 %exitcond = icmp eq i32 %nexti, %numIterations
357 br i1 %exitcond, label %exit, label %loop
358exit:
359 ret void
360}
361
362; Division by poison triggers UB.
363define void @test-add-div(float* %input, i32 %offset, i32 %numIterations) {
364; CHECK-LABEL: @test-add-div
365entry:
366 br label %loop
367loop:
368 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
369
370; CHECK: %j =
371; CHECK: --> {%offset,+,1}<nsw>
372 %j = add nsw i32 %i, %offset
373
374 %q = sdiv i32 %numIterations, %j
375 %nexti = add nsw i32 %i, 1
376 %exitcond = icmp eq i32 %nexti, %numIterations
377 br i1 %exitcond, label %exit, label %loop
378exit:
379 ret void
380}
381
382; Remainder of poison by non-poison divisor does not trigger UB.
383define void @test-add-div2(float* %input, i32 %offset, i32 %numIterations) {
384; CHECK-LABEL: @test-add-div2
385entry:
386 br label %loop
387loop:
388 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
389
390; CHECK: %j =
391; CHECK: --> {%offset,+,1}<nw>
392 %j = add nsw i32 %i, %offset
393
394 %q = sdiv i32 %j, %numIterations
395 %nexti = add nsw i32 %i, 1
396 %exitcond = icmp eq i32 %nexti, %numIterations
397 br i1 %exitcond, label %exit, label %loop
398exit:
399 ret void
400}
401
402; Store to poison address triggers UB.
403define void @test-add-store(float* %input, i32 %offset, i32 %numIterations) {
404; CHECK-LABEL: @test-add-store
405entry:
406 br label %loop
407loop:
408 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
409
410; CHECK: %index32 =
411; CHECK: --> {%offset,+,1}<nsw>
412 %index32 = add nsw i32 %i, %offset
413
414 %ptr = getelementptr inbounds float, float* %input, i32 %index32
415 %nexti = add nsw i32 %i, 1
416 store float 1.0, float* %ptr, align 4
417 %exitcond = icmp eq i32 %nexti, %numIterations
418 br i1 %exitcond, label %exit, label %loop
419exit:
420 ret void
421}
422
423; Three sequential adds where the middle add should have nsw. There is
424; a special case for sequential adds and this test covers that. We have to
425; put the final add first in the program since otherwise the special case
426; is not triggered, hence the strange basic block ordering.
427define void @test-add-twice(float* %input, i32 %offset, i32 %numIterations) {
428; CHECK-LABEL: @test-add-twice
429entry:
430 br label %loop
431loop2:
432; CHECK: %seq =
433; CHECK: --> {(2 + %offset),+,1}<nw>
434 %seq = add nsw nuw i32 %index32, 1
435 %exitcond = icmp eq i32 %nexti, %numIterations
436 br i1 %exitcond, label %exit, label %loop
437
438loop:
439 %i = phi i32 [ %nexti, %loop2 ], [ 0, %entry ]
440
441 %j = add nsw i32 %i, 1
442; CHECK: %index32 =
Oleg Ranevskyyeb4ecca2016-05-25 13:01:33 +0000443; CHECK: --> {(1 + %offset)<nsw>,+,1}<nsw>
Jingyue Wu42f1d672015-07-28 18:22:40 +0000444 %index32 = add nsw i32 %j, %offset
445
446 %ptr = getelementptr inbounds float, float* %input, i32 %index32
447 %nexti = add nsw i32 %i, 1
448 store float 1.0, float* %ptr, align 4
449 br label %loop2
450exit:
451 ret void
452}
Bjarke Hammersholt Roune9791ed42015-08-14 22:45:26 +0000453
454; Example where a mul should get the nsw flag, so that a sext can be
455; distributed over the mul.
456define void @test-mul-nsw(float* %input, i32 %stride, i32 %numIterations) {
457; CHECK-LABEL: @test-mul-nsw
458entry:
459 br label %loop
460loop:
461 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
462
463; CHECK: %index32 =
464; CHECK: --> {0,+,%stride}<nsw>
465 %index32 = mul nsw i32 %i, %stride
466
467; CHECK: %index64 =
468; CHECK: --> {0,+,(sext i32 %stride to i64)}<nsw>
469 %index64 = sext i32 %index32 to i64
470
471 %ptr = getelementptr inbounds float, float* %input, i64 %index64
472 %nexti = add nsw i32 %i, 1
473 %f = load float, float* %ptr, align 4
474 %exitcond = icmp eq i32 %nexti, %numIterations
475 br i1 %exitcond, label %exit, label %loop
476exit:
477 ret void
478}
479
480; Example where a mul should get the nuw flag.
481define void @test-mul-nuw(float* %input, i32 %stride, i32 %numIterations) {
482; CHECK-LABEL: @test-mul-nuw
483entry:
484 br label %loop
485loop:
486 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
487
488; CHECK: %index32 =
489; CHECK: --> {0,+,%stride}<nuw>
490 %index32 = mul nuw i32 %i, %stride
491
492 %ptr = getelementptr inbounds float, float* %input, i32 %index32
493 %nexti = add nuw i32 %i, 1
494 %f = load float, float* %ptr, align 4
495 %exitcond = icmp eq i32 %nexti, %numIterations
496 br i1 %exitcond, label %exit, label %loop
497
498exit:
499 ret void
500}
501
502; Example where a shl should get the nsw flag, so that a sext can be
503; distributed over the shl.
504define void @test-shl-nsw(float* %input, i32 %start, i32 %numIterations) {
505; CHECK-LABEL: @test-shl-nsw
506entry:
507 br label %loop
508loop:
509 %i = phi i32 [ %nexti, %loop ], [ %start, %entry ]
510
511; CHECK: %index32 =
512; CHECK: --> {(256 * %start),+,256}<nsw>
513 %index32 = shl nsw i32 %i, 8
514
515; CHECK: %index64 =
516; CHECK: --> {(sext i32 (256 * %start) to i64),+,256}<nsw>
517 %index64 = sext i32 %index32 to i64
518
519 %ptr = getelementptr inbounds float, float* %input, i64 %index64
520 %nexti = add nsw i32 %i, 1
521 %f = load float, float* %ptr, align 4
522 %exitcond = icmp eq i32 %nexti, %numIterations
523 br i1 %exitcond, label %exit, label %loop
524exit:
525 ret void
526}
527
528; Example where a shl should get the nuw flag.
529define void @test-shl-nuw(float* %input, i32 %numIterations) {
530; CHECK-LABEL: @test-shl-nuw
531entry:
532 br label %loop
533loop:
534 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
535
536; CHECK: %index32 =
537; CHECK: --> {0,+,512}<nuw>
538 %index32 = shl nuw i32 %i, 9
539
540 %ptr = getelementptr inbounds float, float* %input, i32 %index32
541 %nexti = add nuw i32 %i, 1
542 %f = load float, float* %ptr, align 4
543 %exitcond = icmp eq i32 %nexti, %numIterations
544 br i1 %exitcond, label %exit, label %loop
545
546exit:
547 ret void
548}
549
550; Example where a sub should *not* get the nsw flag, because of how
551; scalar evolution represents A - B as A + (-B) and -B can wrap even
552; in cases where A - B does not.
553define void @test-sub-no-nsw(float* %input, i32 %start, i32 %sub, i32 %numIterations) {
554; CHECK-LABEL: @test-sub-no-nsw
555entry:
556 br label %loop
557loop:
558 %i = phi i32 [ %nexti, %loop ], [ %start, %entry ]
559
560; CHECK: %index32 =
561; CHECK: --> {((-1 * %sub) + %start),+,1}<nw>
562 %index32 = sub nsw i32 %i, %sub
563 %index64 = sext i32 %index32 to i64
564
565 %ptr = getelementptr inbounds float, float* %input, i64 %index64
566 %nexti = add nsw i32 %i, 1
567 %f = load float, float* %ptr, align 4
568 %exitcond = icmp eq i32 %nexti, %numIterations
569 br i1 %exitcond, label %exit, label %loop
570exit:
571 ret void
572}
573
574; Example where a sub should get the nsw flag as the RHS cannot be the
575; minimal signed value.
576define void @test-sub-nsw(float* %input, i32 %start, i32 %sub, i32 %numIterations) {
577; CHECK-LABEL: @test-sub-nsw
578entry:
579 %halfsub = ashr i32 %sub, 1
580 br label %loop
581loop:
582 %i = phi i32 [ %nexti, %loop ], [ %start, %entry ]
583
584; CHECK: %index32 =
Oleg Ranevskyyeb4ecca2016-05-25 13:01:33 +0000585; CHECK: --> {((-1 * %halfsub)<nsw> + %start)<nsw>,+,1}<nsw>
Bjarke Hammersholt Roune9791ed42015-08-14 22:45:26 +0000586 %index32 = sub nsw i32 %i, %halfsub
587 %index64 = sext i32 %index32 to i64
588
589 %ptr = getelementptr inbounds float, float* %input, i64 %index64
590 %nexti = add nsw i32 %i, 1
591 %f = load float, float* %ptr, align 4
592 %exitcond = icmp eq i32 %nexti, %numIterations
593 br i1 %exitcond, label %exit, label %loop
594exit:
595 ret void
596}
597
598; Example where a sub should get the nsw flag, since the LHS is non-negative,
599; which implies that the RHS cannot be the minimal signed value.
600define void @test-sub-nsw-lhs-non-negative(float* %input, i32 %sub, i32 %numIterations) {
601; CHECK-LABEL: @test-sub-nsw-lhs-non-negative
602entry:
603 br label %loop
604loop:
605 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
606
607; CHECK: %index32 =
608; CHECK: --> {(-1 * %sub),+,1}<nsw>
609 %index32 = sub nsw i32 %i, %sub
610
611; CHECK: %index64 =
Amara Emerson56dca4e32017-08-04 20:19:46 +0000612; CHECK: --> {(-1 * (sext i32 %sub to i64))<nsw>,+,1}<nsw
Bjarke Hammersholt Roune9791ed42015-08-14 22:45:26 +0000613 %index64 = sext i32 %index32 to i64
614
615 %ptr = getelementptr inbounds float, float* %input, i64 %index64
616 %nexti = add nsw i32 %i, 1
617 %f = load float, float* %ptr, align 4
618 %exitcond = icmp eq i32 %nexti, %numIterations
619 br i1 %exitcond, label %exit, label %loop
620exit:
621 ret void
622}
623
Amara Emerson56dca4e32017-08-04 20:19:46 +0000624; Example checking that a sext is pushed onto a sub's operands if the sub is an
625; overflow intrinsic.
626define void @test-sext-sub(float* %input, i32 %sub, i32 %numIterations) {
627; CHECK-LABEL: @test-sext-sub
628entry:
629 br label %loop
630loop:
631 %i = phi i32 [ %nexti, %cont ], [ 0, %entry ]
632
633; CHECK: %val = extractvalue { i32, i1 } %ssub, 0
634; CHECK: --> {(-1 * %sub),+,1}<nw>
635 %ssub = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %i, i32 %sub)
636 %val = extractvalue { i32, i1 } %ssub, 0
637 %ovfl = extractvalue { i32, i1 } %ssub, 1
638 br i1 %ovfl, label %trap, label %cont
639
640trap:
641 tail call void @llvm.trap()
642 unreachable
643
644cont:
645; CHECK: %index64 =
646; CHECK: --> {(-1 * (sext i32 %sub to i64))<nsw>,+,1}<nsw
647 %index64 = sext i32 %val to i64
648
649 %ptr = getelementptr inbounds float, float* %input, i64 %index64
650 %nexti = add nsw i32 %i, 1
651 %f = load float, float* %ptr, align 4
652 %exitcond = icmp eq i32 %nexti, %numIterations
653 br i1 %exitcond, label %exit, label %loop
654exit:
655 ret void
656}
657
Bjarke Hammersholt Roune9791ed42015-08-14 22:45:26 +0000658; Two adds with a sub in the middle and the sub should have nsw. There is
659; a special case for sequential adds/subs and this test covers that. We have to
660; put the final add first in the program since otherwise the special case
661; is not triggered, hence the strange basic block ordering.
662define void @test-sub-with-add(float* %input, i32 %offset, i32 %numIterations) {
663; CHECK-LABEL: @test-sub-with-add
664entry:
665 br label %loop
666loop2:
667; CHECK: %seq =
668; CHECK: --> {(2 + (-1 * %offset)),+,1}<nw>
669 %seq = add nsw nuw i32 %index32, 1
670 %exitcond = icmp eq i32 %nexti, %numIterations
671 br i1 %exitcond, label %exit, label %loop
672
673loop:
674 %i = phi i32 [ %nexti, %loop2 ], [ 0, %entry ]
675
676 %j = add nsw i32 %i, 1
677; CHECK: %index32 =
Oleg Ranevskyyeb4ecca2016-05-25 13:01:33 +0000678; CHECK: --> {(1 + (-1 * %offset))<nsw>,+,1}<nsw>
Bjarke Hammersholt Roune9791ed42015-08-14 22:45:26 +0000679 %index32 = sub nsw i32 %j, %offset
680
681 %ptr = getelementptr inbounds float, float* %input, i32 %index32
682 %nexti = add nsw i32 %i, 1
683 store float 1.0, float* %ptr, align 4
684 br label %loop2
685exit:
686 ret void
687}
688
689
690; Subtraction of two recurrences. The addition in the SCEV that this
691; maps to is NSW, but the negation of the RHS does not since that
692; recurrence could be the most negative representable value.
693define void @subrecurrences(i32 %outer_l, i32 %inner_l, i32 %val) {
694; CHECK-LABEL: @subrecurrences
695 entry:
696 br label %outer
697
698outer:
699 %o_idx = phi i32 [ 0, %entry ], [ %o_idx.inc, %outer.be ]
700 %o_idx.inc = add nsw i32 %o_idx, 1
701 %cond = icmp eq i32 %o_idx, %val
702 br i1 %cond, label %inner, label %outer.be
703
704inner:
705 %i_idx = phi i32 [ 0, %outer ], [ %i_idx.inc, %inner ]
706 %i_idx.inc = add nsw i32 %i_idx, 1
707; CHECK: %v =
708; CHECK-NEXT: --> {{[{][{]}}-1,+,-1}<nw><%outer>,+,1}<nsw><%inner>
709 %v = sub nsw i32 %i_idx, %o_idx.inc
710 %forub = udiv i32 1, %v
711 %cond2 = icmp eq i32 %i_idx, %inner_l
712 br i1 %cond2, label %outer.be, label %inner
713
714outer.be:
715 %cond3 = icmp eq i32 %o_idx, %outer_l
716 br i1 %cond3, label %exit, label %outer
717
718exit:
719 ret void
720}
Hans Wennborg38790352016-08-17 22:50:18 +0000721
722
723; PR28932: Don't assert on non-SCEV-able value %2.
724%struct.anon = type { i8* }
725@a = common global %struct.anon* null, align 8
726@b = common global i32 0, align 4
727declare { i32, i1 } @llvm.ssub.with.overflow.i32(i32, i32)
728declare void @llvm.trap()
729define i32 @pr28932() {
730entry:
731 %.pre = load %struct.anon*, %struct.anon** @a, align 8
732 %.pre7 = load i32, i32* @b, align 4
733 br label %for.cond
734
735for.cond: ; preds = %cont6, %entry
736 %0 = phi i32 [ %3, %cont6 ], [ %.pre7, %entry ]
737 %1 = phi %struct.anon* [ %.ph, %cont6 ], [ %.pre, %entry ]
738 %tobool = icmp eq %struct.anon* %1, null
739 %2 = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %0, i32 1)
740 %3 = extractvalue { i32, i1 } %2, 0
741 %4 = extractvalue { i32, i1 } %2, 1
742 %idxprom = sext i32 %3 to i64
743 %5 = getelementptr inbounds %struct.anon, %struct.anon* %1, i64 0, i32 0
744 %6 = load i8*, i8** %5, align 8
745 %7 = getelementptr inbounds i8, i8* %6, i64 %idxprom
746 %8 = load i8, i8* %7, align 1
747 br i1 %tobool, label %if.else, label %if.then
748
749if.then: ; preds = %for.cond
750 br i1 %4, label %trap, label %cont6
751
752trap: ; preds = %if.else, %if.then
753 tail call void @llvm.trap()
754 unreachable
755
756if.else: ; preds = %for.cond
757 br i1 %4, label %trap, label %cont1
758
759cont1: ; preds = %if.else
760 %conv5 = sext i8 %8 to i64
761 %9 = inttoptr i64 %conv5 to %struct.anon*
762 store %struct.anon* %9, %struct.anon** @a, align 8
763 br label %cont6
764
765cont6: ; preds = %cont1, %if.then
766 %.ph = phi %struct.anon* [ %9, %cont1 ], [ %1, %if.then ]
767 store i32 %3, i32* @b, align 4
768 br label %for.cond
769}