[llvm-commits] CVS: llvm/lib/Target/CBackend/Writer.cpp

John Criswell criswell at cs.uiuc.edu
Wed Oct 20 07:38:53 PDT 2004



Changes in directory llvm/lib/Target/CBackend:

Writer.cpp updated: 1.204 -> 1.205
---
Log message:

Small performance improvement in generated C code:
Instead of unconditionally copying all phi node values into temporaries for
all successor blocks, generate code that will determine what successor
block will be called and then copy only those phi node values needed by
the successor block.

This seems to cut down namd execution time from being 8% higher than GCC to
4% higher than GCC.


---
Diffs of the changes:  (+23 -1)

Index: llvm/lib/Target/CBackend/Writer.cpp
diff -u llvm/lib/Target/CBackend/Writer.cpp:1.204 llvm/lib/Target/CBackend/Writer.cpp:1.205
--- llvm/lib/Target/CBackend/Writer.cpp:1.204	Sun Oct 17 18:49:11 2004
+++ llvm/lib/Target/CBackend/Writer.cpp	Wed Oct 20 09:38:39 2004
@@ -204,6 +204,8 @@
     }
 
     bool isGotoCodeNecessary(BasicBlock *From, BasicBlock *To);
+    void printPHICopiesForSuccessor(BasicBlock *CurBlock,
+                                    BasicBlock *Successor, unsigned Indent);
     void printPHICopiesForSuccessors(BasicBlock *CurBlock, 
                                      unsigned Indent);
     void printBranchToBlock(BasicBlock *CurBlock, BasicBlock *SuccBlock,
@@ -1230,6 +1232,23 @@
   return false;
 }
 
+void CWriter::printPHICopiesForSuccessor (BasicBlock *CurBlock,
+                                          BasicBlock *Successor, 
+                                          unsigned Indent) {
+  for (BasicBlock::iterator I = Successor->begin(); isa<PHINode>(I); ++I) {
+    PHINode *PN = cast<PHINode>(I);
+    // Now we have to do the printing.
+    Value *IV = PN->getIncomingValueForBlock(CurBlock);
+    if (!isa<UndefValue>(IV)) {
+      Out << std::string(Indent, ' ');
+      Out << "  " << Mang->getValueName(I) << "__PHI_TEMPORARY = ";
+      writeOperand(IV);
+      Out << ";   /* for PHI node */\n";
+    }
+  }
+}
+
+
 void CWriter::printPHICopiesForSuccessors(BasicBlock *CurBlock, 
                                           unsigned Indent) {
   for (succ_iterator SI = succ_begin(CurBlock), E = succ_end(CurBlock);
@@ -1261,7 +1280,6 @@
 // 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))) {
@@ -1269,10 +1287,12 @@
       writeOperand(I.getCondition());
       Out << ") {\n";
       
+      printPHICopiesForSuccessor (I.getParent(), I.getSuccessor(0), 2);
       printBranchToBlock(I.getParent(), I.getSuccessor(0), 2);
       
       if (isGotoCodeNecessary(I.getParent(), I.getSuccessor(1))) {
         Out << "  } else {\n";
+        printPHICopiesForSuccessor (I.getParent(), I.getSuccessor(1), 2);
         printBranchToBlock(I.getParent(), I.getSuccessor(1), 2);
       }
     } else {
@@ -1281,11 +1301,13 @@
       writeOperand(I.getCondition());
       Out << ") {\n";
 
+      printPHICopiesForSuccessor (I.getParent(), I.getSuccessor(1), 2);
       printBranchToBlock(I.getParent(), I.getSuccessor(1), 2);
     }
 
     Out << "  }\n";
   } else {
+    printPHICopiesForSuccessor (I.getParent(), I.getSuccessor(0), 0);
     printBranchToBlock(I.getParent(), I.getSuccessor(0), 0);
   }
   Out << "\n";






More information about the llvm-commits mailing list