summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Grosser <tobias@grosser.es>2015-08-28 08:23:35 +0000
committerTobias Grosser <tobias@grosser.es>2015-08-28 08:23:35 +0000
commitb79a67df786fa00ec4aeb0bf908889ce90ae591f (patch)
treea28ecefdc0245ed4a594e03c07c755fd7322986f
parentf42d508360542fb3915ffff7d15b511cda871bd9 (diff)
downloadbcm5719-llvm-b79a67df786fa00ec4aeb0bf908889ce90ae591f.tar.gz
bcm5719-llvm-b79a67df786fa00ec4aeb0bf908889ce90ae591f.zip
BlockGenerator: Make scalar memory locations accessible
For external users, the memory locations into which we generate scalar values may be of interest. This change introduces two functions that allow to obtain (or create) the AllocInsts for a given BasePointer. We use this change to simplify the code in BlockGenerators. llvm-svn: 246285
-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