[llvm-branch-commits] [polly] [Polly][CodePreparation] Extract common code of LPM and NPM (PR #140419)
Michael Kruse via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sat May 17 16:51:54 PDT 2025
https://github.com/Meinersbur created https://github.com/llvm/llvm-project/pull/140419
Use a common function for the non-boilerplate code shared between LPM and NPM as done by most other passes already. ScalarEvolution is not actually used.
Patch extracted out of #125442 requested by https://github.com/llvm/llvm-project/pull/125442#discussion_r2034416019
>From 1acf246bac1428358ae616cc846bc40c1ae2b3c3 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Sun, 18 May 2025 01:43:00 +0200
Subject: [PATCH] Refactor common code of LPM and NPM
---
polly/lib/Transform/CodePreparation.cpp | 45 +++++++++++++++----------
1 file changed, 27 insertions(+), 18 deletions(-)
diff --git a/polly/lib/Transform/CodePreparation.cpp b/polly/lib/Transform/CodePreparation.cpp
index 7c8579eb93218..d045fb6b62c90 100644
--- a/polly/lib/Transform/CodePreparation.cpp
+++ b/polly/lib/Transform/CodePreparation.cpp
@@ -27,6 +27,26 @@
using namespace llvm;
using namespace polly;
+static bool runCodePreprationImpl(Function &F, DominatorTree *DT, LoopInfo *LI,
+ RegionInfo *RI) {
+ // Find first non-alloca instruction. Every basic block has a non-alloca
+ // instruction, as every well formed basic block has a terminator.
+ auto &EntryBlock = F.getEntryBlock();
+ BasicBlock::iterator I = EntryBlock.begin();
+ while (isa<AllocaInst>(I))
+ ++I;
+
+ // Abort if not necessary to split
+ if (I->isTerminator() && isa<BranchInst>(I) &&
+ cast<BranchInst>(I)->isUnconditional())
+ return false;
+
+ // splitBlock updates DT, LI and RI.
+ splitEntryBlockForAlloca(&EntryBlock, DT, LI, RI);
+
+ return true;
+}
+
namespace {
/// Prepare the IR for the scop detection.
@@ -35,9 +55,6 @@ class CodePreparation final : public FunctionPass {
CodePreparation(const CodePreparation &) = delete;
const CodePreparation &operator=(const CodePreparation &) = delete;
- LoopInfo *LI;
- ScalarEvolution *SE;
-
void clear();
public:
@@ -58,19 +75,11 @@ class CodePreparation final : public FunctionPass {
PreservedAnalyses CodePreparationPass::run(Function &F,
FunctionAnalysisManager &FAM) {
-
- // Find first non-alloca instruction. Every basic block has a non-alloca
- // instruction, as every well formed basic block has a terminator.
- auto &EntryBlock = F.getEntryBlock();
- BasicBlock::iterator I = EntryBlock.begin();
- while (isa<AllocaInst>(I))
- ++I;
-
auto &DT = FAM.getResult<DominatorTreeAnalysis>(F);
auto &LI = FAM.getResult<LoopAnalysis>(F);
-
- // splitBlock updates DT, LI and RI.
- splitEntryBlockForAlloca(&EntryBlock, &DT, &LI, nullptr);
+ bool Changed = runCodePreprationImpl(F, &DT, &LI, nullptr);
+ if (!Changed)
+ return PreservedAnalyses::all();
PreservedAnalyses PA;
PA.preserve<DominatorTreeAnalysis>();
@@ -84,7 +93,6 @@ CodePreparation::~CodePreparation() { clear(); }
void CodePreparation::getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<LoopInfoWrapperPass>();
- AU.addRequired<ScalarEvolutionWrapperPass>();
AU.addPreserved<LoopInfoWrapperPass>();
AU.addPreserved<RegionInfoPass>();
@@ -96,10 +104,11 @@ bool CodePreparation::runOnFunction(Function &F) {
if (skipFunction(F))
return false;
- LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
- SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
+ DominatorTree *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
+ LoopInfo *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
+ RegionInfo *RI = &getAnalysis<RegionInfoPass>().getRegionInfo();
- splitEntryBlockForAlloca(&F.getEntryBlock(), this);
+ runCodePreprationImpl(F, DT, LI, RI);
return true;
}
More information about the llvm-branch-commits
mailing list