Codegen factor nodes more intelligently according to perceived register pressure.
authorChris Lattner <sabre@nondot.org>
Thu, 13 Jan 2005 19:56:00 +0000 (19:56 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 13 Jan 2005 19:56:00 +0000 (19:56 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19532 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelPattern.cpp

index d5ec4668ad5f357f4279555a5f3a90f4caacac12..d13dbdf077fc8d0bc04bca71cf7f4135f5afe368 100644 (file)
@@ -2088,8 +2088,20 @@ void ISel::Select(SDOperand N) {
     assert(0 && "Node not handled yet!");
   case ISD::EntryToken: return;  // Noop
   case ISD::TokenFactor:
-    for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i)
-      Select(Node->getOperand(i));
+    if (Node->getNumOperands() == 2) {
+      bool OneFirst = 
+        getRegPressure(Node->getOperand(1))>getRegPressure(Node->getOperand(0));
+      Select(Node->getOperand(OneFirst));
+      Select(Node->getOperand(!OneFirst));
+    } else {
+      std::vector<std::pair<unsigned, unsigned> > OpsP;
+      for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i)
+        OpsP.push_back(std::make_pair(getRegPressure(Node->getOperand(i)), i));
+      std::sort(OpsP.begin(), OpsP.end());
+      std::reverse(OpsP.begin(), OpsP.end());
+      for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i)
+        Select(Node->getOperand(OpsP[i].second));
+    }
     return;
   case ISD::CopyToReg:
     if (getRegPressure(N.getOperand(0)) > getRegPressure(N.getOperand(1))) {