From ad56a507d2dcd5cbe04ebc9770323028e690bfbc Mon Sep 17 00:00:00 2001 From: Sjoerd Meijer Date: Wed, 8 Oct 2025 07:30:52 -0700 Subject: [PATCH 1/3] [DA] getBackedgeTakenCount in isKnownLessThan can return CouldNotCompute Bail out when the backedge taken count is a CouldNotCompute SCEV in function isKnownLessThan; we cannot and do not want to query things like its Type. --- llvm/lib/Analysis/DependenceAnalysis.cpp | 2 ++ .../becount-couldnotcompute.ll | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 llvm/test/Analysis/DependenceAnalysis/becount-couldnotcompute.ll diff --git a/llvm/lib/Analysis/DependenceAnalysis.cpp b/llvm/lib/Analysis/DependenceAnalysis.cpp index 1f0da8d1830d3..9e474769abd83 100644 --- a/llvm/lib/Analysis/DependenceAnalysis.cpp +++ b/llvm/lib/Analysis/DependenceAnalysis.cpp @@ -1184,6 +1184,8 @@ bool DependenceInfo::isKnownLessThan(const SCEV *S, const SCEV *Size) const { if (const SCEVAddRecExpr *AddRec = dyn_cast(S)) if (AddRec->isAffine() && AddRec->hasNoSignedWrap()) { const SCEV *BECount = SE->getBackedgeTakenCount(AddRec->getLoop()); + if (isa(BECount)) + return false; const SCEV *Start = AddRec->getStart(); const SCEV *Step = AddRec->getStepRecurrence(*SE); const SCEV *End = AddRec->evaluateAtIteration(BECount, *SE); diff --git a/llvm/test/Analysis/DependenceAnalysis/becount-couldnotcompute.ll b/llvm/test/Analysis/DependenceAnalysis/becount-couldnotcompute.ll new file mode 100644 index 0000000000000..4828858897072 --- /dev/null +++ b/llvm/test/Analysis/DependenceAnalysis/becount-couldnotcompute.ll @@ -0,0 +1,25 @@ +; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 6 +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 | FileCheck %s + +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32" +target triple = "aarch64-unknown-linux-gnu" + +; Test for function isKnownLessThan that calculates a back-edge taken count, +; which can return a CouldNotCompute SCEV. + +define void @test(i64 %conv, ptr %a) { +; CHECK-LABEL: 'test' +; CHECK-NEXT: Src: %.pre.pre.pre = load i32, ptr %arrayidx12, align 4 --> Dst: %.pre.pre.pre = load i32, ptr %arrayidx12, align 4 +; CHECK-NEXT: da analyze - none! +; +entry: + %sub = add i64 %conv, 1 + br label %for.cond + +for.cond: + %i.0 = phi i64 [ %add26, %for.cond ], [ 0, %entry ] + %arrayidx12 = getelementptr i32, ptr %a, i64 %i.0 + %.pre.pre.pre = load i32, ptr %arrayidx12, align 4 + %add26 = add nsw i64 %sub, %i.0 + br label %for.cond +} From 0ecb0c77780c3f6011a9cad614493bf3d9d18b86 Mon Sep 17 00:00:00 2001 From: Sjoerd Meijer Date: Fri, 10 Oct 2025 04:55:08 -0700 Subject: [PATCH 2/3] Check base case, clean-up the test a bit. --- llvm/lib/Analysis/DependenceAnalysis.cpp | 3 ++- .../becount-couldnotcompute.ll | 19 ++++++++----------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/llvm/lib/Analysis/DependenceAnalysis.cpp b/llvm/lib/Analysis/DependenceAnalysis.cpp index 9e474769abd83..60be55080418c 100644 --- a/llvm/lib/Analysis/DependenceAnalysis.cpp +++ b/llvm/lib/Analysis/DependenceAnalysis.cpp @@ -1184,8 +1184,9 @@ bool DependenceInfo::isKnownLessThan(const SCEV *S, const SCEV *Size) const { if (const SCEVAddRecExpr *AddRec = dyn_cast(S)) if (AddRec->isAffine() && AddRec->hasNoSignedWrap()) { const SCEV *BECount = SE->getBackedgeTakenCount(AddRec->getLoop()); + // If the BTC cannot be computed, check the base case for S. if (isa(BECount)) - return false; + return SE->isKnownNegative(SE->getMinusSCEV(S, Size)); const SCEV *Start = AddRec->getStart(); const SCEV *Step = AddRec->getStepRecurrence(*SE); const SCEV *End = AddRec->evaluateAtIteration(BECount, *SE); diff --git a/llvm/test/Analysis/DependenceAnalysis/becount-couldnotcompute.ll b/llvm/test/Analysis/DependenceAnalysis/becount-couldnotcompute.ll index 4828858897072..49fbad3510ae6 100644 --- a/llvm/test/Analysis/DependenceAnalysis/becount-couldnotcompute.ll +++ b/llvm/test/Analysis/DependenceAnalysis/becount-couldnotcompute.ll @@ -1,25 +1,22 @@ ; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 6 ; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 | FileCheck %s -target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32" -target triple = "aarch64-unknown-linux-gnu" - ; Test for function isKnownLessThan that calculates a back-edge taken count, ; which can return a CouldNotCompute SCEV. define void @test(i64 %conv, ptr %a) { ; CHECK-LABEL: 'test' -; CHECK-NEXT: Src: %.pre.pre.pre = load i32, ptr %arrayidx12, align 4 --> Dst: %.pre.pre.pre = load i32, ptr %arrayidx12, align 4 +; CHECK-NEXT: Src: %ld = load i32, ptr %arrayidx12, align 4 --> Dst: %ld = load i32, ptr %arrayidx12, align 4 ; CHECK-NEXT: da analyze - none! ; entry: %sub = add i64 %conv, 1 - br label %for.cond + br label %loop -for.cond: - %i.0 = phi i64 [ %add26, %for.cond ], [ 0, %entry ] - %arrayidx12 = getelementptr i32, ptr %a, i64 %i.0 - %.pre.pre.pre = load i32, ptr %arrayidx12, align 4 - %add26 = add nsw i64 %sub, %i.0 - br label %for.cond +loop: + %i = phi i64 [ %add26, %loop ], [ 0, %entry ] + %arrayidx12 = getelementptr i32, ptr %a, i64 %i + %ld = load i32, ptr %arrayidx12, align 4 + %add26 = add nsw i64 %sub, %i + br label %loop } From c18313708c8cf5ae88eecd390ce1389880513291 Mon Sep 17 00:00:00 2001 From: Sjoerd Meijer Date: Fri, 10 Oct 2025 05:35:42 -0700 Subject: [PATCH 3/3] Use DependenceInfo::collectUpperBound() --- llvm/lib/Analysis/DependenceAnalysis.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Analysis/DependenceAnalysis.cpp b/llvm/lib/Analysis/DependenceAnalysis.cpp index 60be55080418c..a63883af9ed99 100644 --- a/llvm/lib/Analysis/DependenceAnalysis.cpp +++ b/llvm/lib/Analysis/DependenceAnalysis.cpp @@ -1183,8 +1183,10 @@ bool DependenceInfo::isKnownLessThan(const SCEV *S, const SCEV *Size) const { // Special check for addrecs using BE taken count if (const SCEVAddRecExpr *AddRec = dyn_cast(S)) if (AddRec->isAffine() && AddRec->hasNoSignedWrap()) { - const SCEV *BECount = SE->getBackedgeTakenCount(AddRec->getLoop()); + const SCEV *BECount = collectUpperBound(AddRec->getLoop(), MaxType); // If the BTC cannot be computed, check the base case for S. + if (!BECount) + return false; if (isa(BECount)) return SE->isKnownNegative(SE->getMinusSCEV(S, Size)); const SCEV *Start = AddRec->getStart();