1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
2; RUN: opt -passes='print<scalar-evolution>' -scalar-evolution-classify-expressions=0 -disable-output %s 2>&1 | FileCheck %s
3
4; %i and %i + 1 can overflow.
5define void @test1(i64 %x, ptr %a, ptr %b) {
6; CHECK-LABEL: 'test1'
7; CHECK-NEXT:  Determining loop execution counts for: @test1
8; CHECK-NEXT:  Loop %header: <multiple exits> Unpredictable backedge-taken count.
9; CHECK-NEXT:    exit count for header: ***COULDNOTCOMPUTE***
10; CHECK-NEXT:    exit count for latch: ***COULDNOTCOMPUTE***
11; CHECK-NEXT:    predicated exit count for latch: (-1 + (1 umax %x))
12; CHECK-NEXT:     Predicates:
13; CHECK-NEXT:      {1,+,1}<%header> Added Flags: <nusw>
14; CHECK-EMPTY:
15; CHECK-NEXT:  Loop %header: Unpredictable constant max backedge-taken count.
16; CHECK-NEXT:  Loop %header: Unpredictable symbolic max backedge-taken count.
17; CHECK-NEXT:    symbolic max exit count for header: ***COULDNOTCOMPUTE***
18; CHECK-NEXT:    symbolic max exit count for latch: ***COULDNOTCOMPUTE***
19; CHECK-NEXT:    predicated symbolic max exit count for latch: (-1 + (1 umax %x))
20; CHECK-NEXT:     Predicates:
21; CHECK-NEXT:      {1,+,1}<%header> Added Flags: <nusw>
22; CHECK-EMPTY:
23; CHECK-NEXT:  Loop %header: Predicated constant max backedge-taken count is i64 -2
24; CHECK-NEXT:   Predicates:
25; CHECK-NEXT:      {1,+,1}<%header> Added Flags: <nusw>
26; CHECK-NEXT:  Loop %header: Predicated symbolic max backedge-taken count is (-1 + (1 umax %x))
27; CHECK-NEXT:   Predicates:
28; CHECK-NEXT:      {1,+,1}<%header> Added Flags: <nusw>
29;
30entry:
31  br label %header
32
33header:
34  %conv11 = phi i64 [ 0, %entry ], [ %conv, %latch ]
35  %i.010 = phi i32 [ 0, %entry ], [ %add, %latch ]
36  %add = add i32 %i.010, 1
37  %idxprom = zext i32 %add to i64
38  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %idxprom
39  %ld = load i32, ptr %arrayidx, align 4
40  %uncountable.c = icmp eq i32 %ld, 10
41  br i1 %uncountable.c, label %exit, label %latch
42
43latch:
44  %add2 = add nsw i32 %ld, 1
45  %arrayidx4 = getelementptr inbounds i32, ptr %b, i64 %conv11
46  store i32 %add2, ptr %arrayidx4, align 4
47  %conv = zext i32 %add to i64
48  %cmp = icmp ult i64 %conv, %x
49  br i1 %cmp, label %header, label %exit
50
51exit:
52  ret void
53}
54
55; %i can overflow.
56;
57; We need to check that i doesn't wrap, but we don't need a run-time alias
58; check. We also need an extra no-wrap check to get the backedge taken count.
59define void @test2(i64 %x, ptr %a) {
60; CHECK-LABEL: 'test2'
61; CHECK-NEXT:  Determining loop execution counts for: @test2
62; CHECK-NEXT:  Loop %header: <multiple exits> Unpredictable backedge-taken count.
63; CHECK-NEXT:    exit count for header: ***COULDNOTCOMPUTE***
64; CHECK-NEXT:    exit count for latch: ***COULDNOTCOMPUTE***
65; CHECK-NEXT:    predicated exit count for latch: (-1 + (1 umax %x))
66; CHECK-NEXT:     Predicates:
67; CHECK-NEXT:      {1,+,1}<%header> Added Flags: <nusw>
68; CHECK-EMPTY:
69; CHECK-NEXT:  Loop %header: Unpredictable constant max backedge-taken count.
70; CHECK-NEXT:  Loop %header: Unpredictable symbolic max backedge-taken count.
71; CHECK-NEXT:    symbolic max exit count for header: ***COULDNOTCOMPUTE***
72; CHECK-NEXT:    symbolic max exit count for latch: ***COULDNOTCOMPUTE***
73; CHECK-NEXT:    predicated symbolic max exit count for latch: (-1 + (1 umax %x))
74; CHECK-NEXT:     Predicates:
75; CHECK-NEXT:      {1,+,1}<%header> Added Flags: <nusw>
76; CHECK-EMPTY:
77; CHECK-NEXT:  Loop %header: Predicated constant max backedge-taken count is i64 -2
78; CHECK-NEXT:   Predicates:
79; CHECK-NEXT:      {1,+,1}<%header> Added Flags: <nusw>
80; CHECK-NEXT:  Loop %header: Predicated symbolic max backedge-taken count is (-1 + (1 umax %x))
81; CHECK-NEXT:   Predicates:
82; CHECK-NEXT:      {1,+,1}<%header> Added Flags: <nusw>
83;
84entry:
85  br label %header
86
87header:
88  %conv11 = phi i64 [ 0, %entry ], [ %conv, %latch ]
89  %i.010 = phi i32  [ 0, %entry ], [ %inc, %latch ]
90  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %conv11
91  %ld = load i32, ptr %arrayidx, align 4
92  %uncountable.c = icmp eq i32 %ld, 10
93  br i1 %uncountable.c, label %exit, label %latch
94
95latch:
96  %add = add nsw i32 %ld, 1
97  store i32 %add, ptr %arrayidx, align 4
98  %inc = add i32 %i.010, 1
99  %conv = zext i32 %inc to i64
100  %cmp = icmp ult i64 %conv, %x
101  br i1 %cmp, label %header, label %exit
102
103exit:
104  ret void
105}
106