diff options
author | Chris Lattner <sabre@nondot.org> | 2004-05-09 03:42:48 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-05-09 03:42:48 +0000 |
commit | a05e0ec4197908e5c9caa5ec5c47f3c143086247 (patch) | |
tree | aaad4e6c697ca5ec1745fb9da5667f906f0addb1 | |
parent | be97b4e9ab871214fbbb7587ac0d5cff769374e3 (diff) | |
download | external_llvm-a05e0ec4197908e5c9caa5ec5c47f3c143086247.zip external_llvm-a05e0ec4197908e5c9caa5ec5c47f3c143086247.tar.gz external_llvm-a05e0ec4197908e5c9caa5ec5c47f3c143086247.tar.bz2 |
Print all PHI copies for successor blocks before the terminator, whether it be a conditional branch or switch.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13430 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/CBackend/CBackend.cpp | 33 | ||||
-rw-r--r-- | lib/Target/CBackend/Writer.cpp | 33 |
2 files changed, 46 insertions, 20 deletions
diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp index 09ee36c..41e8fdd 100644 --- a/lib/Target/CBackend/CBackend.cpp +++ b/lib/Target/CBackend/CBackend.cpp @@ -27,6 +27,7 @@ #include "llvm/Analysis/ConstantsScanner.h" #include "llvm/Transforms/Scalar.h" #include "llvm/Support/CallSite.h" +#include "llvm/Support/CFG.h" #include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/Support/InstVisitor.h" #include "llvm/Support/Mangler.h" @@ -162,6 +163,8 @@ namespace { void outputLValue(Instruction *I) { Out << " " << Mang->getValueName(I) << " = "; } + void printPHICopiesForSuccessors(BasicBlock *CurBlock, + unsigned Indent); void printBranchToBlock(BasicBlock *CurBlock, BasicBlock *SuccBlock, unsigned Indent); void printIndexingExpression(Value *Ptr, gep_type_iterator I, @@ -1035,6 +1038,8 @@ void CWriter::visitReturnInst(ReturnInst &I) { } void CWriter::visitSwitchInst(SwitchInst &SI) { + printPHICopiesForSuccessors(SI.getParent(), 0); + Out << " switch ("; writeOperand(SI.getOperand(0)); Out << ") {\n default:\n"; @@ -1061,7 +1066,7 @@ void CWriter::visitUnwindInst(UnwindInst &I) { assert(0 && "Lowerinvoke pass didn't work!"); } -bool isGotoCodeNecessary(BasicBlock *From, BasicBlock *To) { +static bool isGotoCodeNecessary(BasicBlock *From, BasicBlock *To) { // If PHI nodes need copies, we need the copy code... if (isa<PHINode>(To->front()) || From->getNext() != To) // Not directly successor, need goto @@ -1071,17 +1076,23 @@ bool isGotoCodeNecessary(BasicBlock *From, BasicBlock *To) { return false; } +void CWriter::printPHICopiesForSuccessors(BasicBlock *CurBlock, + unsigned Indent) { + for (succ_iterator SI = succ_begin(CurBlock), E = succ_end(CurBlock); + SI != E; ++SI) + for (BasicBlock::iterator I = SI->begin(); + PHINode *PN = dyn_cast<PHINode>(I); ++I) { + // now we have to do the printing + Out << std::string(Indent, ' '); + Out << " " << Mang->getValueName(I) << "__PHI_TEMPORARY = "; + writeOperand(PN->getIncomingValue(PN->getBasicBlockIndex(CurBlock))); + Out << "; /* for PHI node */\n"; + } +} + + void CWriter::printBranchToBlock(BasicBlock *CurBB, BasicBlock *Succ, unsigned Indent) { - for (BasicBlock::iterator I = Succ->begin(); - PHINode *PN = dyn_cast<PHINode>(I); ++I) { - // now we have to do the printing - Out << std::string(Indent, ' '); - Out << " " << Mang->getValueName(I) << "__PHI_TEMPORARY = "; - writeOperand(PN->getIncomingValue(PN->getBasicBlockIndex(CurBB))); - Out << "; /* for PHI node */\n"; - } - if (CurBB->getNext() != Succ || isa<InvokeInst>(CurBB->getTerminator()) || isa<SwitchInst>(CurBB->getTerminator())) { @@ -1095,6 +1106,8 @@ void CWriter::printBranchToBlock(BasicBlock *CurBB, BasicBlock *Succ, // that immediately succeeds the current one. // void CWriter::visitBranchInst(BranchInst &I) { + printPHICopiesForSuccessors(I.getParent(), 0); + if (I.isConditional()) { if (isGotoCodeNecessary(I.getParent(), I.getSuccessor(0))) { Out << " if ("; diff --git a/lib/Target/CBackend/Writer.cpp b/lib/Target/CBackend/Writer.cpp index 09ee36c..41e8fdd 100644 --- a/lib/Target/CBackend/Writer.cpp +++ b/lib/Target/CBackend/Writer.cpp @@ -27,6 +27,7 @@ #include "llvm/Analysis/ConstantsScanner.h" #include "llvm/Transforms/Scalar.h" #include "llvm/Support/CallSite.h" +#include "llvm/Support/CFG.h" #include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/Support/InstVisitor.h" #include "llvm/Support/Mangler.h" @@ -162,6 +163,8 @@ namespace { void outputLValue(Instruction *I) { Out << " " << Mang->getValueName(I) << " = "; } + void printPHICopiesForSuccessors(BasicBlock *CurBlock, + unsigned Indent); void printBranchToBlock(BasicBlock *CurBlock, BasicBlock *SuccBlock, unsigned Indent); void printIndexingExpression(Value *Ptr, gep_type_iterator I, @@ -1035,6 +1038,8 @@ void CWriter::visitReturnInst(ReturnInst &I) { } void CWriter::visitSwitchInst(SwitchInst &SI) { + printPHICopiesForSuccessors(SI.getParent(), 0); + Out << " switch ("; writeOperand(SI.getOperand(0)); Out << ") {\n default:\n"; @@ -1061,7 +1066,7 @@ void CWriter::visitUnwindInst(UnwindInst &I) { assert(0 && "Lowerinvoke pass didn't work!"); } -bool isGotoCodeNecessary(BasicBlock *From, BasicBlock *To) { +static bool isGotoCodeNecessary(BasicBlock *From, BasicBlock *To) { // If PHI nodes need copies, we need the copy code... if (isa<PHINode>(To->front()) || From->getNext() != To) // Not directly successor, need goto @@ -1071,17 +1076,23 @@ bool isGotoCodeNecessary(BasicBlock *From, BasicBlock *To) { return false; } +void CWriter::printPHICopiesForSuccessors(BasicBlock *CurBlock, + unsigned Indent) { + for (succ_iterator SI = succ_begin(CurBlock), E = succ_end(CurBlock); + SI != E; ++SI) + for (BasicBlock::iterator I = SI->begin(); + PHINode *PN = dyn_cast<PHINode>(I); ++I) { + // now we have to do the printing + Out << std::string(Indent, ' '); + Out << " " << Mang->getValueName(I) << "__PHI_TEMPORARY = "; + writeOperand(PN->getIncomingValue(PN->getBasicBlockIndex(CurBlock))); + Out << "; /* for PHI node */\n"; + } +} + + void CWriter::printBranchToBlock(BasicBlock *CurBB, BasicBlock *Succ, unsigned Indent) { - for (BasicBlock::iterator I = Succ->begin(); - PHINode *PN = dyn_cast<PHINode>(I); ++I) { - // now we have to do the printing - Out << std::string(Indent, ' '); - Out << " " << Mang->getValueName(I) << "__PHI_TEMPORARY = "; - writeOperand(PN->getIncomingValue(PN->getBasicBlockIndex(CurBB))); - Out << "; /* for PHI node */\n"; - } - if (CurBB->getNext() != Succ || isa<InvokeInst>(CurBB->getTerminator()) || isa<SwitchInst>(CurBB->getTerminator())) { @@ -1095,6 +1106,8 @@ void CWriter::printBranchToBlock(BasicBlock *CurBB, BasicBlock *Succ, // that immediately succeeds the current one. // void CWriter::visitBranchInst(BranchInst &I) { + printPHICopiesForSuccessors(I.getParent(), 0); + if (I.isConditional()) { if (isGotoCodeNecessary(I.getParent(), I.getSuccessor(0))) { Out << " if ("; |