mirror of
https://github.com/RPCSX/llvm.git
synced 2025-03-05 11:27:41 +00:00
Tweak the LICM code to reuse the first sub-loop instead of creating a new one
LICM starts with an *empty* AST, and then merges in each sub-loop. While the add code is appropriate for sub-loop 2 and up, it's utterly unnecessary for sub-loop 1. If the AST starts off empty, we can just clone/move the contents of the subloop into the containing AST. Reviewed-by: Philip Reames <listmail@philipreames.com> Differential Revision: http://reviews.llvm.org/D16753 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260892 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6cde049097
commit
78d3a49fad
@ -164,6 +164,11 @@ namespace {
|
||||
|
||||
/// Simple Analysis hook. Delete loop L from alias set map.
|
||||
void deleteAnalysisLoop(Loop *L) override;
|
||||
|
||||
/// Returns an owning pointer to an alias set which incorporates aliasing
|
||||
/// info from all subloops of L, but does not include instructions in L
|
||||
/// itself.
|
||||
AliasSetTracker *collectAliasInfoFromSubLoops(Loop *L);
|
||||
};
|
||||
}
|
||||
|
||||
@ -202,20 +207,7 @@ bool LICM::runOnLoop(Loop *L, LPPassManager &LPM) {
|
||||
|
||||
assert(L->isLCSSAForm(*DT) && "Loop is not in LCSSA form.");
|
||||
|
||||
CurAST = new AliasSetTracker(*AA);
|
||||
// Collect Alias info from subloops.
|
||||
for (Loop *InnerL : L->getSubLoops()) {
|
||||
AliasSetTracker *InnerAST = LoopToAliasSetMap[InnerL];
|
||||
assert(InnerAST && "Where is my AST?");
|
||||
|
||||
// What if InnerLoop was modified by other passes ?
|
||||
CurAST->add(*InnerAST);
|
||||
|
||||
// Once we've incorporated the inner loop's AST into ours, we don't need the
|
||||
// subloop's anymore.
|
||||
delete InnerAST;
|
||||
LoopToAliasSetMap.erase(InnerL);
|
||||
}
|
||||
CurAST = collectAliasInfoFromSubLoops(L);
|
||||
|
||||
CurLoop = L;
|
||||
|
||||
@ -1065,6 +1057,32 @@ bool llvm::promoteLoopAccessesToScalars(AliasSet &AS,
|
||||
return Changed;
|
||||
}
|
||||
|
||||
/// Returns an owning pointer to an alias set which incorporates aliasing info
|
||||
/// from all subloops of L, but does not include instructions in L itself.
|
||||
///
|
||||
AliasSetTracker *LICM::collectAliasInfoFromSubLoops(Loop *L) {
|
||||
AliasSetTracker *CurAST = nullptr;
|
||||
for (Loop *InnerL : L->getSubLoops()) {
|
||||
AliasSetTracker *InnerAST = LoopToAliasSetMap[InnerL];
|
||||
assert(InnerAST && "Where is my AST?");
|
||||
|
||||
if (CurAST != nullptr) {
|
||||
// What if InnerLoop was modified by other passes ?
|
||||
CurAST->add(*InnerAST);
|
||||
|
||||
// Once we've incorporated the inner loop's AST into ours, we don't need
|
||||
// the subloop's anymore.
|
||||
delete InnerAST;
|
||||
} else {
|
||||
CurAST = InnerAST;
|
||||
}
|
||||
LoopToAliasSetMap.erase(InnerL);
|
||||
}
|
||||
if (CurAST == nullptr)
|
||||
CurAST = new AliasSetTracker(*AA);
|
||||
return CurAST;
|
||||
}
|
||||
|
||||
/// Simple analysis hook. Clone alias set info.
|
||||
///
|
||||
void LICM::cloneBasicBlockAnalysis(BasicBlock *From, BasicBlock *To, Loop *L) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user