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
This commit is contained in:
Tobias Grosser 2015-08-28 08:23:35 +00:00
parent f42d508360
commit b79a67df78
2 changed files with 33 additions and 8 deletions

View File

@ -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

View File

@ -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());
}