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:
parent
f42d508360
commit
b79a67df78
@ -115,6 +115,24 @@ public:
|
||||
void copyStmt(ScopStmt &Stmt, ValueMapT &GlobalMap, LoopToScevMapT <S,
|
||||
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
|
||||
|
||||
@ -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());
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user