xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/lt-overflow.ll (revision 92619956eb27ef08dd24045307593fc3d7f78db0)
1d896f22fSArthur Eubanks; RUN: opt %s -passes='print<scalar-evolution>' -scalar-evolution-classify-expressions=0 2>&1 | FileCheck %s
238540d71SPhilip Reames
338540d71SPhilip Reamestarget datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
438540d71SPhilip Reamestarget triple = "x86_64-unknown-linux-gnu"
538540d71SPhilip Reames
638540d71SPhilip Reames; A collection of tests focused on exercising logic to prove no-unsigned wrap
738540d71SPhilip Reames; from mustprogress semantics of loops.
838540d71SPhilip Reames
938540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test
1038540d71SPhilip Reames; CHECK: Loop %for.body: backedge-taken count is ((-1 + (2 umax %N)) /u 2)
1138540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_preinc
1238540d71SPhilip Reames; CHECK: Loop %for.body: backedge-taken count is ((1 + %N) /u 2)
1338540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_well_defined_infinite_st
1438540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count.
1538540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_well_defined_infinite_ld
1638540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count.
1738540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_no_mustprogress
1838540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count.
1938540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_1024
2038540d71SPhilip Reames; CHECK: Loop %for.body: backedge-taken count is ((-1 + (1024 umax %N)) /u 1024)
2138540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_uneven_divide
2238540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count.
2338540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_non_invariant_rhs
2438540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count.
2538540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_abnormal_exit
2638540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count.
2738540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_other_exit
2838540d71SPhilip Reames; CHECK: Loop %for.body: <multiple exits> Unpredictable backedge-taken count.
291f40870dSEli Friedman; CHECK: Determining loop execution counts for: @test_gt
301f40870dSEli Friedman; CHECK: Loop %for.body: Unpredictable backedge-taken count.
310d04c778SWilliam S. Moses; CHECK: Determining loop execution counts for: @test_willreturn
320d04c778SWilliam S. Moses; CHECK: Loop %for.body: backedge-taken count is ((-1 + (1024 umax %N)) /u 1024)
330d04c778SWilliam S. Moses; CHECK: Determining loop execution counts for: @test_nowillreturn
340d04c778SWilliam S. Moses; CHECK: Loop %for.body: Unpredictable backedge-taken count.
350d04c778SWilliam S. Moses; TODO: investigate why willreturn is still needed on the callsite
360d04c778SWilliam S. Moses; CHECK: Determining loop execution counts for: @test_willreturn_nocallsite
370d04c778SWilliam S. Moses; CHECK: Loop %for.body: Unpredictable backedge-taken count.
3838540d71SPhilip Reames
3938540d71SPhilip Reamesdefine void @test(i32 %N) mustprogress {
4038540d71SPhilip Reamesentry:
4138540d71SPhilip Reames  br label %for.body
4238540d71SPhilip Reames
4338540d71SPhilip Reamesfor.body:
4438540d71SPhilip Reames  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
4538540d71SPhilip Reames  %iv.next = add i32 %iv, 2
4638540d71SPhilip Reames  %cmp = icmp ult i32 %iv.next, %N
4738540d71SPhilip Reames  br i1 %cmp, label %for.body, label %for.cond.cleanup
4838540d71SPhilip Reames
4938540d71SPhilip Reamesfor.cond.cleanup:
5038540d71SPhilip Reames  ret void
5138540d71SPhilip Reames}
5238540d71SPhilip Reames
5338540d71SPhilip Reamesdefine void @test_preinc(i32 %N) mustprogress {
5438540d71SPhilip Reamesentry:
5538540d71SPhilip Reames  br label %for.body
5638540d71SPhilip Reames
5738540d71SPhilip Reamesfor.body:
5838540d71SPhilip Reames  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
5938540d71SPhilip Reames  %iv.next = add i32 %iv, 2
6038540d71SPhilip Reames  %cmp = icmp ult i32 %iv, %N
6138540d71SPhilip Reames  br i1 %cmp, label %for.body, label %for.cond.cleanup
6238540d71SPhilip Reames
6338540d71SPhilip Reamesfor.cond.cleanup:
6438540d71SPhilip Reames  ret void
6538540d71SPhilip Reames
6638540d71SPhilip Reames}
6738540d71SPhilip Reames
6838540d71SPhilip Reames@G = external global i32
6938540d71SPhilip Reames
7038540d71SPhilip Reamesdefine void @test_well_defined_infinite_st(i32 %N) mustprogress {
7138540d71SPhilip Reamesentry:
7238540d71SPhilip Reames  br label %for.body
7338540d71SPhilip Reames
7438540d71SPhilip Reamesfor.body:
7538540d71SPhilip Reames  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
7638540d71SPhilip Reames  %iv.next = add i32 %iv, 2
77*92619956SNikita Popov  store volatile i32 0, ptr @G
7838540d71SPhilip Reames  %cmp = icmp ult i32 %iv.next, %N
7938540d71SPhilip Reames  br i1 %cmp, label %for.body, label %for.cond.cleanup
8038540d71SPhilip Reames
8138540d71SPhilip Reamesfor.cond.cleanup:
8238540d71SPhilip Reames  ret void
8338540d71SPhilip Reames}
8438540d71SPhilip Reames
8538540d71SPhilip Reamesdefine void @test_well_defined_infinite_ld(i32 %N) mustprogress {
8638540d71SPhilip Reamesentry:
8738540d71SPhilip Reames  br label %for.body
8838540d71SPhilip Reames
8938540d71SPhilip Reamesfor.body:
9038540d71SPhilip Reames  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
9138540d71SPhilip Reames  %iv.next = add i32 %iv, 2
92*92619956SNikita Popov  %val = load volatile i32, ptr @G
9338540d71SPhilip Reames  %cmp = icmp ult i32 %iv.next, %N
9438540d71SPhilip Reames  br i1 %cmp, label %for.body, label %for.cond.cleanup
9538540d71SPhilip Reames
9638540d71SPhilip Reamesfor.cond.cleanup:
9738540d71SPhilip Reames  ret void
9838540d71SPhilip Reames}
9938540d71SPhilip Reames
10038540d71SPhilip Reamesdefine void @test_no_mustprogress(i32 %N) {
10138540d71SPhilip Reamesentry:
10238540d71SPhilip Reames  br label %for.body
10338540d71SPhilip Reames
10438540d71SPhilip Reamesfor.body:
10538540d71SPhilip Reames  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
10638540d71SPhilip Reames  %iv.next = add i32 %iv, 2
10738540d71SPhilip Reames  %cmp = icmp ult i32 %iv.next, %N
10838540d71SPhilip Reames  br i1 %cmp, label %for.body, label %for.cond.cleanup
10938540d71SPhilip Reames
11038540d71SPhilip Reamesfor.cond.cleanup:
11138540d71SPhilip Reames  ret void
11238540d71SPhilip Reames
11338540d71SPhilip Reames}
11438540d71SPhilip Reames
11538540d71SPhilip Reames
11638540d71SPhilip Reamesdefine void @test_1024(i32 %N) mustprogress {
11738540d71SPhilip Reamesentry:
11838540d71SPhilip Reames  br label %for.body
11938540d71SPhilip Reames
12038540d71SPhilip Reamesfor.body:
12138540d71SPhilip Reames  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
12238540d71SPhilip Reames  %iv.next = add i32 %iv, 1024
12338540d71SPhilip Reames  %cmp = icmp ult i32 %iv.next, %N
12438540d71SPhilip Reames  br i1 %cmp, label %for.body, label %for.cond.cleanup
12538540d71SPhilip Reames
12638540d71SPhilip Reamesfor.cond.cleanup:
12738540d71SPhilip Reames  ret void
12838540d71SPhilip Reames}
12938540d71SPhilip Reames
13038540d71SPhilip Reamesdefine void @test_uneven_divide(i32 %N) mustprogress {
13138540d71SPhilip Reamesentry:
13238540d71SPhilip Reames  br label %for.body
13338540d71SPhilip Reames
13438540d71SPhilip Reamesfor.body:
13538540d71SPhilip Reames  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
13638540d71SPhilip Reames  %iv.next = add i32 %iv, 3
13738540d71SPhilip Reames  %cmp = icmp ult i32 %iv.next, %N
13838540d71SPhilip Reames  br i1 %cmp, label %for.body, label %for.cond.cleanup
13938540d71SPhilip Reames
14038540d71SPhilip Reamesfor.cond.cleanup:
14138540d71SPhilip Reames  ret void
14238540d71SPhilip Reames}
14338540d71SPhilip Reames
14438540d71SPhilip Reamesdefine void @test_non_invariant_rhs() mustprogress {
14538540d71SPhilip Reamesentry:
14638540d71SPhilip Reames  br label %for.body
14738540d71SPhilip Reames
14838540d71SPhilip Reamesfor.body:
14938540d71SPhilip Reames  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
15038540d71SPhilip Reames  %iv.next = add i32 %iv, 2
151*92619956SNikita Popov  %N = load i32, ptr @G
15238540d71SPhilip Reames  %cmp = icmp ult i32 %iv.next, %N
15338540d71SPhilip Reames  br i1 %cmp, label %for.body, label %for.cond.cleanup
15438540d71SPhilip Reames
15538540d71SPhilip Reamesfor.cond.cleanup:
15638540d71SPhilip Reames  ret void
15738540d71SPhilip Reames}
15838540d71SPhilip Reames
15938540d71SPhilip Reamesdeclare void @mayexit()
16038540d71SPhilip Reames
16138540d71SPhilip Reamesdefine void @test_abnormal_exit(i32 %N) mustprogress {
16238540d71SPhilip Reamesentry:
16338540d71SPhilip Reames  br label %for.body
16438540d71SPhilip Reames
16538540d71SPhilip Reamesfor.body:
16638540d71SPhilip Reames  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
16738540d71SPhilip Reames  %iv.next = add i32 %iv, 2
16838540d71SPhilip Reames  call void @mayexit()
16938540d71SPhilip Reames  %cmp = icmp ult i32 %iv.next, %N
17038540d71SPhilip Reames  br i1 %cmp, label %for.body, label %for.cond.cleanup
17138540d71SPhilip Reames
17238540d71SPhilip Reamesfor.cond.cleanup:
17338540d71SPhilip Reames  ret void
17438540d71SPhilip Reames}
17538540d71SPhilip Reames
17638540d71SPhilip Reames
17738540d71SPhilip Reamesdefine void @test_other_exit(i32 %N) mustprogress {
17838540d71SPhilip Reamesentry:
17938540d71SPhilip Reames  br label %for.body
18038540d71SPhilip Reames
18138540d71SPhilip Reamesfor.body:
18238540d71SPhilip Reames  %iv = phi i32 [ %iv.next, %for.latch ], [ 0, %entry ]
18338540d71SPhilip Reames  %iv.next = add i32 %iv, 2
18438540d71SPhilip Reames  %cmp1 = icmp ult i32 %iv.next, 20
18538540d71SPhilip Reames  br i1 %cmp1, label %for.latch, label %for.cond.cleanup
18638540d71SPhilip Reames
18738540d71SPhilip Reamesfor.latch:
18838540d71SPhilip Reames  %cmp2 = icmp ult i32 %iv.next, %N
18938540d71SPhilip Reames  br i1 %cmp2, label %for.body, label %for.cond.cleanup
19038540d71SPhilip Reames
19138540d71SPhilip Reamesfor.cond.cleanup:
19238540d71SPhilip Reames  ret void
19338540d71SPhilip Reames}
19438540d71SPhilip Reames
1951f40870dSEli Friedmandefine void @test_gt(i32 %S, i32 %N) mustprogress {
1961f40870dSEli Friedmanentry:
1971f40870dSEli Friedman  br label %for.body
19838540d71SPhilip Reames
1991f40870dSEli Friedmanfor.body:
2001f40870dSEli Friedman  %iv = phi i32 [ %iv.next, %for.body ], [ %S, %entry ]
2011f40870dSEli Friedman  %iv.next = add i32 %iv, -2
2021f40870dSEli Friedman  %cmp = icmp ugt i32 %iv.next, %N
2031f40870dSEli Friedman  br i1 %cmp, label %for.body, label %for.cond.cleanup
2041f40870dSEli Friedman
2051f40870dSEli Friedmanfor.cond.cleanup:
2061f40870dSEli Friedman  ret void
2071f40870dSEli Friedman}
2080d04c778SWilliam S. Moses
2090d04c778SWilliam S. Mosesdeclare void @sideeffect()
2100d04c778SWilliam S. Moses
2110d04c778SWilliam S. Mosesdefine void @test_willreturn(i32 %S, i32 %N) willreturn {
2120d04c778SWilliam S. Mosesentry:
2130d04c778SWilliam S. Moses  br label %for.body
2140d04c778SWilliam S. Moses
2150d04c778SWilliam S. Mosesfor.body:
2160d04c778SWilliam S. Moses  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
2170d04c778SWilliam S. Moses  %iv.next = add i32 %iv, 1024
2180d04c778SWilliam S. Moses  call void @sideeffect() nounwind willreturn
2190d04c778SWilliam S. Moses  %cmp = icmp ult i32 %iv.next, %N
2200d04c778SWilliam S. Moses  br i1 %cmp, label %for.body, label %for.cond.cleanup
2210d04c778SWilliam S. Moses
2220d04c778SWilliam S. Mosesfor.cond.cleanup:
2230d04c778SWilliam S. Moses  ret void
2240d04c778SWilliam S. Moses}
2250d04c778SWilliam S. Moses
2260d04c778SWilliam S. Mosesdefine void @test_nowillreturn(i32 %S, i32 %N) {
2270d04c778SWilliam S. Mosesentry:
2280d04c778SWilliam S. Moses  br label %for.body
2290d04c778SWilliam S. Moses
2300d04c778SWilliam S. Mosesfor.body:
2310d04c778SWilliam S. Moses  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
2320d04c778SWilliam S. Moses  %iv.next = add i32 %iv, 1024
2330d04c778SWilliam S. Moses  call void @sideeffect() nounwind willreturn
2340d04c778SWilliam S. Moses  %cmp = icmp ult i32 %iv.next, %N
2350d04c778SWilliam S. Moses  br i1 %cmp, label %for.body, label %for.cond.cleanup
2360d04c778SWilliam S. Moses
2370d04c778SWilliam S. Mosesfor.cond.cleanup:
2380d04c778SWilliam S. Moses  ret void
2390d04c778SWilliam S. Moses}
2400d04c778SWilliam S. Moses
2410d04c778SWilliam S. Mosesdefine void @test_willreturn_nocallsite(i32 %S, i32 %N) willreturn {
2420d04c778SWilliam S. Mosesentry:
2430d04c778SWilliam S. Moses  br label %for.body
2440d04c778SWilliam S. Moses
2450d04c778SWilliam S. Mosesfor.body:
2460d04c778SWilliam S. Moses  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
2470d04c778SWilliam S. Moses  %iv.next = add i32 %iv, 1024
2480d04c778SWilliam S. Moses  call void @sideeffect() nounwind
2490d04c778SWilliam S. Moses  %cmp = icmp ult i32 %iv.next, %N
2500d04c778SWilliam S. Moses  br i1 %cmp, label %for.body, label %for.cond.cleanup
2510d04c778SWilliam S. Moses
2520d04c778SWilliam S. Mosesfor.cond.cleanup:
2530d04c778SWilliam S. Moses  ret void
2540d04c778SWilliam S. Moses}
255