xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/no-wrap-symbolic-becount.ll (revision 8b5b294ec2cf876bc5eb5bd5fcb56ef487e36d60)
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
2; RUN: opt < %s -disable-output -scalar-evolution-use-expensive-range-sharpening -passes='print<scalar-evolution>' 2>&1 | FileCheck %s
3
4define i32 @test_01(i32 %start, ptr %p, ptr %q) {
5; CHECK-LABEL: 'test_01'
6; CHECK-NEXT:  Classifying expressions for: @test_01
7; CHECK-NEXT:    %0 = zext i32 %start to i64
8; CHECK-NEXT:    --> (zext i32 %start to i64) U: [0,4294967296) S: [0,4294967296)
9; CHECK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.next, %backedge ], [ %0, %entry ]
10; CHECK-NEXT:    --> {(zext i32 %start to i64),+,-1}<nsw><%loop> U: [0,4294967296) S: [0,4294967296) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
11; CHECK-NEXT:    %iv = phi i32 [ %start, %entry ], [ %iv.next, %backedge ]
12; CHECK-NEXT:    --> {%start,+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
13; CHECK-NEXT:    %iv.next = add i32 %iv, -1
14; CHECK-NEXT:    --> {(-1 + %start),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
15; CHECK-NEXT:    %index = zext i32 %iv.next to i64
16; CHECK-NEXT:    --> (zext i32 {(-1 + %start),+,-1}<%loop> to i64) U: [0,4294967296) S: [0,4294967296) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
17; CHECK-NEXT:    %store.addr = getelementptr i32, ptr %p, i64 %index
18; CHECK-NEXT:    --> ((4 * (zext i32 {(-1 + %start),+,-1}<%loop> to i64))<nuw><nsw> + %p) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
19; CHECK-NEXT:    %load.addr = getelementptr i32, ptr %q, i64 %index
20; CHECK-NEXT:    --> ((4 * (zext i32 {(-1 + %start),+,-1}<%loop> to i64))<nuw><nsw> + %q) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
21; CHECK-NEXT:    %stop = load i32, ptr %load.addr, align 4
22; CHECK-NEXT:    --> %stop U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
23; CHECK-NEXT:    %indvars.iv.next = add nsw i64 %indvars.iv, -1
24; CHECK-NEXT:    --> {(-1 + (zext i32 %start to i64))<nsw>,+,-1}<nsw><%loop> U: [-4294967296,4294967295) S: [-1,4294967295) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
25; CHECK-NEXT:  Determining loop execution counts for: @test_01
26; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.
27; CHECK-NEXT:    exit count for loop: (zext i32 %start to i64)
28; CHECK-NEXT:    exit count for backedge: ***COULDNOTCOMPUTE***
29; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i64 4294967295
30; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (zext i32 %start to i64)
31; CHECK-NEXT:    symbolic max exit count for loop: (zext i32 %start to i64)
32; CHECK-NEXT:    symbolic max exit count for backedge: ***COULDNOTCOMPUTE***
33;
34entry:
35  %0 = zext i32 %start to i64
36  br label %loop
37
38loop:                                             ; preds = %backedge, %entry
39  %indvars.iv = phi i64 [ %indvars.iv.next, %backedge ], [ %0, %entry ]
40  %iv = phi i32 [ %start, %entry ], [ %iv.next, %backedge ]
41  %cond = icmp eq i64 %indvars.iv, 0
42  br i1 %cond, label %exit, label %backedge
43
44backedge:                                         ; preds = %loop
45  %iv.next = add i32 %iv, -1
46  %index = zext i32 %iv.next to i64
47  %store.addr = getelementptr i32, ptr %p, i64 %index
48  store i32 1, ptr %store.addr, align 4
49  %load.addr = getelementptr i32, ptr %q, i64 %index
50  %stop = load i32, ptr %load.addr, align 4
51  %loop.cond = icmp eq i32 %stop, 0
52  %indvars.iv.next = add nsw i64 %indvars.iv, -1
53  br i1 %loop.cond, label %loop, label %failure
54
55exit:                                             ; preds = %loop
56  ret i32 0
57
58failure:                                          ; preds = %backedge
59  unreachable
60}
61
62; Check that we do not mess up with wrapping ranges.
63define i32 @test_02(i32 %start, ptr %p, ptr %q) {
64; CHECK-LABEL: 'test_02'
65; CHECK-NEXT:  Classifying expressions for: @test_02
66; CHECK-NEXT:    %zext = zext i32 %start to i64
67; CHECK-NEXT:    --> (zext i32 %start to i64) U: [0,4294967296) S: [0,4294967296)
68; CHECK-NEXT:    %shl = shl i64 %zext, 31
69; CHECK-NEXT:    --> (2147483648 * (zext i32 %start to i64))<nuw><nsw> U: [0,9223372034707292161) S: [0,9223372034707292161)
70; CHECK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.next, %loop ], [ %shl, %entry ]
71; CHECK-NEXT:    --> {(2147483648 * (zext i32 %start to i64))<nuw><nsw>,+,-1}<nsw><%loop> U: [-9223372036854775808,9223372034707292161) S: [-9223372036854775808,9223372034707292161) Exits: -9223372036854775806 LoopDispositions: { %loop: Computable }
72; CHECK-NEXT:    %indvars.iv.next = add nsw i64 %indvars.iv, -1
73; CHECK-NEXT:    --> {(-1 + (2147483648 * (zext i32 %start to i64))<nuw><nsw>)<nsw>,+,-1}<nw><%loop> U: full-set S: full-set Exits: -9223372036854775807 LoopDispositions: { %loop: Computable }
74; CHECK-NEXT:  Determining loop execution counts for: @test_02
75; CHECK-NEXT:  Loop %loop: backedge-taken count is (9223372036854775806 + (2147483648 * (zext i32 %start to i64))<nuw><nsw>)<nuw>
76; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i64 -2147483650
77; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (9223372036854775806 + (2147483648 * (zext i32 %start to i64))<nuw><nsw>)<nuw>
78; CHECK-NEXT:  Loop %loop: Trip multiple is 1
79;
80entry:
81  %zext = zext i32 %start to i64
82  %shl = shl i64 %zext, 31
83  br label %loop
84
85loop:                                             ; preds = %backedge, %entry
86  %indvars.iv = phi i64 [ %indvars.iv.next, %loop ], [ %shl, %entry ]
87  %cond = icmp eq i64 %indvars.iv, -9223372036854775806
88  %indvars.iv.next = add nsw i64 %indvars.iv, -1
89  br i1 %cond, label %exit, label %loop
90
91exit:                                             ; preds = %loop
92  ret i32 0
93}
94
95define void @pointer_iv_nowrap(ptr %startptr, ptr %endptr) local_unnamed_addr {
96; CHECK-LABEL: 'pointer_iv_nowrap'
97; CHECK-NEXT:  Classifying expressions for: @pointer_iv_nowrap
98; CHECK-NEXT:    %init = getelementptr inbounds i8, ptr %startptr, i64 2000
99; CHECK-NEXT:    --> (2000 + %startptr) U: full-set S: full-set
100; CHECK-NEXT:    %iv = phi ptr [ %init, %entry ], [ %iv.next, %loop ]
101; CHECK-NEXT:    --> {(2000 + %startptr),+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
102; CHECK-NEXT:    %iv.next = getelementptr inbounds i8, ptr %iv, i64 1
103; CHECK-NEXT:    --> {(2001 + %startptr),+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
104; CHECK-NEXT:  Determining loop execution counts for: @pointer_iv_nowrap
105; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.
106; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.
107; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.
108;
109entry:
110  %init = getelementptr inbounds i8, ptr %startptr, i64 2000
111  br label %loop
112
113loop:
114  %iv = phi ptr [ %init, %entry ], [ %iv.next, %loop ]
115  %iv.next = getelementptr inbounds i8, ptr %iv, i64 1
116  %ec = icmp ugt ptr %iv.next, %endptr
117  br i1 %ec, label %end, label %loop
118
119end:
120  ret void
121}
122
123define void @pointer_iv_nowrap_guard(ptr %startptr, ptr %endptr) local_unnamed_addr {
124; CHECK-LABEL: 'pointer_iv_nowrap_guard'
125; CHECK-NEXT:  Classifying expressions for: @pointer_iv_nowrap_guard
126; CHECK-NEXT:    %init = getelementptr inbounds i32, ptr %startptr, i64 2000
127; CHECK-NEXT:    --> (8000 + %startptr)<nuw> U: [8000,0) S: [8000,0)
128; CHECK-NEXT:    %iv = phi ptr [ %init, %entry ], [ %iv.next, %loop ]
129; CHECK-NEXT:    --> {(8000 + %startptr)<nuw>,+,4}<nuw><%loop> U: [8000,0) S: [8000,0) Exits: (8000 + (4 * ((-8001 + (-1 * (ptrtoint ptr %startptr to i64)) + ((8004 + (ptrtoint ptr %startptr to i64)) umax (ptrtoint ptr %endptr to i64))) /u 4))<nuw> + %startptr) LoopDispositions: { %loop: Computable }
130; CHECK-NEXT:    %iv.next = getelementptr inbounds i32, ptr %iv, i64 1
131; CHECK-NEXT:    --> {(8004 + %startptr),+,4}<nuw><%loop> U: full-set S: full-set Exits: (8004 + (4 * ((-8001 + (-1 * (ptrtoint ptr %startptr to i64)) + ((8004 + (ptrtoint ptr %startptr to i64)) umax (ptrtoint ptr %endptr to i64))) /u 4))<nuw> + %startptr) LoopDispositions: { %loop: Computable }
132; CHECK-NEXT:  Determining loop execution counts for: @pointer_iv_nowrap_guard
133; CHECK-NEXT:  Loop %loop: backedge-taken count is ((-8001 + (-1 * (ptrtoint ptr %startptr to i64)) + ((8004 + (ptrtoint ptr %startptr to i64)) umax (ptrtoint ptr %endptr to i64))) /u 4)
134; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i64 4611686018427387903
135; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((-8001 + (-1 * (ptrtoint ptr %startptr to i64)) + ((8004 + (ptrtoint ptr %startptr to i64)) umax (ptrtoint ptr %endptr to i64))) /u 4)
136; CHECK-NEXT:  Loop %loop: Trip multiple is 1
137;
138entry:
139  %init = getelementptr inbounds i32, ptr %startptr, i64 2000
140  %cmp2 = icmp ult ptr %init, %endptr
141  br i1 %cmp2, label %loop, label %end
142
143loop:
144  %iv = phi ptr [ %init, %entry ], [ %iv.next, %loop ]
145  %iv.next = getelementptr inbounds i32, ptr %iv, i64 1
146  %ec = icmp uge ptr %iv.next, %endptr
147  br i1 %ec, label %end, label %loop
148
149end:
150  ret void
151}
152