From ad56a507d2dcd5cbe04ebc9770323028e690bfbc Mon Sep 17 00:00:00 2001 From: Sjoerd Meijer Date: Wed, 8 Oct 2025 07:30:52 -0700 Subject: [PATCH] [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 +}