summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--polly/include/polly/CodeGen/BlockGenerators.h18
-rw-r--r--polly/lib/CodeGen/BlockGenerators.cpp23
2 files changed, 33 insertions, 8 deletions
diff --git a/polly/include/polly/CodeGen/BlockGenerators.h b/polly/include/polly/CodeGen/BlockGenerators.h
index aac47fcb8c3..e6b4e6c7fbf 100644
--- a/polly/include/polly/CodeGen/BlockGenerators.h
+++ b/polly/include/polly/CodeGen/BlockGenerators.h
@@ -115,6 +115,24 @@ public:
void copyStmt(ScopStmt &Stmt, ValueMapT &GlobalMap, LoopToScevMapT &LTS,
isl_id_to_ast_expr *NewAccesses);
+ /// @brief Return the scalar alloca for @p ScalarBase
+ ///
+ /// If no alloca was mapped to @p ScalarBase a new one is created.
+ ///
+ /// @param ScalarBase The demoted scalar value.
+ ///
+ /// @returns The alloca for @p ScalarBase
+ AllocaInst *getOrCreateScalarAlloca(Value *ScalarBase);
+
+ /// @brief Return the PHi-node alloca for @p ScalarBase
+ ///
+ /// If no alloca was mapped to @p ScalarBase a new one is created.
+ ///
+ /// @param ScalarBase The demoted scalar value.
+ ///
+ /// @returns The alloca for @p ScalarBase
+ AllocaInst *getOrCreatePHIAlloca(Value *ScalarBase);
+
/// @brief Finalize the code generation for the SCoP @p S.
///
/// This will initialize and finalize the scalar variables we demoted during
diff --git a/polly/lib/CodeGen/BlockGenerators.cpp b/polly/lib/CodeGen/BlockGenerators.cpp
index 1b5e7ccd63d..9e2112ba45c 100644
--- a/polly/lib/CodeGen/BlockGenerators.cpp
+++ b/polly/lib/CodeGen/BlockGenerators.cpp
@@ -362,6 +362,14 @@ AllocaInst *BlockGenerator::getOrCreateAlloca(Value *ScalarBase,
return Addr;
}
+AllocaInst *BlockGenerator::getOrCreateScalarAlloca(Value *ScalarBase) {
+ return getOrCreateAlloca(ScalarBase, ScalarMap, ".s2a");
+}
+
+AllocaInst *BlockGenerator::getOrCreatePHIAlloca(Value *ScalarBase) {
+ return getOrCreateAlloca(ScalarBase, PHIOpMap, ".phiops");
+}
+
void BlockGenerator::handleOutsideUsers(const Region &R, Instruction *Inst,
Value *InstCopy) {
// If there are escape users we get the alloca for this instruction and put
@@ -422,9 +430,9 @@ void BlockGenerator::generateScalarLoads(ScopStmt &Stmt,
auto Base = MA.getBaseAddr();
if (MA.getScopArrayInfo()->isPHI())
- Address = getOrCreateAlloca(Base, PHIOpMap, ".phiops");
+ Address = getOrCreatePHIAlloca(Base);
else
- Address = getOrCreateAlloca(Base, ScalarMap, ".s2a");
+ Address = getOrCreateScalarAlloca(Base);
BBMap[Base] = Builder.CreateLoad(Address, Address->getName() + ".reload");
}
@@ -487,9 +495,9 @@ void BlockGenerator::generateScalarStores(ScopStmt &Stmt, BasicBlock *BB,
AllocaInst *Address = nullptr;
if (MA->getScopArrayInfo()->isPHI())
- Address = getOrCreateAlloca(Base, PHIOpMap, ".phiops");
+ Address = getOrCreatePHIAlloca(Base);
else
- Address = getOrCreateAlloca(Base, ScalarMap, ".s2a");
+ Address = getOrCreateScalarAlloca(Base);
Val = getNewScalarValue(Val, R, ScalarMap, BBMap, GlobalMap);
Builder.CreateStore(Val, Address);
@@ -1122,9 +1130,9 @@ void RegionGenerator::generateScalarStores(ScopStmt &Stmt, BasicBlock *BB,
AllocaInst *ScalarAddr = nullptr;
if (MA->getScopArrayInfo()->isPHI())
- ScalarAddr = getOrCreateAlloca(ScalarBase, PHIOpMap, ".phiops");
+ ScalarAddr = getOrCreatePHIAlloca(ScalarBase);
else
- ScalarAddr = getOrCreateAlloca(ScalarBase, ScalarMap, ".s2a");
+ ScalarAddr = getOrCreateScalarAlloca(ScalarBase);
Val = getNewScalarValue(Val, R, ScalarMap, BBMap, GlobalMap);
Builder.CreateStore(Val, ScalarAddr);
@@ -1161,8 +1169,7 @@ void RegionGenerator::addOperandToPHI(ScopStmt &Stmt, const PHINode *PHI,
if (PHICopy->getBasicBlockIndex(BBCopy) >= 0)
return;
- AllocaInst *PHIOpAddr =
- getOrCreateAlloca(const_cast<PHINode *>(PHI), PHIOpMap, ".phiops");
+ AllocaInst *PHIOpAddr = getOrCreatePHIAlloca(const_cast<PHINode *>(PHI));
OpCopy = new LoadInst(PHIOpAddr, PHIOpAddr->getName() + ".reload",
BlockMap[IncomingBB]->getTerminator());
}
OpenPOWER on IntegriCloud