mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-28 14:36:34 +00:00
Remove LCSSA's bogus dependence on LoopSimplify and LoopSimplify's bogus
dependence on DominanceFrontier. Instead, add an explicit DominanceFrontier pass in StandardPasses.h to ensure that it gets scheduled at the right time. Declare that loop unrolling preserves ScalarEvolution, and shuffle some getAnalysisUsages. This eliminates one LoopSimplify and one LCCSA run in the standard compile opts sequence. llvm-svn: 109413
This commit is contained in:
parent
7d588b7dec
commit
23a6a1bdc5
@ -20,6 +20,7 @@
|
||||
#define LLVM_SUPPORT_STANDARDPASSES_H
|
||||
|
||||
#include "llvm/PassManager.h"
|
||||
#include "llvm/Analysis/Dominators.h"
|
||||
#include "llvm/Analysis/Passes.h"
|
||||
#include "llvm/Analysis/Verifier.h"
|
||||
#include "llvm/Transforms/Scalar.h"
|
||||
@ -128,6 +129,8 @@ namespace llvm {
|
||||
PM->add(createTailCallEliminationPass()); // Eliminate tail calls
|
||||
PM->add(createCFGSimplificationPass()); // Merge & remove BBs
|
||||
PM->add(createReassociatePass()); // Reassociate expressions
|
||||
// Explicitly schedule this to ensure that it runs before any loop pass.
|
||||
PM->add(new DominanceFrontier()); // Calculate Dominance Frontiers
|
||||
PM->add(createLoopRotatePass()); // Rotate Loop
|
||||
PM->add(createLICMPass()); // Hoist loop invariants
|
||||
PM->add(createLoopUnswitchPass(OptimizeSize || OptimizationLevel < 3));
|
||||
|
@ -38,9 +38,9 @@ namespace {
|
||||
bool &Changed, BasicBlock *Preheader);
|
||||
|
||||
virtual void getAnalysisUsage(AnalysisUsage& AU) const {
|
||||
AU.addRequired<ScalarEvolution>();
|
||||
AU.addRequired<DominatorTree>();
|
||||
AU.addRequired<LoopInfo>();
|
||||
AU.addRequired<ScalarEvolution>();
|
||||
AU.addRequiredID(LoopSimplifyID);
|
||||
AU.addRequiredID(LCSSAID);
|
||||
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include "llvm/Transforms/Scalar.h"
|
||||
#include "llvm/Analysis/LoopPass.h"
|
||||
#include "llvm/Analysis/InlineCost.h"
|
||||
#include "llvm/Analysis/ScalarEvolution.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
@ -55,17 +56,19 @@ namespace {
|
||||
/// loop preheaders be inserted into the CFG...
|
||||
///
|
||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.addRequiredID(LoopSimplifyID);
|
||||
AU.addRequiredID(LCSSAID);
|
||||
AU.addRequired<LoopInfo>();
|
||||
AU.addPreservedID(LCSSAID);
|
||||
AU.addPreserved<LoopInfo>();
|
||||
AU.addRequiredID(LoopSimplifyID);
|
||||
AU.addPreservedID(LoopSimplifyID);
|
||||
AU.addRequiredID(LCSSAID);
|
||||
AU.addPreservedID(LCSSAID);
|
||||
// FIXME: Loop unroll requires LCSSA. And LCSSA requires dom info.
|
||||
// If loop unroll does not preserve dom info then LCSSA pass on next
|
||||
// loop will receive invalid dom info.
|
||||
// For now, recreate dom info, if loop is unrolled.
|
||||
AU.addPreserved<DominatorTree>();
|
||||
AU.addPreserved<DominanceFrontier>();
|
||||
AU.addPreserved<ScalarEvolution>();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -64,17 +64,12 @@ namespace {
|
||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.setPreservesCFG();
|
||||
|
||||
AU.addRequiredTransitive<DominatorTree>();
|
||||
AU.addRequired<DominatorTree>();
|
||||
AU.addPreserved<DominatorTree>();
|
||||
AU.addPreserved<DominanceFrontier>();
|
||||
AU.addRequiredTransitive<LoopInfo>();
|
||||
AU.addRequired<LoopInfo>();
|
||||
AU.addPreserved<LoopInfo>();
|
||||
|
||||
// LCSSA doesn't actually require LoopSimplify, but the PassManager
|
||||
// doesn't know how to schedule LoopSimplify by itself.
|
||||
AU.addRequiredID(LoopSimplifyID);
|
||||
AU.addPreservedID(LoopSimplifyID);
|
||||
|
||||
AU.addPreserved<ScalarEvolution>();
|
||||
}
|
||||
private:
|
||||
|
@ -77,22 +77,17 @@ namespace {
|
||||
|
||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
// We need loop information to identify the loops...
|
||||
AU.addRequiredTransitive<DominatorTree>();
|
||||
AU.addRequired<DominatorTree>();
|
||||
AU.addPreserved<DominatorTree>();
|
||||
|
||||
// Request DominanceFrontier now, even though LoopSimplify does
|
||||
// not use it. This allows Pass Manager to schedule Dominance
|
||||
// Frontier early enough such that one LPPassManager can handle
|
||||
// multiple loop transformation passes.
|
||||
AU.addRequired<DominanceFrontier>();
|
||||
AU.addPreserved<DominanceFrontier>();
|
||||
|
||||
AU.addRequiredTransitive<LoopInfo>();
|
||||
AU.addRequired<LoopInfo>();
|
||||
AU.addPreserved<LoopInfo>();
|
||||
|
||||
AU.addPreserved<AliasAnalysis>();
|
||||
AU.addPreserved<ScalarEvolution>();
|
||||
AU.addPreservedID(BreakCriticalEdgesID); // No critical edges added.
|
||||
AU.addPreserved<DominanceFrontier>();
|
||||
AU.addPreservedID(LCSSAID);
|
||||
}
|
||||
|
||||
/// verifyAnalysis() - Verify LoopSimplifyForm's guarantees.
|
||||
|
Loading…
Reference in New Issue
Block a user