xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/trip-count-scalable-stride.ll (revision b812e57ac301c7f88171cc73e213b70078727b16)
1448bb5cfSPhilip Reames; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
2448bb5cfSPhilip Reames; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck %s
3448bb5cfSPhilip Reames
4448bb5cfSPhilip Reamestarget datalayout = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"
5448bb5cfSPhilip Reames
6448bb5cfSPhilip Reamesdefine void @vscale_slt(ptr nocapture %A, i32 %n) mustprogress vscale_range(2,1024) {
7448bb5cfSPhilip Reames; CHECK-LABEL: 'vscale_slt'
8448bb5cfSPhilip Reames; CHECK-NEXT:  Classifying expressions for: @vscale_slt
9448bb5cfSPhilip Reames; CHECK-NEXT:    %vscale = call i32 @llvm.vscale.i32()
10448bb5cfSPhilip Reames; CHECK-NEXT:    --> vscale U: [2,1025) S: [2,1025)
11448bb5cfSPhilip Reames; CHECK-NEXT:    %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
12448bb5cfSPhilip Reames; CHECK-NEXT:    --> {0,+,vscale}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (vscale * ((-1 + %n) /u vscale))<nuw> LoopDispositions: { %for.body: Computable }
13448bb5cfSPhilip Reames; CHECK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
14448bb5cfSPhilip Reames; CHECK-NEXT:    --> {%A,+,(4 * vscale)<nuw><nsw>}<nuw><%for.body> U: full-set S: full-set Exits: ((4 * vscale * ((-1 + %n) /u vscale)) + %A) LoopDispositions: { %for.body: Computable }
15448bb5cfSPhilip Reames; CHECK-NEXT:    %add = add nsw i32 %i.05, %vscale
16448bb5cfSPhilip Reames; CHECK-NEXT:    --> {vscale,+,vscale}<nuw><nsw><%for.body> U: [2,-2147483648) S: [2,-2147483648) Exits: (vscale * (1 + ((-1 + %n) /u vscale))<nuw>) LoopDispositions: { %for.body: Computable }
17448bb5cfSPhilip Reames; CHECK-NEXT:  Determining loop execution counts for: @vscale_slt
18448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: backedge-taken count is ((-1 + %n) /u vscale)
19448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 1073741822
20448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is ((-1 + %n) /u vscale)
21448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: Trip multiple is 1
22448bb5cfSPhilip Reames;
23448bb5cfSPhilip Reamesentry:
24448bb5cfSPhilip Reames  %vscale = call i32 @llvm.vscale.i32()
25448bb5cfSPhilip Reames  %cmp4 = icmp sgt i32 %n, 0
26448bb5cfSPhilip Reames  br i1 %cmp4, label %for.body, label %for.end
27448bb5cfSPhilip Reames
28448bb5cfSPhilip Reamesfor.body:                                         ; preds = %entry, %for.body
29448bb5cfSPhilip Reames  %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
30448bb5cfSPhilip Reames  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
31448bb5cfSPhilip Reames  %0 = load <vscale x 4 x i32>, ptr %arrayidx, align 4
32448bb5cfSPhilip Reames  %inc = add nsw <vscale x 4 x i32> %0, splat (i32 1)
33448bb5cfSPhilip Reames  store <vscale x 4 x i32> %inc, ptr %arrayidx, align 4
34448bb5cfSPhilip Reames  %add = add nsw i32 %i.05, %vscale
35448bb5cfSPhilip Reames  %cmp = icmp slt i32 %add, %n
36448bb5cfSPhilip Reames  br i1 %cmp, label %for.body, label %for.end
37448bb5cfSPhilip Reames
38448bb5cfSPhilip Reamesfor.end:                                          ; preds = %for.body, %entry
39448bb5cfSPhilip Reames  ret void
40448bb5cfSPhilip Reames}
41448bb5cfSPhilip Reames
42448bb5cfSPhilip Reamesdefine void @vscale_ult(ptr nocapture %A, i32 %n) mustprogress vscale_range(2,1024) {
43448bb5cfSPhilip Reames; CHECK-LABEL: 'vscale_ult'
44448bb5cfSPhilip Reames; CHECK-NEXT:  Classifying expressions for: @vscale_ult
45448bb5cfSPhilip Reames; CHECK-NEXT:    %vscale = call i32 @llvm.vscale.i32()
46448bb5cfSPhilip Reames; CHECK-NEXT:    --> vscale U: [2,1025) S: [2,1025)
47448bb5cfSPhilip Reames; CHECK-NEXT:    %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
48448bb5cfSPhilip Reames; CHECK-NEXT:    --> {0,+,vscale}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (vscale * ((-1 + %n) /u vscale))<nuw> LoopDispositions: { %for.body: Computable }
49448bb5cfSPhilip Reames; CHECK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
50448bb5cfSPhilip Reames; CHECK-NEXT:    --> {%A,+,(4 * vscale)<nuw><nsw>}<nuw><%for.body> U: full-set S: full-set Exits: ((4 * vscale * ((-1 + %n) /u vscale)) + %A) LoopDispositions: { %for.body: Computable }
51448bb5cfSPhilip Reames; CHECK-NEXT:    %add = add nsw i32 %i.05, %vscale
52448bb5cfSPhilip Reames; CHECK-NEXT:    --> {vscale,+,vscale}<nuw><nsw><%for.body> U: [2,-2147483648) S: [2,-2147483648) Exits: (vscale * (1 + ((-1 + %n) /u vscale))<nuw>) LoopDispositions: { %for.body: Computable }
53448bb5cfSPhilip Reames; CHECK-NEXT:  Determining loop execution counts for: @vscale_ult
54448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: backedge-taken count is ((-1 + %n) /u vscale)
55448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 2147483646
56448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is ((-1 + %n) /u vscale)
57448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: Trip multiple is 1
58448bb5cfSPhilip Reames;
59448bb5cfSPhilip Reamesentry:
60448bb5cfSPhilip Reames  %vscale = call i32 @llvm.vscale.i32()
61448bb5cfSPhilip Reames  %cmp4 = icmp sgt i32 %n, 0
62448bb5cfSPhilip Reames  br i1 %cmp4, label %for.body, label %for.end
63448bb5cfSPhilip Reames
64448bb5cfSPhilip Reamesfor.body:                                         ; preds = %entry, %for.body
65448bb5cfSPhilip Reames  %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
66448bb5cfSPhilip Reames  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
67448bb5cfSPhilip Reames  %0 = load <vscale x 4 x i32>, ptr %arrayidx, align 4
68448bb5cfSPhilip Reames  %inc = add nsw <vscale x 4 x i32> %0, splat (i32 1)
69448bb5cfSPhilip Reames  store <vscale x 4 x i32> %inc, ptr %arrayidx, align 4
70448bb5cfSPhilip Reames  %add = add nsw i32 %i.05, %vscale
71448bb5cfSPhilip Reames  %cmp = icmp ult i32 %add, %n
72448bb5cfSPhilip Reames  br i1 %cmp, label %for.body, label %for.end
73448bb5cfSPhilip Reames
74448bb5cfSPhilip Reamesfor.end:                                          ; preds = %for.body, %entry
75448bb5cfSPhilip Reames  ret void
76448bb5cfSPhilip Reames}
77448bb5cfSPhilip Reames
78448bb5cfSPhilip Reamesdefine void @vscale_ule(ptr nocapture %A, i32 %n) mustprogress vscale_range(2,1024) {
79448bb5cfSPhilip Reames; CHECK-LABEL: 'vscale_ule'
80448bb5cfSPhilip Reames; CHECK-NEXT:  Classifying expressions for: @vscale_ule
81448bb5cfSPhilip Reames; CHECK-NEXT:    %vscale = call i32 @llvm.vscale.i32()
82448bb5cfSPhilip Reames; CHECK-NEXT:    --> vscale U: [2,1025) S: [2,1025)
83448bb5cfSPhilip Reames; CHECK-NEXT:    %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
84448bb5cfSPhilip Reames; CHECK-NEXT:    --> {0,+,vscale}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (vscale * (((-1 + vscale)<nsw> umax %n) /u vscale))<nuw> LoopDispositions: { %for.body: Computable }
85448bb5cfSPhilip Reames; CHECK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
86448bb5cfSPhilip Reames; CHECK-NEXT:    --> {%A,+,(4 * vscale)<nuw><nsw>}<nuw><%for.body> U: full-set S: full-set Exits: ((4 * vscale * (((-1 + vscale)<nsw> umax %n) /u vscale)) + %A) LoopDispositions: { %for.body: Computable }
87448bb5cfSPhilip Reames; CHECK-NEXT:    %add = add nsw i32 %i.05, %vscale
88448bb5cfSPhilip Reames; CHECK-NEXT:    --> {vscale,+,vscale}<nuw><nsw><%for.body> U: [2,-2147483648) S: [2,-2147483648) Exits: (vscale * (1 + (((-1 + vscale)<nsw> umax %n) /u vscale))<nuw>) LoopDispositions: { %for.body: Computable }
89448bb5cfSPhilip Reames; CHECK-NEXT:  Determining loop execution counts for: @vscale_ule
90448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: backedge-taken count is (((-1 + vscale)<nsw> umax %n) /u vscale)
91448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 2147483647
92448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (((-1 + vscale)<nsw> umax %n) /u vscale)
93448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: Trip multiple is 1
94448bb5cfSPhilip Reames;
95448bb5cfSPhilip Reamesentry:
96448bb5cfSPhilip Reames  %vscale = call i32 @llvm.vscale.i32()
97448bb5cfSPhilip Reames  %cmp4 = icmp sgt i32 %n, 0
98448bb5cfSPhilip Reames  br i1 %cmp4, label %for.body, label %for.end
99448bb5cfSPhilip Reames
100448bb5cfSPhilip Reamesfor.body:                                         ; preds = %entry, %for.body
101448bb5cfSPhilip Reames  %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
102448bb5cfSPhilip Reames  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
103448bb5cfSPhilip Reames  %0 = load <vscale x 4 x i32>, ptr %arrayidx, align 4
104448bb5cfSPhilip Reames  %inc = add nsw <vscale x 4 x i32> %0, splat (i32 1)
105448bb5cfSPhilip Reames  store <vscale x 4 x i32> %inc, ptr %arrayidx, align 4
106448bb5cfSPhilip Reames  %add = add nsw i32 %i.05, %vscale
107448bb5cfSPhilip Reames  %cmp = icmp ule i32 %add, %n
108448bb5cfSPhilip Reames  br i1 %cmp, label %for.body, label %for.end
109448bb5cfSPhilip Reames
110448bb5cfSPhilip Reamesfor.end:                                          ; preds = %for.body, %entry
111448bb5cfSPhilip Reames  ret void
112448bb5cfSPhilip Reames}
113448bb5cfSPhilip Reames
114448bb5cfSPhilip Reamesdefine void @vscale_ne(ptr nocapture %A, i32 %n) mustprogress vscale_range(2,1024) {
115448bb5cfSPhilip Reames; CHECK-LABEL: 'vscale_ne'
116448bb5cfSPhilip Reames; CHECK-NEXT:  Classifying expressions for: @vscale_ne
117448bb5cfSPhilip Reames; CHECK-NEXT:    %vscale = call i32 @llvm.vscale.i32()
118448bb5cfSPhilip Reames; CHECK-NEXT:    --> vscale U: [2,1025) S: [2,1025)
119448bb5cfSPhilip Reames; CHECK-NEXT:    %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
120448bb5cfSPhilip Reames; CHECK-NEXT:    --> {0,+,vscale}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (vscale * (((-1 * vscale)<nsw> + %n) /u vscale))<nuw> LoopDispositions: { %for.body: Computable }
121448bb5cfSPhilip Reames; CHECK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
122448bb5cfSPhilip Reames; CHECK-NEXT:    --> {%A,+,(4 * vscale)<nuw><nsw>}<nuw><%for.body> U: full-set S: full-set Exits: ((4 * vscale * (((-1 * vscale)<nsw> + %n) /u vscale)) + %A) LoopDispositions: { %for.body: Computable }
123448bb5cfSPhilip Reames; CHECK-NEXT:    %add = add nsw i32 %i.05, %vscale
124448bb5cfSPhilip Reames; CHECK-NEXT:    --> {vscale,+,vscale}<nuw><nsw><%for.body> U: [2,-2147483648) S: [2,-2147483648) Exits: (vscale * (1 + (((-1 * vscale)<nsw> + %n) /u vscale))<nuw>) LoopDispositions: { %for.body: Computable }
125448bb5cfSPhilip Reames; CHECK-NEXT:  Determining loop execution counts for: @vscale_ne
126448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: backedge-taken count is (((-1 * vscale)<nsw> + %n) /u vscale)
127448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 2147483647
128448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (((-1 * vscale)<nsw> + %n) /u vscale)
129448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: Trip multiple is 1
130448bb5cfSPhilip Reames;
131448bb5cfSPhilip Reamesentry:
132448bb5cfSPhilip Reames  %vscale = call i32 @llvm.vscale.i32()
133448bb5cfSPhilip Reames  %cmp4 = icmp sgt i32 %n, 0
134448bb5cfSPhilip Reames  br i1 %cmp4, label %for.body, label %for.end
135448bb5cfSPhilip Reames
136448bb5cfSPhilip Reamesfor.body:                                         ; preds = %entry, %for.body
137448bb5cfSPhilip Reames  %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
138448bb5cfSPhilip Reames  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
139448bb5cfSPhilip Reames  %0 = load <vscale x 4 x i32>, ptr %arrayidx, align 4
140448bb5cfSPhilip Reames  %inc = add nsw <vscale x 4 x i32> %0, splat (i32 1)
141448bb5cfSPhilip Reames  store <vscale x 4 x i32> %inc, ptr %arrayidx, align 4
142448bb5cfSPhilip Reames  %add = add nsw i32 %i.05, %vscale
143448bb5cfSPhilip Reames  %cmp = icmp ne i32 %add, %n
144448bb5cfSPhilip Reames  br i1 %cmp, label %for.body, label %for.end
145448bb5cfSPhilip Reames
146448bb5cfSPhilip Reamesfor.end:                                          ; preds = %for.body, %entry
147448bb5cfSPhilip Reames  ret void
148448bb5cfSPhilip Reames}
149448bb5cfSPhilip Reames
150448bb5cfSPhilip Reames
151448bb5cfSPhilip Reamesdefine void @vscalex4_slt(ptr nocapture %A, i32 %n) mustprogress vscale_range(2,1024) {
152448bb5cfSPhilip Reames; CHECK-LABEL: 'vscalex4_slt'
153448bb5cfSPhilip Reames; CHECK-NEXT:  Classifying expressions for: @vscalex4_slt
154448bb5cfSPhilip Reames; CHECK-NEXT:    %vscale = call i32 @llvm.vscale.i32()
155448bb5cfSPhilip Reames; CHECK-NEXT:    --> vscale U: [2,1025) S: [2,1025)
156448bb5cfSPhilip Reames; CHECK-NEXT:    %VF = mul i32 %vscale, 4
157448bb5cfSPhilip Reames; CHECK-NEXT:    --> (4 * vscale)<nuw><nsw> U: [8,4097) S: [8,4097)
158448bb5cfSPhilip Reames; CHECK-NEXT:    %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
159448bb5cfSPhilip Reames; CHECK-NEXT:    --> {0,+,(4 * vscale)<nuw><nsw>}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,2147483645) Exits: (4 * vscale * ((-1 + %n) /u (4 * vscale)<nuw><nsw>)) LoopDispositions: { %for.body: Computable }
160448bb5cfSPhilip Reames; CHECK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
161448bb5cfSPhilip Reames; CHECK-NEXT:    --> {%A,+,(16 * vscale)<nuw><nsw>}<nuw><%for.body> U: full-set S: full-set Exits: ((16 * vscale * ((-1 + %n) /u (4 * vscale)<nuw><nsw>)) + %A) LoopDispositions: { %for.body: Computable }
162448bb5cfSPhilip Reames; CHECK-NEXT:    %add = add nsw i32 %i.05, %VF
163448bb5cfSPhilip Reames; CHECK-NEXT:    --> {(4 * vscale)<nuw><nsw>,+,(4 * vscale)<nuw><nsw>}<nuw><nsw><%for.body> U: [8,-2147483648) S: [8,2147483645) Exits: (vscale * (4 + (4 * ((-1 + %n) /u (4 * vscale)<nuw><nsw>))<nuw><nsw>)<nuw>) LoopDispositions: { %for.body: Computable }
164448bb5cfSPhilip Reames; CHECK-NEXT:  Determining loop execution counts for: @vscalex4_slt
165448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: backedge-taken count is ((-1 + %n) /u (4 * vscale)<nuw><nsw>)
166448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 268435454
167448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is ((-1 + %n) /u (4 * vscale)<nuw><nsw>)
168448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: Trip multiple is 1
169448bb5cfSPhilip Reames;
170448bb5cfSPhilip Reamesentry:
171448bb5cfSPhilip Reames  %vscale = call i32 @llvm.vscale.i32()
172448bb5cfSPhilip Reames  %VF = mul i32 %vscale, 4
173448bb5cfSPhilip Reames  %cmp4 = icmp sgt i32 %n, 0
174448bb5cfSPhilip Reames  br i1 %cmp4, label %for.body, label %for.end
175448bb5cfSPhilip Reames
176448bb5cfSPhilip Reamesfor.body:                                         ; preds = %entry, %for.body
177448bb5cfSPhilip Reames  %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
178448bb5cfSPhilip Reames  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
179448bb5cfSPhilip Reames  %0 = load <vscale x 4 x i32>, ptr %arrayidx, align 4
180448bb5cfSPhilip Reames  %inc = add nsw <vscale x 4 x i32> %0, splat (i32 1)
181448bb5cfSPhilip Reames  store <vscale x 4 x i32> %inc, ptr %arrayidx, align 4
182448bb5cfSPhilip Reames  %add = add nsw i32 %i.05, %VF
183448bb5cfSPhilip Reames  %cmp = icmp slt i32 %add, %n
184448bb5cfSPhilip Reames  br i1 %cmp, label %for.body, label %for.end
185448bb5cfSPhilip Reames
186448bb5cfSPhilip Reamesfor.end:                                          ; preds = %for.body, %entry
187448bb5cfSPhilip Reames  ret void
188448bb5cfSPhilip Reames}
189448bb5cfSPhilip Reames
190448bb5cfSPhilip Reamesdefine void @vscalex4_ult(ptr nocapture %A, i32 %n) mustprogress vscale_range(2,1024) {
191448bb5cfSPhilip Reames; CHECK-LABEL: 'vscalex4_ult'
192448bb5cfSPhilip Reames; CHECK-NEXT:  Classifying expressions for: @vscalex4_ult
193448bb5cfSPhilip Reames; CHECK-NEXT:    %vscale = call i32 @llvm.vscale.i32()
194448bb5cfSPhilip Reames; CHECK-NEXT:    --> vscale U: [2,1025) S: [2,1025)
195448bb5cfSPhilip Reames; CHECK-NEXT:    %VF = mul i32 %vscale, 4
196448bb5cfSPhilip Reames; CHECK-NEXT:    --> (4 * vscale)<nuw><nsw> U: [8,4097) S: [8,4097)
197448bb5cfSPhilip Reames; CHECK-NEXT:    %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
198448bb5cfSPhilip Reames; CHECK-NEXT:    --> {0,+,(4 * vscale)<nuw><nsw>}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,2147483645) Exits: (4 * vscale * ((-1 + %n) /u (4 * vscale)<nuw><nsw>)) LoopDispositions: { %for.body: Computable }
199448bb5cfSPhilip Reames; CHECK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
200448bb5cfSPhilip Reames; CHECK-NEXT:    --> {%A,+,(16 * vscale)<nuw><nsw>}<nuw><%for.body> U: full-set S: full-set Exits: ((16 * vscale * ((-1 + %n) /u (4 * vscale)<nuw><nsw>)) + %A) LoopDispositions: { %for.body: Computable }
201448bb5cfSPhilip Reames; CHECK-NEXT:    %add = add nsw i32 %i.05, %VF
202448bb5cfSPhilip Reames; CHECK-NEXT:    --> {(4 * vscale)<nuw><nsw>,+,(4 * vscale)<nuw><nsw>}<nuw><nsw><%for.body> U: [8,-2147483648) S: [8,2147483645) Exits: (vscale * (4 + (4 * ((-1 + %n) /u (4 * vscale)<nuw><nsw>))<nuw><nsw>)<nuw>) LoopDispositions: { %for.body: Computable }
203448bb5cfSPhilip Reames; CHECK-NEXT:  Determining loop execution counts for: @vscalex4_ult
204448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: backedge-taken count is ((-1 + %n) /u (4 * vscale)<nuw><nsw>)
205448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 536870910
206448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is ((-1 + %n) /u (4 * vscale)<nuw><nsw>)
207448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: Trip multiple is 1
208448bb5cfSPhilip Reames;
209448bb5cfSPhilip Reamesentry:
210448bb5cfSPhilip Reames  %vscale = call i32 @llvm.vscale.i32()
211448bb5cfSPhilip Reames  %VF = mul i32 %vscale, 4
212448bb5cfSPhilip Reames  %cmp4 = icmp sgt i32 %n, 0
213448bb5cfSPhilip Reames  br i1 %cmp4, label %for.body, label %for.end
214448bb5cfSPhilip Reames
215448bb5cfSPhilip Reamesfor.body:                                         ; preds = %entry, %for.body
216448bb5cfSPhilip Reames  %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
217448bb5cfSPhilip Reames  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
218448bb5cfSPhilip Reames  %0 = load <vscale x 4 x i32>, ptr %arrayidx, align 4
219448bb5cfSPhilip Reames  %inc = add nsw <vscale x 4 x i32> %0, splat (i32 1)
220448bb5cfSPhilip Reames  store <vscale x 4 x i32> %inc, ptr %arrayidx, align 4
221448bb5cfSPhilip Reames  %add = add nsw i32 %i.05, %VF
222448bb5cfSPhilip Reames  %cmp = icmp ult i32 %add, %n
223448bb5cfSPhilip Reames  br i1 %cmp, label %for.body, label %for.end
224448bb5cfSPhilip Reames
225448bb5cfSPhilip Reamesfor.end:                                          ; preds = %for.body, %entry
226448bb5cfSPhilip Reames  ret void
227448bb5cfSPhilip Reames}
228448bb5cfSPhilip Reames
229448bb5cfSPhilip Reames
230448bb5cfSPhilip Reamesdefine void @vscale_slt_with_vp_plain(ptr nocapture %A, i32 %n) mustprogress vscale_range(2,1024) {
231448bb5cfSPhilip Reames; CHECK-LABEL: 'vscale_slt_with_vp_plain'
232448bb5cfSPhilip Reames; CHECK-NEXT:  Classifying expressions for: @vscale_slt_with_vp_plain
233448bb5cfSPhilip Reames; CHECK-NEXT:    %vscale = call i32 @llvm.vscale.i32()
234448bb5cfSPhilip Reames; CHECK-NEXT:    --> vscale U: [2,1025) S: [2,1025)
235448bb5cfSPhilip Reames; CHECK-NEXT:    %VF = mul i32 %vscale, 4
236448bb5cfSPhilip Reames; CHECK-NEXT:    --> (4 * vscale)<nuw><nsw> U: [8,4097) S: [8,4097)
237448bb5cfSPhilip Reames; CHECK-NEXT:    %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
238448bb5cfSPhilip Reames; CHECK-NEXT:    --> {0,+,(4 * vscale)<nuw><nsw>}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,2147483645) Exits: (4 * vscale * ((-1 + %n) /u (4 * vscale)<nuw><nsw>)) LoopDispositions: { %for.body: Computable }
239448bb5cfSPhilip Reames; CHECK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
240448bb5cfSPhilip Reames; CHECK-NEXT:    --> {%A,+,(16 * vscale)<nuw><nsw>}<%for.body> U: full-set S: full-set Exits: ((16 * vscale * ((-1 + %n) /u (4 * vscale)<nuw><nsw>)) + %A) LoopDispositions: { %for.body: Computable }
241448bb5cfSPhilip Reames; CHECK-NEXT:    %add = add nsw i32 %i.05, %VF
242448bb5cfSPhilip Reames; CHECK-NEXT:    --> {(4 * vscale)<nuw><nsw>,+,(4 * vscale)<nuw><nsw>}<nuw><nsw><%for.body> U: [8,-2147483648) S: [8,2147483645) Exits: (vscale * (4 + (4 * ((-1 + %n) /u (4 * vscale)<nuw><nsw>))<nuw><nsw>)<nuw>) LoopDispositions: { %for.body: Computable }
243448bb5cfSPhilip Reames; CHECK-NEXT:  Determining loop execution counts for: @vscale_slt_with_vp_plain
244448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: backedge-taken count is ((-1 + %n) /u (4 * vscale)<nuw><nsw>)
245448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 268435454
246448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is ((-1 + %n) /u (4 * vscale)<nuw><nsw>)
247448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: Trip multiple is 1
248448bb5cfSPhilip Reames;
249448bb5cfSPhilip Reamesentry:
250448bb5cfSPhilip Reames  %vscale = call i32 @llvm.vscale.i32()
251448bb5cfSPhilip Reames  %VF = mul i32 %vscale, 4
252448bb5cfSPhilip Reames  %cmp4 = icmp sgt i32 %n, 0
253448bb5cfSPhilip Reames  br i1 %cmp4, label %for.body, label %for.end
254448bb5cfSPhilip Reames
255448bb5cfSPhilip Reamesfor.body:                                         ; preds = %entry, %for.body
256448bb5cfSPhilip Reames  %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
257448bb5cfSPhilip Reames  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
258448bb5cfSPhilip Reames
259448bb5cfSPhilip Reames  %0 = call <vscale x 4 x i32> @llvm.vp.load.nxv4i32.p0(ptr align 4 %arrayidx, <vscale x 4 x i1> splat (i1 true), i32 %VF)
260448bb5cfSPhilip Reames  %inc = add nsw <vscale x 4 x i32> %0, splat (i32 1)
261448bb5cfSPhilip Reames  call void @llvm.vp.store.nxv4i32.p0(<vscale x 4 x i32> %inc, ptr align 4 %arrayidx, <vscale x 4 x i1> splat (i1 true), i32 %VF)
262448bb5cfSPhilip Reames
263448bb5cfSPhilip Reames  %add = add nsw i32 %i.05, %VF
264448bb5cfSPhilip Reames  %cmp = icmp slt i32 %add, %n
265448bb5cfSPhilip Reames  br i1 %cmp, label %for.body, label %for.end
266448bb5cfSPhilip Reames
267448bb5cfSPhilip Reamesfor.end:                                          ; preds = %for.body, %entry
268448bb5cfSPhilip Reames  ret void
269448bb5cfSPhilip Reames}
270448bb5cfSPhilip Reames
271448bb5cfSPhilip Reamesdefine void @vscale_slt_with_vp_umin(ptr nocapture %A, i32 %n) mustprogress vscale_range(2,1024) {
272448bb5cfSPhilip Reames; CHECK-LABEL: 'vscale_slt_with_vp_umin'
273448bb5cfSPhilip Reames; CHECK-NEXT:  Classifying expressions for: @vscale_slt_with_vp_umin
274448bb5cfSPhilip Reames; CHECK-NEXT:    %vscale = call i32 @llvm.vscale.i32()
275448bb5cfSPhilip Reames; CHECK-NEXT:    --> vscale U: [2,1025) S: [2,1025)
276448bb5cfSPhilip Reames; CHECK-NEXT:    %VF = mul i32 %vscale, 4
277448bb5cfSPhilip Reames; CHECK-NEXT:    --> (4 * vscale)<nuw><nsw> U: [8,4097) S: [8,4097)
278448bb5cfSPhilip Reames; CHECK-NEXT:    %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
279448bb5cfSPhilip Reames; CHECK-NEXT:    --> {0,+,(4 * vscale)<nuw><nsw>}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,2147483645) Exits: (4 * vscale * ((-1 + %n) /u (4 * vscale)<nuw><nsw>)) LoopDispositions: { %for.body: Computable }
280448bb5cfSPhilip Reames; CHECK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
281448bb5cfSPhilip Reames; CHECK-NEXT:    --> {%A,+,(16 * vscale)<nuw><nsw>}<%for.body> U: full-set S: full-set Exits: ((16 * vscale * ((-1 + %n) /u (4 * vscale)<nuw><nsw>)) + %A) LoopDispositions: { %for.body: Computable }
282448bb5cfSPhilip Reames; CHECK-NEXT:    %left = sub i32 %n, %i.05
283448bb5cfSPhilip Reames; CHECK-NEXT:    --> {%n,+,(-4 * vscale)<nsw>}<nw><%for.body> U: full-set S: full-set Exits: ((-4 * vscale * ((-1 + %n) /u (4 * vscale)<nuw><nsw>)) + %n) LoopDispositions: { %for.body: Computable }
284448bb5cfSPhilip Reames; CHECK-NEXT:    %VF.capped = call i32 @llvm.umin.i32(i32 %VF, i32 %left)
285448bb5cfSPhilip Reames; CHECK-NEXT:    --> ((4 * vscale)<nuw><nsw> umin {%n,+,(-4 * vscale)<nsw>}<nw><%for.body>) U: [0,4097) S: [0,4097) Exits: (((-4 * vscale * ((-1 + %n) /u (4 * vscale)<nuw><nsw>)) + %n) umin (4 * vscale)<nuw><nsw>) LoopDispositions: { %for.body: Computable }
286448bb5cfSPhilip Reames; CHECK-NEXT:    %add = add nsw i32 %i.05, %VF
287448bb5cfSPhilip Reames; CHECK-NEXT:    --> {(4 * vscale)<nuw><nsw>,+,(4 * vscale)<nuw><nsw>}<nuw><nsw><%for.body> U: [8,-2147483648) S: [8,2147483645) Exits: (vscale * (4 + (4 * ((-1 + %n) /u (4 * vscale)<nuw><nsw>))<nuw><nsw>)<nuw>) LoopDispositions: { %for.body: Computable }
288448bb5cfSPhilip Reames; CHECK-NEXT:  Determining loop execution counts for: @vscale_slt_with_vp_umin
289448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: backedge-taken count is ((-1 + %n) /u (4 * vscale)<nuw><nsw>)
290448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 268435454
291448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is ((-1 + %n) /u (4 * vscale)<nuw><nsw>)
292448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: Trip multiple is 1
293448bb5cfSPhilip Reames;
294448bb5cfSPhilip Reamesentry:
295448bb5cfSPhilip Reames  %vscale = call i32 @llvm.vscale.i32()
296448bb5cfSPhilip Reames  %VF = mul i32 %vscale, 4
297448bb5cfSPhilip Reames  %cmp4 = icmp sgt i32 %n, 0
298448bb5cfSPhilip Reames  br i1 %cmp4, label %for.body, label %for.end
299448bb5cfSPhilip Reames
300448bb5cfSPhilip Reamesfor.body:                                         ; preds = %entry, %for.body
301448bb5cfSPhilip Reames  %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
302448bb5cfSPhilip Reames  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
303448bb5cfSPhilip Reames
304448bb5cfSPhilip Reames  %left = sub i32 %n, %i.05
305448bb5cfSPhilip Reames  %VF.capped = call i32 @llvm.umin(i32 %VF, i32 %left)
306448bb5cfSPhilip Reames
307448bb5cfSPhilip Reames  %0 = call <vscale x 4 x i32> @llvm.vp.load.nxv4i32.p0(ptr align 4 %arrayidx, <vscale x 4 x i1> splat (i1 true), i32 %VF.capped)
308448bb5cfSPhilip Reames  %inc = add nsw <vscale x 4 x i32> %0, splat (i32 1)
309448bb5cfSPhilip Reames  call void @llvm.vp.store.nxv4i32.p0(<vscale x 4 x i32> %inc, ptr align 4 %arrayidx, <vscale x 4 x i1> splat (i1 true), i32 %VF.capped)
310448bb5cfSPhilip Reames
311448bb5cfSPhilip Reames  %add = add nsw i32 %i.05, %VF
312448bb5cfSPhilip Reames  %cmp = icmp slt i32 %add, %n
313448bb5cfSPhilip Reames  br i1 %cmp, label %for.body, label %for.end
314448bb5cfSPhilip Reames
315448bb5cfSPhilip Reamesfor.end:                                          ; preds = %for.body, %entry
316448bb5cfSPhilip Reames  ret void
317448bb5cfSPhilip Reames}
318448bb5cfSPhilip Reames
319448bb5cfSPhilip Reamesdefine void @vscale_slt_with_vp_umin2(ptr nocapture %A, i32 %n) mustprogress vscale_range(2,1024) {
320448bb5cfSPhilip Reames; CHECK-LABEL: 'vscale_slt_with_vp_umin2'
321448bb5cfSPhilip Reames; CHECK-NEXT:  Classifying expressions for: @vscale_slt_with_vp_umin2
322448bb5cfSPhilip Reames; CHECK-NEXT:    %vscale = call i32 @llvm.vscale.i32()
323448bb5cfSPhilip Reames; CHECK-NEXT:    --> vscale U: [2,1025) S: [2,1025)
324448bb5cfSPhilip Reames; CHECK-NEXT:    %VF = mul i32 %vscale, 4
325448bb5cfSPhilip Reames; CHECK-NEXT:    --> (4 * vscale)<nuw><nsw> U: [8,4097) S: [8,4097)
326448bb5cfSPhilip Reames; CHECK-NEXT:    %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
327448bb5cfSPhilip Reames; CHECK-NEXT:    --> %i.05 U: [0,-2147483648) S: [0,-2147483648) Exits: <<Unknown>> LoopDispositions: { %for.body: Variant }
328448bb5cfSPhilip Reames; CHECK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
329448bb5cfSPhilip Reames; CHECK-NEXT:    --> ((4 * %i.05) + %A) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %for.body: Variant }
330448bb5cfSPhilip Reames; CHECK-NEXT:    %left = sub i32 %n, %i.05
331448bb5cfSPhilip Reames; CHECK-NEXT:    --> ((-1 * %i.05)<nsw> + %n) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %for.body: Variant }
332448bb5cfSPhilip Reames; CHECK-NEXT:    %VF.capped = call i32 @llvm.umin.i32(i32 %VF, i32 %left)
333448bb5cfSPhilip Reames; CHECK-NEXT:    --> (((-1 * %i.05)<nsw> + %n) umin (4 * vscale)<nuw><nsw>) U: [0,4097) S: [0,4097) Exits: <<Unknown>> LoopDispositions: { %for.body: Variant }
334448bb5cfSPhilip Reames; CHECK-NEXT:    %add = add nsw i32 %i.05, %VF.capped
335448bb5cfSPhilip Reames; CHECK-NEXT:    --> ((((-1 * %i.05)<nsw> + %n) umin (4 * vscale)<nuw><nsw>) + %i.05)<nuw><nsw> U: [0,-2147483648) S: [0,-2147483648) Exits: <<Unknown>> LoopDispositions: { %for.body: Variant }
336448bb5cfSPhilip Reames; CHECK-NEXT:  Determining loop execution counts for: @vscale_slt_with_vp_umin2
337448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: Unpredictable backedge-taken count.
338448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: Unpredictable constant max backedge-taken count.
339448bb5cfSPhilip Reames; CHECK-NEXT:  Loop %for.body: Unpredictable symbolic max backedge-taken count.
340448bb5cfSPhilip Reames;
341448bb5cfSPhilip Reamesentry:
342448bb5cfSPhilip Reames  %vscale = call i32 @llvm.vscale.i32()
343448bb5cfSPhilip Reames  %VF = mul i32 %vscale, 4
344448bb5cfSPhilip Reames  %cmp4 = icmp sgt i32 %n, 0
345448bb5cfSPhilip Reames  br i1 %cmp4, label %for.body, label %for.end
346448bb5cfSPhilip Reames
347448bb5cfSPhilip Reamesfor.body:                                         ; preds = %entry, %for.body
348448bb5cfSPhilip Reames  %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
349448bb5cfSPhilip Reames  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
350448bb5cfSPhilip Reames
351448bb5cfSPhilip Reames  %left = sub i32 %n, %i.05
352448bb5cfSPhilip Reames  %VF.capped = call i32 @llvm.umin(i32 %VF, i32 %left)
353448bb5cfSPhilip Reames
354448bb5cfSPhilip Reames  %0 = call <vscale x 4 x i32> @llvm.vp.load.nxv4i32.p0(ptr align 4 %arrayidx, <vscale x 4 x i1> splat (i1 true), i32 %VF.capped)
355448bb5cfSPhilip Reames  %inc = add nsw <vscale x 4 x i32> %0, splat (i32 1)
356448bb5cfSPhilip Reames  call void @llvm.vp.store.nxv4i32.p0(<vscale x 4 x i32> %inc, ptr align 4 %arrayidx, <vscale x 4 x i1> splat (i1 true), i32 %VF.capped)
357448bb5cfSPhilip Reames
358448bb5cfSPhilip Reames  %add = add nsw i32 %i.05, %VF.capped
359448bb5cfSPhilip Reames  %cmp = icmp slt i32 %add, %n
360448bb5cfSPhilip Reames  br i1 %cmp, label %for.body, label %for.end
361448bb5cfSPhilip Reames
362448bb5cfSPhilip Reamesfor.end:                                          ; preds = %for.body, %entry
363448bb5cfSPhilip Reames  ret void
364448bb5cfSPhilip Reames}
365faf33335SPhilip Reames
366faf33335SPhilip Reames; The next two cases check to see if we can infer the flags on the IV
3677583c484SPhilip Reames; of a countup loop using vscale strides.  vscale is a power of two
3687583c484SPhilip Reames; and these are finite loops by assumption.
369faf33335SPhilip Reames
370faf33335SPhilip Reamesdefine void @vscale_slt_noflags(ptr nocapture %A, i32 %n) mustprogress vscale_range(2,1024) {
371faf33335SPhilip Reames; CHECK-LABEL: 'vscale_slt_noflags'
372faf33335SPhilip Reames; CHECK-NEXT:  Classifying expressions for: @vscale_slt_noflags
373faf33335SPhilip Reames; CHECK-NEXT:    %vscale = call i32 @llvm.vscale.i32()
374faf33335SPhilip Reames; CHECK-NEXT:    --> vscale U: [2,1025) S: [2,1025)
375faf33335SPhilip Reames; CHECK-NEXT:    %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
3767583c484SPhilip Reames; CHECK-NEXT:    --> {0,+,vscale}<%for.body> U: full-set S: full-set Exits: (vscale * ((-1 + %n) /u vscale))<nuw> LoopDispositions: { %for.body: Computable }
377faf33335SPhilip Reames; CHECK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
3787583c484SPhilip Reames; CHECK-NEXT:    --> {%A,+,(4 * vscale)<nuw><nsw>}<%for.body> U: full-set S: full-set Exits: ((4 * vscale * ((-1 + %n) /u vscale)) + %A) LoopDispositions: { %for.body: Computable }
379faf33335SPhilip Reames; CHECK-NEXT:    %add = add i32 %i.05, %vscale
380*b812e57aSPhilip Reames; CHECK-NEXT:    --> {vscale,+,vscale}<nuw><nsw><%for.body> U: [2,-2147483648) S: [2,-2147483648) Exits: (vscale * (1 + ((-1 + %n) /u vscale))<nuw>) LoopDispositions: { %for.body: Computable }
381faf33335SPhilip Reames; CHECK-NEXT:  Determining loop execution counts for: @vscale_slt_noflags
3827583c484SPhilip Reames; CHECK-NEXT:  Loop %for.body: backedge-taken count is ((-1 + %n) /u vscale)
3837583c484SPhilip Reames; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 1073741822
3847583c484SPhilip Reames; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is ((-1 + %n) /u vscale)
3857583c484SPhilip Reames; CHECK-NEXT:  Loop %for.body: Trip multiple is 1
386faf33335SPhilip Reames;
387faf33335SPhilip Reamesentry:
388faf33335SPhilip Reames  %vscale = call i32 @llvm.vscale.i32()
389faf33335SPhilip Reames  %cmp4 = icmp sgt i32 %n, 0
390faf33335SPhilip Reames  br i1 %cmp4, label %for.body, label %for.end
391faf33335SPhilip Reames
392faf33335SPhilip Reamesfor.body:                                         ; preds = %entry, %for.body
393faf33335SPhilip Reames  %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
394faf33335SPhilip Reames  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
395faf33335SPhilip Reames  %0 = load <vscale x 4 x i32>, ptr %arrayidx, align 4
396faf33335SPhilip Reames  %inc = add nsw <vscale x 4 x i32> %0, splat (i32 1)
397faf33335SPhilip Reames  store <vscale x 4 x i32> %inc, ptr %arrayidx, align 4
398faf33335SPhilip Reames  %add = add i32 %i.05, %vscale
399faf33335SPhilip Reames  %cmp = icmp slt i32 %add, %n
400faf33335SPhilip Reames  br i1 %cmp, label %for.body, label %for.end
401faf33335SPhilip Reames
402faf33335SPhilip Reamesfor.end:                                          ; preds = %for.body, %entry
403faf33335SPhilip Reames  ret void
404faf33335SPhilip Reames}
405faf33335SPhilip Reames
406faf33335SPhilip Reamesdefine void @vscalex4_ult_noflags(ptr nocapture %A, i32 %n) mustprogress vscale_range(2,1024) {
407faf33335SPhilip Reames; CHECK-LABEL: 'vscalex4_ult_noflags'
408faf33335SPhilip Reames; CHECK-NEXT:  Classifying expressions for: @vscalex4_ult_noflags
409faf33335SPhilip Reames; CHECK-NEXT:    %vscale = call i32 @llvm.vscale.i32()
410faf33335SPhilip Reames; CHECK-NEXT:    --> vscale U: [2,1025) S: [2,1025)
411faf33335SPhilip Reames; CHECK-NEXT:    %VF = mul i32 %vscale, 4
412faf33335SPhilip Reames; CHECK-NEXT:    --> (4 * vscale)<nuw><nsw> U: [8,4097) S: [8,4097)
413faf33335SPhilip Reames; CHECK-NEXT:    %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
4147583c484SPhilip Reames; CHECK-NEXT:    --> {0,+,(4 * vscale)<nuw><nsw>}<%for.body> U: [0,-3) S: [-2147483648,2147483645) Exits: (4 * vscale * ((-1 + %n) /u (4 * vscale)<nuw><nsw>)) LoopDispositions: { %for.body: Computable }
415faf33335SPhilip Reames; CHECK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
4167583c484SPhilip Reames; CHECK-NEXT:    --> {%A,+,(16 * vscale)<nuw><nsw>}<%for.body> U: full-set S: full-set Exits: ((16 * vscale * ((-1 + %n) /u (4 * vscale)<nuw><nsw>)) + %A) LoopDispositions: { %for.body: Computable }
417faf33335SPhilip Reames; CHECK-NEXT:    %add = add i32 %i.05, %VF
418*b812e57aSPhilip Reames; CHECK-NEXT:    --> {(4 * vscale)<nuw><nsw>,+,(4 * vscale)<nuw><nsw>}<nuw><%for.body> U: [8,-3) S: [-2147483648,2147483645) Exits: (vscale * (4 + (4 * ((-1 + %n) /u (4 * vscale)<nuw><nsw>))<nuw><nsw>)<nuw>) LoopDispositions: { %for.body: Computable }
419faf33335SPhilip Reames; CHECK-NEXT:  Determining loop execution counts for: @vscalex4_ult_noflags
4207583c484SPhilip Reames; CHECK-NEXT:  Loop %for.body: backedge-taken count is ((-1 + %n) /u (4 * vscale)<nuw><nsw>)
4217583c484SPhilip Reames; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 536870910
4227583c484SPhilip Reames; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is ((-1 + %n) /u (4 * vscale)<nuw><nsw>)
4237583c484SPhilip Reames; CHECK-NEXT:  Loop %for.body: Trip multiple is 1
424faf33335SPhilip Reames;
425faf33335SPhilip Reamesentry:
426faf33335SPhilip Reames  %vscale = call i32 @llvm.vscale.i32()
427faf33335SPhilip Reames  %VF = mul i32 %vscale, 4
428faf33335SPhilip Reames  %cmp4 = icmp sgt i32 %n, 0
429faf33335SPhilip Reames  br i1 %cmp4, label %for.body, label %for.end
430faf33335SPhilip Reames
431faf33335SPhilip Reamesfor.body:                                         ; preds = %entry, %for.body
432faf33335SPhilip Reames  %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]
433faf33335SPhilip Reames  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05
434faf33335SPhilip Reames  %0 = load <vscale x 4 x i32>, ptr %arrayidx, align 4
435faf33335SPhilip Reames  %inc = add nsw <vscale x 4 x i32> %0, splat (i32 1)
436faf33335SPhilip Reames  store <vscale x 4 x i32> %inc, ptr %arrayidx, align 4
437faf33335SPhilip Reames  %add = add i32 %i.05, %VF
438faf33335SPhilip Reames  %cmp = icmp ult i32 %add, %n
439faf33335SPhilip Reames  br i1 %cmp, label %for.body, label %for.end
440faf33335SPhilip Reames
441faf33335SPhilip Reamesfor.end:                                          ; preds = %for.body, %entry
442faf33335SPhilip Reames  ret void
443faf33335SPhilip Reames}
444faf33335SPhilip Reames
445faf33335SPhilip Reames; The next two cases check to see if we can infer the flags on the IV
446faf33335SPhilip Reames; of a countdown loop using vscale strides.
447faf33335SPhilip Reames
448faf33335SPhilip Reamesdefine void @vscale_countdown_ne(ptr nocapture %A, i32 %n) mustprogress vscale_range(2,1024) {
449faf33335SPhilip Reames; CHECK-LABEL: 'vscale_countdown_ne'
450faf33335SPhilip Reames; CHECK-NEXT:  Classifying expressions for: @vscale_countdown_ne
451faf33335SPhilip Reames; CHECK-NEXT:    %vscale = call i32 @llvm.vscale.i32()
452faf33335SPhilip Reames; CHECK-NEXT:    --> vscale U: [2,1025) S: [2,1025)
453faf33335SPhilip Reames; CHECK-NEXT:    %start = sub i32 %n, %vscale
454faf33335SPhilip Reames; CHECK-NEXT:    --> ((-1 * vscale)<nsw> + %n) U: full-set S: full-set
455faf33335SPhilip Reames; CHECK-NEXT:    %iv = phi i32 [ %sub, %for.body ], [ %start, %entry ]
456f0944f4bSPhilip Reames; CHECK-NEXT:    --> {((-1 * vscale)<nsw> + %n),+,(-1 * vscale)<nsw>}<%for.body> U: full-set S: full-set Exits: ((vscale * (-1 + (-1 * (((-2 * vscale)<nsw> + %n) /u vscale))<nsw>)<nsw>) + %n) LoopDispositions: { %for.body: Computable }
457faf33335SPhilip Reames; CHECK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %A, i32 %iv
458f0944f4bSPhilip Reames; CHECK-NEXT:    --> {((4 * %n) + (-4 * vscale)<nsw> + %A),+,(-4 * vscale)<nsw>}<%for.body> U: full-set S: full-set Exits: ((4 * %n) + (vscale * (-4 + (-4 * (((-2 * vscale)<nsw> + %n) /u vscale)))) + %A) LoopDispositions: { %for.body: Computable }
459faf33335SPhilip Reames; CHECK-NEXT:    %sub = sub i32 %iv, %vscale
460f0944f4bSPhilip Reames; CHECK-NEXT:    --> {((-2 * vscale)<nsw> + %n),+,(-1 * vscale)<nsw>}<nw><%for.body> U: full-set S: full-set Exits: ((vscale * (-2 + (-1 * (((-2 * vscale)<nsw> + %n) /u vscale))<nsw>)) + %n) LoopDispositions: { %for.body: Computable }
461faf33335SPhilip Reames; CHECK-NEXT:  Determining loop execution counts for: @vscale_countdown_ne
462f0944f4bSPhilip Reames; CHECK-NEXT:  Loop %for.body: backedge-taken count is (((-2 * vscale)<nsw> + %n) /u vscale)
463f0944f4bSPhilip Reames; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 2147483647
464f0944f4bSPhilip Reames; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (((-2 * vscale)<nsw> + %n) /u vscale)
465f0944f4bSPhilip Reames; CHECK-NEXT:  Loop %for.body: Trip multiple is 1
466faf33335SPhilip Reames;
467faf33335SPhilip Reamesentry:
468faf33335SPhilip Reames  %vscale = call i32 @llvm.vscale.i32()
469faf33335SPhilip Reames  %cmp4 = icmp sgt i32 %n, 0
470faf33335SPhilip Reames  %start = sub i32 %n, %vscale
471faf33335SPhilip Reames  br i1 %cmp4, label %for.body, label %for.end
472faf33335SPhilip Reames
473faf33335SPhilip Reamesfor.body:                                         ; preds = %entry, %for.body
474faf33335SPhilip Reames  %iv = phi i32 [ %sub, %for.body ], [ %start, %entry ]
475faf33335SPhilip Reames  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %iv
476faf33335SPhilip Reames  %ld = load <vscale x 4 x i32>, ptr %arrayidx, align 4
477faf33335SPhilip Reames  %inc = add nsw <vscale x 4 x i32> %ld, splat (i32 1)
478faf33335SPhilip Reames  store <vscale x 4 x i32> %inc, ptr %arrayidx, align 4
479faf33335SPhilip Reames  %sub = sub i32 %iv, %vscale
480faf33335SPhilip Reames  %cmp = icmp ne i32 %sub, 0
481faf33335SPhilip Reames  br i1 %cmp, label %for.body, label %for.end
482faf33335SPhilip Reames
483faf33335SPhilip Reamesfor.end:                                          ; preds = %for.body, %entry
484faf33335SPhilip Reames  ret void
485faf33335SPhilip Reames}
486faf33335SPhilip Reames
487faf33335SPhilip Reamesdefine void @vscalex4_countdown_ne(ptr nocapture %A, i32 %n) mustprogress vscale_range(2,1024) {
488faf33335SPhilip Reames; CHECK-LABEL: 'vscalex4_countdown_ne'
489faf33335SPhilip Reames; CHECK-NEXT:  Classifying expressions for: @vscalex4_countdown_ne
490faf33335SPhilip Reames; CHECK-NEXT:    %vscale = call i32 @llvm.vscale.i32()
491faf33335SPhilip Reames; CHECK-NEXT:    --> vscale U: [2,1025) S: [2,1025)
492faf33335SPhilip Reames; CHECK-NEXT:    %VF = shl i32 %vscale, 2
493faf33335SPhilip Reames; CHECK-NEXT:    --> (4 * vscale)<nuw><nsw> U: [8,4097) S: [8,4097)
494faf33335SPhilip Reames; CHECK-NEXT:    %start = sub i32 %n, %VF
495faf33335SPhilip Reames; CHECK-NEXT:    --> ((-4 * vscale)<nsw> + %n) U: full-set S: full-set
496faf33335SPhilip Reames; CHECK-NEXT:    %iv = phi i32 [ %sub, %for.body ], [ %start, %entry ]
497f0944f4bSPhilip Reames; CHECK-NEXT:    --> {((-4 * vscale)<nsw> + %n),+,(-4 * vscale)<nsw>}<%for.body> U: full-set S: full-set Exits: ((vscale * (-4 + (-4 * (((-8 * vscale)<nsw> + %n) /u (4 * vscale)<nuw><nsw>))<nsw>)<nsw>) + %n) LoopDispositions: { %for.body: Computable }
498faf33335SPhilip Reames; CHECK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %A, i32 %iv
499f0944f4bSPhilip Reames; CHECK-NEXT:    --> {((4 * %n) + (-16 * vscale)<nsw> + %A),+,(-16 * vscale)<nsw>}<%for.body> U: full-set S: full-set Exits: ((4 * %n) + (vscale * (-16 + (-16 * (((-8 * vscale)<nsw> + %n) /u (4 * vscale)<nuw><nsw>)))) + %A) LoopDispositions: { %for.body: Computable }
500faf33335SPhilip Reames; CHECK-NEXT:    %sub = sub i32 %iv, %VF
501f0944f4bSPhilip Reames; CHECK-NEXT:    --> {((-8 * vscale)<nsw> + %n),+,(-4 * vscale)<nsw>}<nw><%for.body> U: full-set S: full-set Exits: ((vscale * (-8 + (-4 * (((-8 * vscale)<nsw> + %n) /u (4 * vscale)<nuw><nsw>))<nsw>)) + %n) LoopDispositions: { %for.body: Computable }
502faf33335SPhilip Reames; CHECK-NEXT:  Determining loop execution counts for: @vscalex4_countdown_ne
503f0944f4bSPhilip Reames; CHECK-NEXT:  Loop %for.body: backedge-taken count is (((-8 * vscale)<nsw> + %n) /u (4 * vscale)<nuw><nsw>)
504f0944f4bSPhilip Reames; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 536870911
505f0944f4bSPhilip Reames; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (((-8 * vscale)<nsw> + %n) /u (4 * vscale)<nuw><nsw>)
506f0944f4bSPhilip Reames; CHECK-NEXT:  Loop %for.body: Trip multiple is 1
507faf33335SPhilip Reames;
508faf33335SPhilip Reamesentry:
509faf33335SPhilip Reames  %vscale = call i32 @llvm.vscale.i32()
510faf33335SPhilip Reames  %VF = shl i32 %vscale, 2
511faf33335SPhilip Reames  %cmp4 = icmp sgt i32 %n, 0
512faf33335SPhilip Reames  %start = sub i32 %n, %VF
513faf33335SPhilip Reames  br i1 %cmp4, label %for.body, label %for.end
514faf33335SPhilip Reames
515faf33335SPhilip Reamesfor.body:                                         ; preds = %entry, %for.body
516faf33335SPhilip Reames  %iv = phi i32 [ %sub, %for.body ], [ %start, %entry ]
517faf33335SPhilip Reames  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %iv
518faf33335SPhilip Reames  %ld = load <vscale x 4 x i32>, ptr %arrayidx, align 4
519faf33335SPhilip Reames  %inc = add nsw <vscale x 4 x i32> %ld, splat (i32 1)
520faf33335SPhilip Reames  store <vscale x 4 x i32> %inc, ptr %arrayidx, align 4
521faf33335SPhilip Reames  %sub = sub i32 %iv, %VF
522faf33335SPhilip Reames  %cmp = icmp ne i32 %sub, 0
523faf33335SPhilip Reames  br i1 %cmp, label %for.body, label %for.end
524faf33335SPhilip Reames
525faf33335SPhilip Reamesfor.end:                                          ; preds = %for.body, %entry
526faf33335SPhilip Reames  ret void
527faf33335SPhilip Reames}
528