mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-23 22:23:00 +00:00
introduce a new CallGraphSCC class, and pass it around
to CallGraphSCCPass's instead of passing around a std::vector<CallGraphNode*>. No functionality change, but now we have a much tidier interface. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@101558 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -40,7 +40,7 @@ namespace {
|
||||
PruneEH() : CallGraphSCCPass(&ID) {}
|
||||
|
||||
// runOnSCC - Analyze the SCC, performing the transformation if possible.
|
||||
bool runOnSCC(std::vector<CallGraphNode *> &SCC);
|
||||
bool runOnSCC(CallGraphSCC &SCC);
|
||||
|
||||
bool SimplifyFunction(Function *F);
|
||||
void DeleteBasicBlock(BasicBlock *BB);
|
||||
@@ -54,20 +54,20 @@ X("prune-eh", "Remove unused exception handling info");
|
||||
Pass *llvm::createPruneEHPass() { return new PruneEH(); }
|
||||
|
||||
|
||||
bool PruneEH::runOnSCC(std::vector<CallGraphNode *> &SCC) {
|
||||
bool PruneEH::runOnSCC(CallGraphSCC &SCC) {
|
||||
SmallPtrSet<CallGraphNode *, 8> SCCNodes;
|
||||
CallGraph &CG = getAnalysis<CallGraph>();
|
||||
bool MadeChange = false;
|
||||
|
||||
// Fill SCCNodes with the elements of the SCC. Used for quickly
|
||||
// looking up whether a given CallGraphNode is in this SCC.
|
||||
for (unsigned i = 0, e = SCC.size(); i != e; ++i)
|
||||
SCCNodes.insert(SCC[i]);
|
||||
for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I)
|
||||
SCCNodes.insert(*I);
|
||||
|
||||
// First pass, scan all of the functions in the SCC, simplifying them
|
||||
// according to what we know.
|
||||
for (unsigned i = 0, e = SCC.size(); i != e; ++i)
|
||||
if (Function *F = SCC[i]->getFunction())
|
||||
for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I)
|
||||
if (Function *F = (*I)->getFunction())
|
||||
MadeChange |= SimplifyFunction(F);
|
||||
|
||||
// Next, check to see if any callees might throw or if there are any external
|
||||
@@ -78,9 +78,9 @@ bool PruneEH::runOnSCC(std::vector<CallGraphNode *> &SCC) {
|
||||
// obviously the SCC might throw.
|
||||
//
|
||||
bool SCCMightUnwind = false, SCCMightReturn = false;
|
||||
for (unsigned i = 0, e = SCC.size();
|
||||
(!SCCMightUnwind || !SCCMightReturn) && i != e; ++i) {
|
||||
Function *F = SCC[i]->getFunction();
|
||||
for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end();
|
||||
(!SCCMightUnwind || !SCCMightReturn) && I != E; ++I) {
|
||||
Function *F = (*I)->getFunction();
|
||||
if (F == 0) {
|
||||
SCCMightUnwind = true;
|
||||
SCCMightReturn = true;
|
||||
@@ -132,7 +132,7 @@ bool PruneEH::runOnSCC(std::vector<CallGraphNode *> &SCC) {
|
||||
|
||||
// If the SCC doesn't unwind or doesn't throw, note this fact.
|
||||
if (!SCCMightUnwind || !SCCMightReturn)
|
||||
for (unsigned i = 0, e = SCC.size(); i != e; ++i) {
|
||||
for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
|
||||
Attributes NewAttributes = Attribute::None;
|
||||
|
||||
if (!SCCMightUnwind)
|
||||
@@ -140,19 +140,20 @@ bool PruneEH::runOnSCC(std::vector<CallGraphNode *> &SCC) {
|
||||
if (!SCCMightReturn)
|
||||
NewAttributes |= Attribute::NoReturn;
|
||||
|
||||
const AttrListPtr &PAL = SCC[i]->getFunction()->getAttributes();
|
||||
Function *F = (*I)->getFunction();
|
||||
const AttrListPtr &PAL = F->getAttributes();
|
||||
const AttrListPtr &NPAL = PAL.addAttr(~0, NewAttributes);
|
||||
if (PAL != NPAL) {
|
||||
MadeChange = true;
|
||||
SCC[i]->getFunction()->setAttributes(NPAL);
|
||||
F->setAttributes(NPAL);
|
||||
}
|
||||
}
|
||||
|
||||
for (unsigned i = 0, e = SCC.size(); i != e; ++i) {
|
||||
for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
|
||||
// Convert any invoke instructions to non-throwing functions in this node
|
||||
// into call instructions with a branch. This makes the exception blocks
|
||||
// dead.
|
||||
if (Function *F = SCC[i]->getFunction())
|
||||
if (Function *F = (*I)->getFunction())
|
||||
MadeChange |= SimplifyFunction(F);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user