[llvm-branch-commits] [llvm-branch] r95883 - in /llvm/branches/Apple/Hermes/lib/CodeGen: SelectionDAG/SelectionDAGBuilder.cpp TailDuplication.cpp

Jakob Stoklund Olesen stoklund at 2pi.dk
Thu Feb 11 10:09:34 PST 2010


Author: stoklund
Date: Thu Feb 11 12:09:34 2010
New Revision: 95883

URL: http://llvm.org/viewvc/llvm-project?rev=95883&view=rev
Log:
$ svn merge -c 95831 https://llvm.org/svn/llvm-project/llvm/trunk
--- Merging r95831 into '.':
U    lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
$ svn merge -c 95832 https://llvm.org/svn/llvm-project/llvm/trunk
--- Merging r95832 into '.':
U    lib/CodeGen/TailDuplication.cpp
$ svn merge -c 95879 https://llvm.org/svn/llvm-project/llvm/trunk
--- Merging r95879 into '.':
G    lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp


Modified:
    llvm/branches/Apple/Hermes/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
    llvm/branches/Apple/Hermes/lib/CodeGen/TailDuplication.cpp

Modified: llvm/branches/Apple/Hermes/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Hermes/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=95883&r1=95882&r2=95883&view=diff

==============================================================================
--- llvm/branches/Apple/Hermes/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original)
+++ llvm/branches/Apple/Hermes/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Thu Feb 11 12:09:34 2010
@@ -2062,9 +2062,15 @@
 }
 
 void SelectionDAGBuilder::visitIndirectBr(IndirectBrInst &I) {
-  // Update machine-CFG edges.
+  // Update machine-CFG edges with unique successors.
+  SmallVector<BasicBlock*, 32> succs;
+  succs.reserve(I.getNumSuccessors());
   for (unsigned i = 0, e = I.getNumSuccessors(); i != e; ++i)
-    CurMBB->addSuccessor(FuncInfo.MBBMap[I.getSuccessor(i)]);
+    succs.push_back(I.getSuccessor(i));
+  array_pod_sort(succs.begin(), succs.end());
+  succs.erase(std::unique(succs.begin(), succs.end()), succs.end());
+  for (unsigned i = 0, e = succs.size(); i != e; ++i)
+    CurMBB->addSuccessor(FuncInfo.MBBMap[succs[i]]);
 
   DAG.setRoot(DAG.getNode(ISD::BRIND, getCurDebugLoc(),
                           MVT::Other, getControlRoot(),

Modified: llvm/branches/Apple/Hermes/lib/CodeGen/TailDuplication.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Hermes/lib/CodeGen/TailDuplication.cpp?rev=95883&r1=95882&r2=95883&view=diff

==============================================================================
--- llvm/branches/Apple/Hermes/lib/CodeGen/TailDuplication.cpp (original)
+++ llvm/branches/Apple/Hermes/lib/CodeGen/TailDuplication.cpp Thu Feb 11 12:09:34 2010
@@ -403,26 +403,45 @@
             II->RemoveOperand(i);
           }
         }
-        II->RemoveOperand(Idx+1);
-        II->RemoveOperand(Idx);
-      }
+      } else
+        Idx = 0;
+
+      // If Idx is set, the operands at Idx and Idx+1 must be removed.
+      // We reuse the location to avoid expensive RemoveOperand calls.
+
       DenseMap<unsigned,AvailableValsTy>::iterator LI=SSAUpdateVals.find(Reg);
       if (LI != SSAUpdateVals.end()) {
         // This register is defined in the tail block.
         for (unsigned j = 0, ee = LI->second.size(); j != ee; ++j) {
           MachineBasicBlock *SrcBB = LI->second[j].first;
           unsigned SrcReg = LI->second[j].second;
-          II->addOperand(MachineOperand::CreateReg(SrcReg, false));
-          II->addOperand(MachineOperand::CreateMBB(SrcBB));
+          if (Idx != 0) {
+            II->getOperand(Idx).setReg(SrcReg);
+            II->getOperand(Idx+1).setMBB(SrcBB);
+            Idx = 0;
+          } else {
+            II->addOperand(MachineOperand::CreateReg(SrcReg, false));
+            II->addOperand(MachineOperand::CreateMBB(SrcBB));
+          }
         }
       } else {
         // Live in tail block, must also be live in predecessors.
         for (unsigned j = 0, ee = TDBBs.size(); j != ee; ++j) {
           MachineBasicBlock *SrcBB = TDBBs[j];
-          II->addOperand(MachineOperand::CreateReg(Reg, false));
-          II->addOperand(MachineOperand::CreateMBB(SrcBB));
+          if (Idx != 0) {
+            II->getOperand(Idx).setReg(Reg);
+            II->getOperand(Idx+1).setMBB(SrcBB);
+            Idx = 0;
+          } else {
+            II->addOperand(MachineOperand::CreateReg(Reg, false));
+            II->addOperand(MachineOperand::CreateMBB(SrcBB));
+          }
         }
       }
+      if (Idx != 0) {
+        II->RemoveOperand(Idx+1);
+        II->RemoveOperand(Idx);
+      }
     }
   }
 }





More information about the llvm-branch-commits mailing list