From b79a67df786fa00ec4aeb0bf908889ce90ae591f Mon Sep 17 00:00:00 2001 From: Tobias Grosser Date: Fri, 28 Aug 2015 08:23:35 +0000 Subject: [PATCH] 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 --- polly/include/polly/CodeGen/BlockGenerators.h | 18 +++++++++++++++ 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 aac47fcb8c3c..e6b4e6c7fbf6 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 1b5e7ccd63d3..9e2112ba45c3 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(PHI), PHIOpMap, ".phiops"); + AllocaInst *PHIOpAddr = getOrCreatePHIAlloca(const_cast(PHI)); OpCopy = new LoadInst(PHIOpAddr, PHIOpAddr->getName() + ".reload", BlockMap[IncomingBB]->getTerminator()); }