aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/LoopAccessAnalysis.cpp
diff options
context:
space:
mode:
authorAllen <zhongyunde@huawei.com>2023-09-19 09:16:47 +0800
committerGitHub <noreply@github.com>2023-09-19 09:16:47 +0800
commit48caa0723c89b9da10ea081f490282a7e370a06f (patch)
tree13ccc45355dd01c07e36e4b9168704a2bbcc10da /llvm/lib/Analysis/LoopAccessAnalysis.cpp
parent542f91f755b99af978425fa584a9f0a5594cd729 (diff)
downloadllvm-48caa0723c89b9da10ea081f490282a7e370a06f.zip
llvm-48caa0723c89b9da10ea081f490282a7e370a06f.tar.gz
llvm-48caa0723c89b9da10ea081f490282a7e370a06f.tar.bz2
[LAA] Analyze pointers forked by a phi (#65834)
Given a function like the following: https://godbolt.org/z/T9c99fr88 ```c 1161_noReadWrite(int *Preds) { for (int i = 0; i < LEN_1D-1; ++i) { if (Preds[i] != 0) b[i] = c[i] + 1; else a[i] = i * i; } } ``` LLVM will optimize the IR to a single store by a phi instruction: ```llvm %1 = load ptr, ptr @a, align 64 %2 = load ptr, ptr @b, align 64 ... for.inc: %.sink = phi ptr [ %1, %if.then ], [ %2, %if.else ] %add.sink = phi double [ %add, %if.then ], [ %conv8, %if.else ] %arrayidx7 = getelementptr inbounds double, ptr %.sink, i64 %indvars.iv store double %add.sink, ptr %arrayidx7, align 8 ``` LAA is currently unable to analyze such IR, since ScalarEvolution will return a SCEVUnknown for the forked pointer operand of the store. This patch adds initial optional support for analyzing both possibilities for the pointer and allowing LAA to generate runtime checks for the bounds if required, refers to D108699, but here address the phi node. Fixes https://github.com/llvm/llvm-project/issues/64888 Reviewed By: huntergr-arm, fhahn Differential Revision: https://reviews.llvm.org/D158965
Diffstat (limited to 'llvm/lib/Analysis/LoopAccessAnalysis.cpp')
-rw-r--r--llvm/lib/Analysis/LoopAccessAnalysis.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp
index 8a779ac..245cce2 100644
--- a/llvm/lib/Analysis/LoopAccessAnalysis.cpp
+++ b/llvm/lib/Analysis/LoopAccessAnalysis.cpp
@@ -942,6 +942,22 @@ static void findForkedSCEVs(
ScevList.emplace_back(Scev, !isGuaranteedNotToBeUndefOrPoison(Ptr));
break;
}
+ case Instruction::PHI: {
+ SmallVector<PointerIntPair<const SCEV *, 1, bool>, 2> ChildScevs;
+ // A phi means we've found a forked pointer, but we currently only
+ // support a single phi per pointer so if there's another behind this
+ // then we just bail out and return the generic SCEV.
+ if (I->getNumOperands() == 2) {
+ findForkedSCEVs(SE, L, I->getOperand(0), ChildScevs, Depth);
+ findForkedSCEVs(SE, L, I->getOperand(1), ChildScevs, Depth);
+ }
+ if (ChildScevs.size() == 2) {
+ ScevList.push_back(ChildScevs[0]);
+ ScevList.push_back(ChildScevs[1]);
+ } else
+ ScevList.emplace_back(Scev, !isGuaranteedNotToBeUndefOrPoison(Ptr));
+ break;
+ }
case Instruction::Add:
case Instruction::Sub: {
SmallVector<PointerIntPair<const SCEV *, 1, bool>> LScevs;