xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/lt-overflow.ll (revision 1f40870dda4604c90a0b60de69b1080870c646f5)
138540d71SPhilip Reames
238540d71SPhilip Reames; RUN: opt %s -analyze -scalar-evolution -enable-new-pm=0 -scalar-evolution-classify-expressions=0 2>&1 | FileCheck %s
338540d71SPhilip Reames
438540d71SPhilip Reamestarget datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
538540d71SPhilip Reamestarget triple = "x86_64-unknown-linux-gnu"
638540d71SPhilip Reames
738540d71SPhilip Reames; A collection of tests focused on exercising logic to prove no-unsigned wrap
838540d71SPhilip Reames; from mustprogress semantics of loops.
938540d71SPhilip Reames
1038540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test
1138540d71SPhilip Reames; CHECK: Loop %for.body: backedge-taken count is ((-1 + (2 umax %N)) /u 2)
1238540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_preinc
1338540d71SPhilip Reames; CHECK: Loop %for.body: backedge-taken count is ((1 + %N) /u 2)
1438540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_well_defined_infinite_st
1538540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count.
1638540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_well_defined_infinite_ld
1738540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count.
1838540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_no_mustprogress
1938540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count.
2038540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_1024
2138540d71SPhilip Reames; CHECK: Loop %for.body: backedge-taken count is ((-1 + (1024 umax %N)) /u 1024)
2238540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_uneven_divide
2338540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count.
2438540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_non_invariant_rhs
2538540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count.
2638540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_abnormal_exit
2738540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count.
2838540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_other_exit
2938540d71SPhilip Reames; CHECK: Loop %for.body: <multiple exits> Unpredictable backedge-taken count.
30*1f40870dSEli Friedman; CHECK: Determining loop execution counts for: @test_gt
31*1f40870dSEli Friedman; CHECK: Loop %for.body: Unpredictable backedge-taken count.
3238540d71SPhilip Reames
3338540d71SPhilip Reamesdefine void @test(i32 %N) mustprogress {
3438540d71SPhilip Reamesentry:
3538540d71SPhilip Reames  br label %for.body
3638540d71SPhilip Reames
3738540d71SPhilip Reamesfor.body:
3838540d71SPhilip Reames  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
3938540d71SPhilip Reames  %iv.next = add i32 %iv, 2
4038540d71SPhilip Reames  %cmp = icmp ult i32 %iv.next, %N
4138540d71SPhilip Reames  br i1 %cmp, label %for.body, label %for.cond.cleanup
4238540d71SPhilip Reames
4338540d71SPhilip Reamesfor.cond.cleanup:
4438540d71SPhilip Reames  ret void
4538540d71SPhilip Reames}
4638540d71SPhilip Reames
4738540d71SPhilip Reamesdefine void @test_preinc(i32 %N) mustprogress {
4838540d71SPhilip Reamesentry:
4938540d71SPhilip Reames  br label %for.body
5038540d71SPhilip Reames
5138540d71SPhilip Reamesfor.body:
5238540d71SPhilip Reames  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
5338540d71SPhilip Reames  %iv.next = add i32 %iv, 2
5438540d71SPhilip Reames  %cmp = icmp ult i32 %iv, %N
5538540d71SPhilip Reames  br i1 %cmp, label %for.body, label %for.cond.cleanup
5638540d71SPhilip Reames
5738540d71SPhilip Reamesfor.cond.cleanup:
5838540d71SPhilip Reames  ret void
5938540d71SPhilip Reames
6038540d71SPhilip Reames}
6138540d71SPhilip Reames
6238540d71SPhilip Reames@G = external global i32
6338540d71SPhilip Reames
6438540d71SPhilip Reamesdefine void @test_well_defined_infinite_st(i32 %N) mustprogress {
6538540d71SPhilip Reamesentry:
6638540d71SPhilip Reames  br label %for.body
6738540d71SPhilip Reames
6838540d71SPhilip Reamesfor.body:
6938540d71SPhilip Reames  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
7038540d71SPhilip Reames  %iv.next = add i32 %iv, 2
7138540d71SPhilip Reames  store volatile i32 0, i32* @G
7238540d71SPhilip Reames  %cmp = icmp ult i32 %iv.next, %N
7338540d71SPhilip Reames  br i1 %cmp, label %for.body, label %for.cond.cleanup
7438540d71SPhilip Reames
7538540d71SPhilip Reamesfor.cond.cleanup:
7638540d71SPhilip Reames  ret void
7738540d71SPhilip Reames}
7838540d71SPhilip Reames
7938540d71SPhilip Reamesdefine void @test_well_defined_infinite_ld(i32 %N) mustprogress {
8038540d71SPhilip Reamesentry:
8138540d71SPhilip Reames  br label %for.body
8238540d71SPhilip Reames
8338540d71SPhilip Reamesfor.body:
8438540d71SPhilip Reames  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
8538540d71SPhilip Reames  %iv.next = add i32 %iv, 2
8638540d71SPhilip Reames  %val = load volatile i32, i32* @G
8738540d71SPhilip Reames  %cmp = icmp ult i32 %iv.next, %N
8838540d71SPhilip Reames  br i1 %cmp, label %for.body, label %for.cond.cleanup
8938540d71SPhilip Reames
9038540d71SPhilip Reamesfor.cond.cleanup:
9138540d71SPhilip Reames  ret void
9238540d71SPhilip Reames}
9338540d71SPhilip Reames
9438540d71SPhilip Reamesdefine void @test_no_mustprogress(i32 %N) {
9538540d71SPhilip Reamesentry:
9638540d71SPhilip Reames  br label %for.body
9738540d71SPhilip Reames
9838540d71SPhilip Reamesfor.body:
9938540d71SPhilip Reames  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
10038540d71SPhilip Reames  %iv.next = add i32 %iv, 2
10138540d71SPhilip Reames  %cmp = icmp ult i32 %iv.next, %N
10238540d71SPhilip Reames  br i1 %cmp, label %for.body, label %for.cond.cleanup
10338540d71SPhilip Reames
10438540d71SPhilip Reamesfor.cond.cleanup:
10538540d71SPhilip Reames  ret void
10638540d71SPhilip Reames
10738540d71SPhilip Reames}
10838540d71SPhilip Reames
10938540d71SPhilip Reames
11038540d71SPhilip Reamesdefine void @test_1024(i32 %N) mustprogress {
11138540d71SPhilip Reamesentry:
11238540d71SPhilip Reames  br label %for.body
11338540d71SPhilip Reames
11438540d71SPhilip Reamesfor.body:
11538540d71SPhilip Reames  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
11638540d71SPhilip Reames  %iv.next = add i32 %iv, 1024
11738540d71SPhilip Reames  %cmp = icmp ult i32 %iv.next, %N
11838540d71SPhilip Reames  br i1 %cmp, label %for.body, label %for.cond.cleanup
11938540d71SPhilip Reames
12038540d71SPhilip Reamesfor.cond.cleanup:
12138540d71SPhilip Reames  ret void
12238540d71SPhilip Reames}
12338540d71SPhilip Reames
12438540d71SPhilip Reamesdefine void @test_uneven_divide(i32 %N) mustprogress {
12538540d71SPhilip Reamesentry:
12638540d71SPhilip Reames  br label %for.body
12738540d71SPhilip Reames
12838540d71SPhilip Reamesfor.body:
12938540d71SPhilip Reames  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
13038540d71SPhilip Reames  %iv.next = add i32 %iv, 3
13138540d71SPhilip Reames  %cmp = icmp ult i32 %iv.next, %N
13238540d71SPhilip Reames  br i1 %cmp, label %for.body, label %for.cond.cleanup
13338540d71SPhilip Reames
13438540d71SPhilip Reamesfor.cond.cleanup:
13538540d71SPhilip Reames  ret void
13638540d71SPhilip Reames}
13738540d71SPhilip Reames
13838540d71SPhilip Reamesdefine void @test_non_invariant_rhs() mustprogress {
13938540d71SPhilip Reamesentry:
14038540d71SPhilip Reames  br label %for.body
14138540d71SPhilip Reames
14238540d71SPhilip Reamesfor.body:
14338540d71SPhilip Reames  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
14438540d71SPhilip Reames  %iv.next = add i32 %iv, 2
14538540d71SPhilip Reames  %N = load i32, i32* @G
14638540d71SPhilip Reames  %cmp = icmp ult i32 %iv.next, %N
14738540d71SPhilip Reames  br i1 %cmp, label %for.body, label %for.cond.cleanup
14838540d71SPhilip Reames
14938540d71SPhilip Reamesfor.cond.cleanup:
15038540d71SPhilip Reames  ret void
15138540d71SPhilip Reames}
15238540d71SPhilip Reames
15338540d71SPhilip Reamesdeclare void @mayexit()
15438540d71SPhilip Reames
15538540d71SPhilip Reamesdefine void @test_abnormal_exit(i32 %N) mustprogress {
15638540d71SPhilip Reamesentry:
15738540d71SPhilip Reames  br label %for.body
15838540d71SPhilip Reames
15938540d71SPhilip Reamesfor.body:
16038540d71SPhilip Reames  %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ]
16138540d71SPhilip Reames  %iv.next = add i32 %iv, 2
16238540d71SPhilip Reames  call void @mayexit()
16338540d71SPhilip Reames  %cmp = icmp ult i32 %iv.next, %N
16438540d71SPhilip Reames  br i1 %cmp, label %for.body, label %for.cond.cleanup
16538540d71SPhilip Reames
16638540d71SPhilip Reamesfor.cond.cleanup:
16738540d71SPhilip Reames  ret void
16838540d71SPhilip Reames}
16938540d71SPhilip Reames
17038540d71SPhilip Reames
17138540d71SPhilip Reamesdefine void @test_other_exit(i32 %N) mustprogress {
17238540d71SPhilip Reamesentry:
17338540d71SPhilip Reames  br label %for.body
17438540d71SPhilip Reames
17538540d71SPhilip Reamesfor.body:
17638540d71SPhilip Reames  %iv = phi i32 [ %iv.next, %for.latch ], [ 0, %entry ]
17738540d71SPhilip Reames  %iv.next = add i32 %iv, 2
17838540d71SPhilip Reames  %cmp1 = icmp ult i32 %iv.next, 20
17938540d71SPhilip Reames  br i1 %cmp1, label %for.latch, label %for.cond.cleanup
18038540d71SPhilip Reames
18138540d71SPhilip Reamesfor.latch:
18238540d71SPhilip Reames  %cmp2 = icmp ult i32 %iv.next, %N
18338540d71SPhilip Reames  br i1 %cmp2, label %for.body, label %for.cond.cleanup
18438540d71SPhilip Reames
18538540d71SPhilip Reamesfor.cond.cleanup:
18638540d71SPhilip Reames  ret void
18738540d71SPhilip Reames}
18838540d71SPhilip Reames
189*1f40870dSEli Friedmandefine void @test_gt(i32 %S, i32 %N) mustprogress {
190*1f40870dSEli Friedmanentry:
191*1f40870dSEli Friedman  br label %for.body
19238540d71SPhilip Reames
193*1f40870dSEli Friedmanfor.body:
194*1f40870dSEli Friedman  %iv = phi i32 [ %iv.next, %for.body ], [ %S, %entry ]
195*1f40870dSEli Friedman  %iv.next = add i32 %iv, -2
196*1f40870dSEli Friedman  %cmp = icmp ugt i32 %iv.next, %N
197*1f40870dSEli Friedman  br i1 %cmp, label %for.body, label %for.cond.cleanup
198*1f40870dSEli Friedman
199*1f40870dSEli Friedmanfor.cond.cleanup:
200*1f40870dSEli Friedman  ret void
201*1f40870dSEli Friedman}
202