diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 937b5aa77d467..083988f948069 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -11111,13 +11111,13 @@ bool ScalarEvolution::isKnownNonZero(const SCEV *S) { bool ScalarEvolution::isKnownToBeAPowerOfTwo(const SCEV *S, bool OrZero, bool OrNegative) { - auto NonRecursive = [this, OrNegative](const SCEV *S) { + auto NonRecursive = [OrNegative](const SCEV *S) { if (auto *C = dyn_cast(S)) return C->getAPInt().isPowerOf2() || (OrNegative && C->getAPInt().isNegatedPowerOf2()); - // The vscale_range indicates vscale is a power-of-two. - return isa(S) && F.hasFnAttribute(Attribute::VScaleRange); + // vscale is a power-of-two. + return isa(S); }; if (NonRecursive(S)) diff --git a/llvm/test/Analysis/ScalarEvolution/trip-count-scalable-stride.ll b/llvm/test/Analysis/ScalarEvolution/trip-count-scalable-stride.ll index 30a095fd144fa..8ba8bde322d44 100644 --- a/llvm/test/Analysis/ScalarEvolution/trip-count-scalable-stride.ll +++ b/llvm/test/Analysis/ScalarEvolution/trip-count-scalable-stride.ll @@ -525,3 +525,37 @@ for.body: ; preds = %entry, %for.body for.end: ; preds = %for.body, %entry ret void } + +define void @vscale_ult_no_vscale_range(ptr nocapture %A) mustprogress { +; CHECK-LABEL: 'vscale_ult_no_vscale_range' +; CHECK-NEXT: Classifying expressions for: @vscale_ult_no_vscale_range +; CHECK-NEXT: %vscale = call i32 @llvm.vscale.i32() +; CHECK-NEXT: --> vscale U: [1,0) S: [1,0) +; CHECK-NEXT: %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ] +; CHECK-NEXT: --> {0,+,vscale}<%for.body> U: full-set S: full-set Exits: <> LoopDispositions: { %for.body: Computable } +; CHECK-NEXT: %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05 +; CHECK-NEXT: --> {%A,+,(4 * vscale)}<%for.body> U: full-set S: full-set Exits: <> LoopDispositions: { %for.body: Computable } +; CHECK-NEXT: %add = add i32 %i.05, %vscale +; CHECK-NEXT: --> {vscale,+,vscale}<%for.body> U: full-set S: full-set Exits: <> LoopDispositions: { %for.body: Computable } +; CHECK-NEXT: Determining loop execution counts for: @vscale_ult_no_vscale_range +; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count. +; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count. +; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count. +; +entry: + %vscale = call i32 @llvm.vscale.i32() + br label %for.body + +for.body: ; preds = %entry, %for.body + %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05 + %0 = load , ptr %arrayidx, align 4 + %inc = add nsw %0, splat (i32 1) + store %inc, ptr %arrayidx, align 4 + %add = add i32 %i.05, %vscale + %cmp = icmp ult i32 %add, u0x00010000 + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +}