diff options
author | Tobias Grosser <tobias@grosser.es> | 2015-08-28 08:23:35 +0000 |
---|---|---|
committer | Tobias Grosser <tobias@grosser.es> | 2015-08-28 08:23:35 +0000 |
commit | b79a67df786fa00ec4aeb0bf908889ce90ae591f (patch) | |
tree | a28ecefdc0245ed4a594e03c07c755fd7322986f | |
parent | f42d508360542fb3915ffff7d15b511cda871bd9 (diff) | |
download | bcm5719-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.h | 18 | ||||
-rw-r--r-- | polly/lib/CodeGen/BlockGenerators.cpp | 23 |
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 <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 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()); } |