aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-05-09 03:42:48 +0000
committerChris Lattner <sabre@nondot.org>2004-05-09 03:42:48 +0000
commita05e0ec4197908e5c9caa5ec5c47f3c143086247 (patch)
treeaaad4e6c697ca5ec1745fb9da5667f906f0addb1 /lib/Target
parentbe97b4e9ab871214fbbb7587ac0d5cff769374e3 (diff)
downloadexternal_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
Diffstat (limited to 'lib/Target')
-rw-r--r--lib/Target/CBackend/CBackend.cpp33
-rw-r--r--lib/Target/CBackend/Writer.cpp33
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 (";