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