Index: include/polly/ScopInfo.h =================================================================== --- include/polly/ScopInfo.h +++ include/polly/ScopInfo.h @@ -1689,6 +1689,9 @@ /// vector comprises only of a single statement. DenseMap> StmtMap; + /// A map from instructions to SCoP statements. + DenseMap InstStmtMap; + /// A map from basic blocks to their domains. DenseMap DomainMap; @@ -2644,9 +2647,7 @@ /// Return the ScopStmt an instruction belongs to, or nullptr if it /// does not belong to any statement in this Scop. - ScopStmt *getStmtFor(Instruction *Inst) const { - return getStmtFor(Inst->getParent()); - } + ScopStmt *getStmtFor(Instruction *Inst) const; /// Return the number of statements in the SCoP. size_t getSize() const { return Stmts.size(); } Index: lib/Analysis/ScopInfo.cpp =================================================================== --- lib/Analysis/ScopInfo.cpp +++ lib/Analysis/ScopInfo.cpp @@ -3796,10 +3796,16 @@ void Scop::removeFromStmtMap(ScopStmt &Stmt) { if (Stmt.isRegionStmt()) - for (BasicBlock *BB : Stmt.getRegion()->blocks()) + for (BasicBlock *BB : Stmt.getRegion()->blocks()) { StmtMap.erase(BB); - else + for (Instruction &Inst : *BB) + InstStmtMap.erase(&Inst); + } + else { StmtMap.erase(Stmt.getBasicBlock()); + for (Instruction &Inst : *Stmt.getBasicBlock()) + InstStmtMap.erase(&Inst); + } } void Scop::removeStmts(std::function ShouldDelete) { @@ -4819,14 +4825,25 @@ Stmts.emplace_back(*this, *BB, SurroundingLoop, Instructions); auto *Stmt = &Stmts.back(); StmtMap[BB].push_back(Stmt); + for (Instruction &Inst : *BB) { + assert(!InstStmtMap[&Inst] && + "Unexpected statement corresponding to the instruction."); + InstStmtMap[&Inst] = Stmt; + } } void Scop::addScopStmt(Region *R, Loop *SurroundingLoop) { assert(R && "Unexpected nullptr!"); Stmts.emplace_back(*this, *R, SurroundingLoop); auto *Stmt = &Stmts.back(); - for (BasicBlock *BB : R->blocks()) + for (BasicBlock *BB : R->blocks()) { StmtMap[BB].push_back(Stmt); + for (Instruction &Inst : *BB) { + assert(!InstStmtMap[&Inst] && + "Unexpected statement corresponding to the instruction."); + InstStmtMap[&Inst] = Stmt; + } + } } ScopStmt *Scop::addScopStmt(__isl_take isl_map *SourceRel, @@ -4982,6 +4999,13 @@ return StmtMapIt->second.front(); } +ScopStmt *Scop::getStmtFor(Instruction *Inst) const { + auto InstStmtMapIt = InstStmtMap.find(Inst); + if (InstStmtMapIt == InstStmtMap.end()) + return nullptr; + return InstStmtMapIt->second; +} + ScopStmt *Scop::getStmtFor(RegionNode *RN) const { if (RN->isSubRegion()) return getStmtFor(RN->getNodeAs());