xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/predicated-exit-count.ll (revision 02ee96eca90741031a26f0f06cd48bb0ba558d1a)
1df3d70b5SDavid Sherwood; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
2df3d70b5SDavid Sherwood; RUN: opt -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-classify-expressions=0 < %s 2>&1 | FileCheck %s
3df3d70b5SDavid Sherwood
4df3d70b5SDavid Sherwood
5df3d70b5SDavid Sherwooddefine i32 @multiple_exits_with_predicates(ptr %src1, ptr readonly %src2, i32 %end) {
6df3d70b5SDavid Sherwood; CHECK-LABEL: 'multiple_exits_with_predicates'
7df3d70b5SDavid Sherwood; CHECK-NEXT:  Determining loop execution counts for: @multiple_exits_with_predicates
8df3d70b5SDavid Sherwood; CHECK-NEXT:  Loop %for.body: <multiple exits> Unpredictable backedge-taken count.
9df3d70b5SDavid Sherwood; CHECK-NEXT:    exit count for for.body: ***COULDNOTCOMPUTE***
10df3d70b5SDavid Sherwood; CHECK-NEXT:    predicated exit count for for.body: i32 1023
11df3d70b5SDavid Sherwood; CHECK-NEXT:     Predicates:
12df3d70b5SDavid Sherwood; CHECK-NEXT:      {1,+,1}<%for.body> Added Flags: <nusw>
13df3d70b5SDavid Sherwood; CHECK-EMPTY:
14df3d70b5SDavid Sherwood; CHECK-NEXT:    exit count for for.work: ***COULDNOTCOMPUTE***
15df3d70b5SDavid Sherwood; CHECK-NEXT:    exit count for for.inc: ***COULDNOTCOMPUTE***
16df3d70b5SDavid Sherwood; CHECK-NEXT:    predicated exit count for for.inc: (-1 + (1 umax %end))
17df3d70b5SDavid Sherwood; CHECK-NEXT:     Predicates:
18df3d70b5SDavid Sherwood; CHECK-NEXT:      {1,+,1}<%for.body> Added Flags: <nusw>
19df3d70b5SDavid Sherwood; CHECK-EMPTY:
20df3d70b5SDavid Sherwood; CHECK-NEXT:  Loop %for.body: Unpredictable constant max backedge-taken count.
21df3d70b5SDavid Sherwood; CHECK-NEXT:  Loop %for.body: Unpredictable symbolic max backedge-taken count.
22df3d70b5SDavid Sherwood; CHECK-NEXT:    symbolic max exit count for for.body: ***COULDNOTCOMPUTE***
23df3d70b5SDavid Sherwood; CHECK-NEXT:    predicated symbolic max exit count for for.body: i32 1023
24df3d70b5SDavid Sherwood; CHECK-NEXT:     Predicates:
25df3d70b5SDavid Sherwood; CHECK-NEXT:      {1,+,1}<%for.body> Added Flags: <nusw>
26df3d70b5SDavid Sherwood; CHECK-EMPTY:
27df3d70b5SDavid Sherwood; CHECK-NEXT:    symbolic max exit count for for.work: ***COULDNOTCOMPUTE***
28df3d70b5SDavid Sherwood; CHECK-NEXT:    symbolic max exit count for for.inc: ***COULDNOTCOMPUTE***
29df3d70b5SDavid Sherwood; CHECK-NEXT:    predicated symbolic max exit count for for.inc: (-1 + (1 umax %end))
30df3d70b5SDavid Sherwood; CHECK-NEXT:     Predicates:
31df3d70b5SDavid Sherwood; CHECK-NEXT:      {1,+,1}<%for.body> Added Flags: <nusw>
32df3d70b5SDavid Sherwood; CHECK-EMPTY:
33*02ee96ecSDavid Sherwood; CHECK-NEXT:  Loop %for.body: Predicated constant max backedge-taken count is i32 1023
34*02ee96ecSDavid Sherwood; CHECK-NEXT:   Predicates:
35*02ee96ecSDavid Sherwood; CHECK-NEXT:      {1,+,1}<%for.body> Added Flags: <nusw>
36*02ee96ecSDavid Sherwood; CHECK-NEXT:      {1,+,1}<%for.body> Added Flags: <nusw>
37df3d70b5SDavid Sherwood; CHECK-NEXT:  Loop %for.body: Predicated symbolic max backedge-taken count is (1023 umin (-1 + (1 umax %end)))
38df3d70b5SDavid Sherwood; CHECK-NEXT:   Predicates:
39df3d70b5SDavid Sherwood; CHECK-NEXT:      {1,+,1}<%for.body> Added Flags: <nusw>
40df3d70b5SDavid Sherwood; CHECK-NEXT:      {1,+,1}<%for.body> Added Flags: <nusw>
41df3d70b5SDavid Sherwood;
42df3d70b5SDavid Sherwoodentry:
43df3d70b5SDavid Sherwood  br label %for.body
44df3d70b5SDavid Sherwood
45df3d70b5SDavid Sherwoodfor.body:
46df3d70b5SDavid Sherwood  %index = phi i8 [ %index.next, %for.inc ], [ 0, %entry ]
47df3d70b5SDavid Sherwood  %index.next = add i8 %index, 1
48df3d70b5SDavid Sherwood  %conv = zext i8 %index.next to i32
49df3d70b5SDavid Sherwood  %cmp.body = icmp ne i32 %conv, 1024
50df3d70b5SDavid Sherwood  br i1 %cmp.body, label %for.work, label %exit
51df3d70b5SDavid Sherwood
52df3d70b5SDavid Sherwoodfor.work:
53df3d70b5SDavid Sherwood  %arrayidx = getelementptr inbounds i32, ptr %src1, i8 %index
54df3d70b5SDavid Sherwood  %0 = load i32, ptr %arrayidx, align 4
55df3d70b5SDavid Sherwood  %arrayidx3 = getelementptr inbounds i32, ptr %src2, i8 %index
56df3d70b5SDavid Sherwood  %1 = load i32, ptr %arrayidx3, align 4
57df3d70b5SDavid Sherwood  %cmp.work = icmp eq i32 %0, %1
58df3d70b5SDavid Sherwood  br i1 %cmp.work, label %found, label %for.inc
59df3d70b5SDavid Sherwood
60df3d70b5SDavid Sherwoodfor.inc:
61df3d70b5SDavid Sherwood  %cmp.inc = icmp ult i32 %conv, %end
62df3d70b5SDavid Sherwood  br i1 %cmp.inc, label %for.body, label %exit
63df3d70b5SDavid Sherwood
64df3d70b5SDavid Sherwoodfound:
65df3d70b5SDavid Sherwood  ret i32 1
66df3d70b5SDavid Sherwood
67df3d70b5SDavid Sherwoodexit:
68df3d70b5SDavid Sherwood  ret i32 0
69df3d70b5SDavid Sherwood}
70