forked from OSchip/llvm-project
[ScopBuilder] Simplify main statement flag in buildEqivClassBlockStmts. NFC.
When reading code in ScopBuilder::buildEqivClassBlockStmts, I think the main statement flag computation can be simplified, here is the patch. It's based on two simple facts that: 1. Instruction won't be removed once it's inserted into UnionFind. 2. Main statement must be set if there is non-trivial statement besides the last one. The patch also saves std::find call. Patch by bin.narwal <bin.narwal@gmail.com> Differential Revision: https://reviews.llvm.org/D66477 llvm-svn: 369972
This commit is contained in:
parent
ba3d40a145
commit
88fd2d0123
|
@ -2095,7 +2095,7 @@ void ScopBuilder::buildEqivClassBlockStmts(BasicBlock *BB) {
|
||||||
// shouldModelInst() repeatedly.
|
// shouldModelInst() repeatedly.
|
||||||
SmallVector<Instruction *, 32> ModeledInsts;
|
SmallVector<Instruction *, 32> ModeledInsts;
|
||||||
EquivalenceClasses<Instruction *> UnionFind;
|
EquivalenceClasses<Instruction *> UnionFind;
|
||||||
Instruction *MainInst = nullptr;
|
Instruction *MainInst = nullptr, *MainLeader = nullptr;
|
||||||
for (Instruction &Inst : *BB) {
|
for (Instruction &Inst : *BB) {
|
||||||
if (!shouldModelInst(&Inst, L))
|
if (!shouldModelInst(&Inst, L))
|
||||||
continue;
|
continue;
|
||||||
|
@ -2129,6 +2129,8 @@ void ScopBuilder::buildEqivClassBlockStmts(BasicBlock *BB) {
|
||||||
if (LeaderIt == UnionFind.member_end())
|
if (LeaderIt == UnionFind.member_end())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (&Inst == MainInst)
|
||||||
|
MainLeader = *LeaderIt;
|
||||||
std::vector<Instruction *> &InstList = LeaderToInstList[*LeaderIt];
|
std::vector<Instruction *> &InstList = LeaderToInstList[*LeaderIt];
|
||||||
InstList.push_back(&Inst);
|
InstList.push_back(&Inst);
|
||||||
}
|
}
|
||||||
|
@ -2136,19 +2138,11 @@ void ScopBuilder::buildEqivClassBlockStmts(BasicBlock *BB) {
|
||||||
// Finally build the statements.
|
// Finally build the statements.
|
||||||
int Count = 0;
|
int Count = 0;
|
||||||
long BBIdx = scop->getNextStmtIdx();
|
long BBIdx = scop->getNextStmtIdx();
|
||||||
bool MainFound = false;
|
|
||||||
for (auto &Instructions : reverse(LeaderToInstList)) {
|
for (auto &Instructions : reverse(LeaderToInstList)) {
|
||||||
std::vector<Instruction *> &InstList = Instructions.second;
|
std::vector<Instruction *> &InstList = Instructions.second;
|
||||||
|
|
||||||
// If there is no main instruction, make the first statement the main.
|
// If there is no main instruction, make the first statement the main.
|
||||||
bool IsMain;
|
bool IsMain = (MainInst ? MainLeader == Instructions.first : Count == 0);
|
||||||
if (MainInst)
|
|
||||||
IsMain = std::find(InstList.begin(), InstList.end(), MainInst) !=
|
|
||||||
InstList.end();
|
|
||||||
else
|
|
||||||
IsMain = (Count == 0);
|
|
||||||
if (IsMain)
|
|
||||||
MainFound = true;
|
|
||||||
|
|
||||||
std::reverse(InstList.begin(), InstList.end());
|
std::reverse(InstList.begin(), InstList.end());
|
||||||
std::string Name = makeStmtName(BB, BBIdx, Count, IsMain);
|
std::string Name = makeStmtName(BB, BBIdx, Count, IsMain);
|
||||||
|
@ -2159,8 +2153,10 @@ void ScopBuilder::buildEqivClassBlockStmts(BasicBlock *BB) {
|
||||||
// Unconditionally add an epilogue (last statement). It contains no
|
// Unconditionally add an epilogue (last statement). It contains no
|
||||||
// instructions, but holds the PHI write accesses for successor basic blocks,
|
// instructions, but holds the PHI write accesses for successor basic blocks,
|
||||||
// if the incoming value is not defined in another statement if the same BB.
|
// if the incoming value is not defined in another statement if the same BB.
|
||||||
|
// The epilogue becomes the main statement only if there is no other
|
||||||
|
// statement that could become main.
|
||||||
// The epilogue will be removed if no PHIWrite is added to it.
|
// The epilogue will be removed if no PHIWrite is added to it.
|
||||||
std::string EpilogueName = makeStmtName(BB, BBIdx, Count, !MainFound, true);
|
std::string EpilogueName = makeStmtName(BB, BBIdx, Count, Count == 0, true);
|
||||||
scop->addScopStmt(BB, EpilogueName, L, {});
|
scop->addScopStmt(BB, EpilogueName, L, {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue