15 files changed:
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.setPreservesAll();
+ }
+
void emitFunction(const Function *F);
private :
void emitBasicBlock(const BasicBlock *BB);
void emitFunction(const Function *F);
private :
void emitBasicBlock(const BasicBlock *BB);
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.setPreservesAll();
+ }
+
+private:
void emitGlobalsAndConstants(const Module *M);
void printGlobalVariable(const GlobalVariable *GV);
void emitGlobalsAndConstants(const Module *M);
void printGlobalVariable(const GlobalVariable *GV);
static void FoldConstants(const Module *M,
std::hash_set<const Constant*> &moduleConstants);
static void FoldConstants(const Module *M,
std::hash_set<const Constant*> &moduleConstants);
namespace {
struct HoistPHIConstants : public FunctionPass {
virtual bool runOnFunction(Function *F) { return doHoistPHIConstants(F); }
namespace {
struct HoistPHIConstants : public FunctionPass {
virtual bool runOnFunction(Function *F) { return doHoistPHIConstants(F); }
+
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.preservesCFG();
+ }
Constants.clear();
return false;
}
Constants.clear();
return false;
}
+
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.setPreservesAll();
+ }
};
struct DynamicConstantMerge : public ConstantMerge {
};
struct DynamicConstantMerge : public ConstantMerge {
bool runOnFunction(Function *F) {
return doit(F, TraceBasicBlockExits, TraceFunctionExits, PrintfFunc);
}
bool runOnFunction(Function *F) {
return doit(F, TraceBasicBlockExits, TraceFunctionExits, PrintfFunc);
}
+
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.preservesCFG();
+ }
};
} // end anonymous namespace
};
} // end anonymous namespace
namespace {
struct RaisePointerReferences : public FunctionPass {
virtual bool runOnFunction(Function *F) { return doRPR(F); }
namespace {
struct RaisePointerReferences : public FunctionPass {
virtual bool runOnFunction(Function *F) { return doRPR(F); }
+
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.preservesCFG();
+ }
+
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ // FIXME: This pass does not preserve the CFG because it folds terminator
+ // instructions!
+ //AU.preservesCFG();
+ }
virtual bool runOnFunction(Function *F) {
return doDecomposeMultiDimRefs(F);
}
virtual bool runOnFunction(Function *F) {
return doDecomposeMultiDimRefs(F);
}
+
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.preservesCFG();
+ }
// This transformation requires dominator and immediate dominator info
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
// This transformation requires dominator and immediate dominator info
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired(DominatorSet::ID);
AU.addRequired(ImmediateDominators::ID);
}
AU.addRequired(DominatorSet::ID);
AU.addRequired(ImmediateDominators::ID);
}
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired(LoopInfo::ID);
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired(LoopInfo::ID);
virtual bool runOnFunction(Function *F);
virtual bool runOnFunction(Function *F);
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.preservesCFG();
+ }
+
// Visitation implementation - Implement instruction combining for different
// instruction types. The semantics are as follows:
// Return Value:
// Visitation implementation - Implement instruction combining for different
// instruction types. The semantics are as follows:
// Return Value:
SCCP S(F);
return S.doSCCP();
}
SCCP S(F);
return S.doSCCP();
}
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ // FIXME: SCCP does not preserve the CFG because it folds terminators!
+ //AU.preservesCFG();
+ }
virtual bool runOnFunction(Function *F) {
return doSymbolStripping(F);
}
virtual bool runOnFunction(Function *F) {
return doSymbolStripping(F);
}
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.setPreservesAll();
+ }
};
struct FullSymbolStripping : public SymbolStripping {
};
struct FullSymbolStripping : public SymbolStripping {
//
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired(DominanceFrontier::ID);
//
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired(DominanceFrontier::ID);
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.setPreservesAll();
+ }
+
// Verification methods...
void verifySymbolTable(SymbolTable *ST);
void visitFunction(Function *F);
// Verification methods...
void verifySymbolTable(SymbolTable *ST);
void visitFunction(Function *F);
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired(ID);
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired(ID);
void doit(Function *F) {
std::cout << analysis::InstForest<char>(F);
}
void doit(Function *F) {
std::cout << analysis::InstForest<char>(F);
}
+
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.setPreservesAll();
+ }
};
struct IndVars : public FunctionPass {
};
struct IndVars : public FunctionPass {
void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired(LoopInfo::ID);
void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired(LoopInfo::ID);
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.setPreservesAll();
+ }