[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp

Evan Cheng evan.cheng at apple.com
Mon Aug 7 15:24:11 PDT 2006



Changes in directory llvm/lib/Target/PowerPC:

PPCISelDAGToDAG.cpp updated: 1.199 -> 1.200
---
Log message:

Match tablegen isel changes.

---
Diffs of the changes:  (+50 -101)

 PPCISelDAGToDAG.cpp |  151 +++++++++++++++++-----------------------------------
 1 files changed, 50 insertions(+), 101 deletions(-)


Index: llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
diff -u llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.199 llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.200
--- llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.199	Thu Jul 27 19:47:04 2006
+++ llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp	Mon Aug  7 17:23:56 2006
@@ -30,6 +30,7 @@
 #include "llvm/Support/MathExtras.h"
 #include "llvm/Support/Visibility.h"
 #include <iostream>
+#include <queue>
 #include <set>
 using namespace llvm;
 
@@ -123,7 +124,7 @@
         break;
       case 'o':   // offsetable
         if (!SelectAddrImm(Op, Op0, Op1)) {
-          Select(Op0, Op);     // r+0.
+          AddToQueue(Op0, Op);     // r+0.
           Op1 = getSmallIPtrImm(0);
         }
         break;
@@ -174,50 +175,9 @@
 /// SelectionDAGISel when it has created a SelectionDAG for us to codegen.
 void PPCDAGToDAGISel::InstructionSelectBasicBlock(SelectionDAG &DAG) {
   DEBUG(BB->dump());
-  
-  // The selection process is inherently a bottom-up recursive process (users
-  // select their uses before themselves).  Given infinite stack space, we
-  // could just start selecting on the root and traverse the whole graph.  In
-  // practice however, this causes us to run out of stack space on large basic
-  // blocks.  To avoid this problem, select the entry node, then all its uses,
-  // iteratively instead of recursively.
-  std::vector<SDOperand> Worklist;
-  Worklist.push_back(DAG.getEntryNode());
-  
-  // Note that we can do this in the PPC target (scanning forward across token
-  // chain edges) because no nodes ever get folded across these edges.  On a
-  // target like X86 which supports load/modify/store operations, this would
-  // have to be more careful.
-  while (!Worklist.empty()) {
-    SDOperand Node = Worklist.back();
-    Worklist.pop_back();
-
-    if ((Node.Val->getOpcode() >= ISD::BUILTIN_OP_END &&
-         Node.Val->getOpcode() < PPCISD::FIRST_NUMBER) ||
-        CodeGenMap.count(Node)) continue;
-    
-    for (SDNode::use_iterator UI = Node.Val->use_begin(),
-         E = Node.Val->use_end(); UI != E; ++UI) {
-      // Scan the values.  If this use has a value that is a token chain, add it
-      // to the worklist.
-      SDNode *User = *UI;
-      for (unsigned i = 0, e = User->getNumValues(); i != e; ++i)
-        if (User->getValueType(i) == MVT::Other) {
-          Worklist.push_back(SDOperand(User, i));
-          break; 
-        }
-    }
 
-    // Finally, legalize this node.
-    SDOperand Dummy;
-    Select(Dummy, Node);
-  }
-    
   // Select target instructions for the DAG.
   DAG.setRoot(SelectRoot(DAG.getRoot()));
-  CodeGenMap.clear();
-  HandleMap.clear();
-  ReplaceMap.clear();
   DAG.RemoveDeadNodes();
   
   // Emit machine code to BB.
@@ -493,8 +453,8 @@
       }
       
       Tmp3 = (Op0Opc == ISD::AND && DisjointMask) ? Op0.getOperand(0) : Op0;
-      Select(Tmp1, Tmp3);
-      Select(Tmp2, Op1);
+      AddToQueue(Tmp1, Tmp3);
+      AddToQueue(Tmp2, Op1);
       SH &= 31;
       return CurDAG->getTargetNode(PPC::RLWIMI, MVT::i32, Tmp1, Tmp2,
                                    getI32Imm(SH), getI32Imm(MB), getI32Imm(ME));
@@ -732,7 +692,7 @@
 SDOperand PPCDAGToDAGISel::SelectCC(SDOperand LHS, SDOperand RHS,
                                     ISD::CondCode CC) {
   // Always select the LHS.
-  Select(LHS, LHS);
+  AddToQueue(LHS, LHS);
   unsigned Opc;
   
   if (LHS.getValueType() == MVT::i32) {
@@ -771,7 +731,7 @@
     assert(LHS.getValueType() == MVT::f64 && "Unknown vt!");
     Opc = PPC::FCMPUD;
   }
-  Select(RHS, RHS);
+  AddToQueue(RHS, RHS);
   return SDOperand(CurDAG->getTargetNode(Opc, MVT::i32, LHS, RHS), 0);
 }
 
@@ -845,7 +805,7 @@
     // setcc op, 0
     if (Imm == 0) {
       SDOperand Op;
-      Select(Op, N->getOperand(0));
+      AddToQueue(Op, N->getOperand(0));
       switch (CC) {
       default: break;
       case ISD::SETEQ:
@@ -872,7 +832,7 @@
       }
     } else if (Imm == ~0U) {        // setcc op, -1
       SDOperand Op;
-      Select(Op, N->getOperand(0));
+      AddToQueue(Op, N->getOperand(0));
       switch (CC) {
       default: break;
       case ISD::SETEQ:
@@ -948,13 +908,6 @@
     return;   // Already selected.
   }
 
-  // If this has already been converted, use it.
-  std::map<SDOperand, SDOperand>::iterator CGMI = CodeGenMap.find(Op);
-  if (CGMI != CodeGenMap.end()) {
-    Result = CGMI->second;
-    return;
-  }
-  
   switch (N->getOpcode()) {
   default: break;
   case ISD::SETCC:
@@ -962,6 +915,7 @@
     return;
   case PPCISD::GlobalBaseReg:
     Result = getGlobalBaseReg();
+    ReplaceUses(Op, Result);
     return;
     
   case ISD::FrameIndex: {
@@ -973,22 +927,23 @@
                                     getSmallIPtrImm(0));
       return;
     }
-    Result = CodeGenMap[Op] = 
+    Result =
       SDOperand(CurDAG->getTargetNode(Opc, Op.getValueType(), TFI,
                                       getSmallIPtrImm(0)), 0);
+    ReplaceUses(Op, Result);
     return;
   }
 
   case PPCISD::MFCR: {
     SDOperand InFlag;
-    Select(InFlag, N->getOperand(1));
+    AddToQueue(InFlag, N->getOperand(1));
     // Use MFOCRF if supported.
     if (TLI.getTargetMachine().getSubtarget<PPCSubtarget>().isGigaProcessor())
       Result = SDOperand(CurDAG->getTargetNode(PPC::MFOCRF, MVT::i32,
                                                N->getOperand(0), InFlag), 0);
     else
       Result = SDOperand(CurDAG->getTargetNode(PPC::MFCR, MVT::i32, InFlag), 0);
-    CodeGenMap[Op] = Result;
+    ReplaceUses(Op, Result);
     return;
   }
     
@@ -1001,7 +956,7 @@
     unsigned Imm;
     if (isInt32Immediate(N->getOperand(1), Imm)) {
       SDOperand N0;
-      Select(N0, N->getOperand(0));
+      AddToQueue(N0, N->getOperand(0));
       if ((signed)Imm > 0 && isPowerOf2_32(Imm)) {
         SDNode *Op =
           CurDAG->getTargetNode(PPC::SRAWI, MVT::i32, MVT::Flag,
@@ -1033,13 +988,13 @@
       SDOperand Val;
       unsigned SH, MB, ME;
       if (isRotateAndMask(N->getOperand(0).Val, Imm, false, SH, MB, ME)) {
-        Select(Val, N->getOperand(0).getOperand(0));
+        AddToQueue(Val, N->getOperand(0).getOperand(0));
       } else if (Imm == 0) {
         // AND X, 0 -> 0, not "rlwinm 32".
-        Select(Result, N->getOperand(1));
+        AddToQueue(Result, N->getOperand(1));
         return ;
       } else {        
-        Select(Val, N->getOperand(0));
+        AddToQueue(Val, N->getOperand(0));
         isRunOfOnes(Imm, MB, ME);
         SH = 0;
       }
@@ -1057,12 +1012,13 @@
       Imm = ~(Imm^Imm2);
       if (isRunOfOnes(Imm, MB, ME)) {
         SDOperand Tmp1, Tmp2;
-        Select(Tmp1, N->getOperand(0).getOperand(0));
-        Select(Tmp2, N->getOperand(0).getOperand(1));
+        AddToQueue(Tmp1, N->getOperand(0).getOperand(0));
+        AddToQueue(Tmp2, N->getOperand(0).getOperand(1));
         Result = SDOperand(CurDAG->getTargetNode(PPC::RLWIMI, MVT::i32,
                                                  Tmp1, Tmp2,
                                                  getI32Imm(0), getI32Imm(MB),
                                                  getI32Imm(ME)), 0);
+        ReplaceUses(Op, Result);
         return;
       }
     }
@@ -1073,7 +1029,8 @@
   case ISD::OR:
     if (N->getValueType(0) == MVT::i32)
       if (SDNode *I = SelectBitfieldInsert(N)) {
-        Result = CodeGenMap[Op] = SDOperand(I, 0);
+        Result = SDOperand(I, 0);
+        ReplaceUses(Op, Result);
         return;
       }
       
@@ -1084,7 +1041,7 @@
     if (isOpcWithIntImmediate(N->getOperand(0).Val, ISD::AND, Imm) &&
         isRotateAndMask(N, Imm, true, SH, MB, ME)) {
       SDOperand Val;
-      Select(Val, N->getOperand(0).getOperand(0));
+      AddToQueue(Val, N->getOperand(0).getOperand(0));
       Result = CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, 
                                     Val, getI32Imm(SH), getI32Imm(MB),
                                     getI32Imm(ME));
@@ -1099,7 +1056,7 @@
     if (isOpcWithIntImmediate(N->getOperand(0).Val, ISD::AND, Imm) &&
         isRotateAndMask(N, Imm, true, SH, MB, ME)) { 
       SDOperand Val;
-      Select(Val, N->getOperand(0).getOperand(0));
+      AddToQueue(Val, N->getOperand(0).getOperand(0));
       Result = CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, 
                                     Val, getI32Imm(SH), getI32Imm(MB),
                                     getI32Imm(ME));
@@ -1121,7 +1078,7 @@
               // FIXME: Implement this optzn for PPC64.
               N->getValueType(0) == MVT::i32) {
             SDOperand LHS;
-            Select(LHS, N->getOperand(0));
+            AddToQueue(LHS, N->getOperand(0));
             SDNode *Tmp =
               CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, MVT::Flag,
                                     LHS, getI32Imm(~0U));
@@ -1148,15 +1105,15 @@
       SelectCCOp = PPC::SELECT_CC_VRRC;
 
     SDOperand N2, N3;
-    Select(N2, N->getOperand(2));
-    Select(N3, N->getOperand(3));
+    AddToQueue(N2, N->getOperand(2));
+    AddToQueue(N3, N->getOperand(3));
     Result = CurDAG->SelectNodeTo(N, SelectCCOp, N->getValueType(0), CCReg,
                                   N2, N3, getI32Imm(BROpc));
     return;
   }
   case ISD::BR_CC: {
     SDOperand Chain;
-    Select(Chain, N->getOperand(0));
+    AddToQueue(Chain, N->getOperand(0));
     ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(1))->get();
     SDOperand CondCode = SelectCC(N->getOperand(2), N->getOperand(3), CC);
     Result = CurDAG->SelectNodeTo(N, PPC::COND_BRANCH, MVT::Other, 
@@ -1167,8 +1124,8 @@
   case ISD::BRIND: {
     // FIXME: Should custom lower this.
     SDOperand Chain, Target;
-    Select(Chain, N->getOperand(0));
-    Select(Target,N->getOperand(1));
+    AddToQueue(Chain, N->getOperand(0));
+    AddToQueue(Target,N->getOperand(1));
     unsigned Opc = Target.getValueType() == MVT::i32 ? PPC::MTCTR : PPC::MTCTR8;
     Chain = SDOperand(CurDAG->getTargetNode(Opc, MVT::Other, Target,
                                             Chain), 0);
@@ -1198,25 +1155,23 @@
   std::vector<SDOperand> Ops;
   // Push varargs arguments, including optional flag.
   for (unsigned i = 1, e = N.getNumOperands()-hasFlag; i != e; ++i) {
-    Select(Chain, N.getOperand(i));
+    AddToQueue(Chain, N.getOperand(i));
     Ops.push_back(Chain);
   }
 
-  Select(Chain, N.getOperand(0));
+  AddToQueue(Chain, N.getOperand(0));
   Ops.push_back(Chain);
 
   if (hasFlag) {
-    Select(Chain, N.getOperand(N.getNumOperands()-1));
+    AddToQueue(Chain, N.getOperand(N.getNumOperands()-1));
     Ops.push_back(Chain);
   }
   
   ResNode = CurDAG->getTargetNode(PPC::BCTRL, MVT::Other, MVT::Flag, Ops);
   Chain = SDOperand(ResNode, 0);
   InFlag = SDOperand(ResNode, 1);
-  SelectionDAG::InsertISelMapEntry(CodeGenMap, N.Val, 0, Chain.Val,
-                                   Chain.ResNo);
-  SelectionDAG::InsertISelMapEntry(CodeGenMap, N.Val, 1, InFlag.Val,
-                                   InFlag.ResNo);
+  ReplaceUses(SDOperand(N.Val, 0), Chain);
+  ReplaceUses(SDOperand(N.Val, 1), InFlag);
   Result = SDOperand(ResNode, N.ResNo);
   return;
 }
@@ -1246,23 +1201,21 @@
     
     // Push varargs arguments, not including optional flag.
     for (unsigned i = 2, e = N.getNumOperands()-hasFlag; i != e; ++i) {
-      Select(Chain, N.getOperand(i));
+      AddToQueue(Chain, N.getOperand(i));
       Ops.push_back(Chain);
     }
-    Select(Chain, N.getOperand(0));
+    AddToQueue(Chain, N.getOperand(0));
     Ops.push_back(Chain);
     if (hasFlag) {
-      Select(Chain, N.getOperand(N.getNumOperands()-1));
+      AddToQueue(Chain, N.getOperand(N.getNumOperands()-1));
       Ops.push_back(Chain);
     }
     ResNode = CurDAG->getTargetNode(PPC::BLA, MVT::Other, MVT::Flag, Ops);
     
     Chain = SDOperand(ResNode, 0);
     InFlag = SDOperand(ResNode, 1);
-    SelectionDAG::InsertISelMapEntry(CodeGenMap, N.Val, 0, Chain.Val, 
-                                     Chain.ResNo);
-    SelectionDAG::InsertISelMapEntry(CodeGenMap, N.Val, 1, InFlag.Val, 
-                                     InFlag.ResNo);
+    ReplaceUses(SDOperand(N.Val, 0), Chain);
+    ReplaceUses(SDOperand(N.Val, 1), InFlag);
     Result = SDOperand(ResNode, N.ResNo);
     return;
   }
@@ -1279,13 +1232,13 @@
 
     // Push varargs arguments, not including optional flag.
     for (unsigned i = 2, e = N.getNumOperands()-hasFlag; i != e; ++i) {
-      Select(Chain, N.getOperand(i));
+      AddToQueue(Chain, N.getOperand(i));
       Ops.push_back(Chain);
     }
-    Select(Chain, N.getOperand(0));
+    AddToQueue(Chain, N.getOperand(0));
     Ops.push_back(Chain);
     if (hasFlag) {
-      Select(Chain, N.getOperand(N.getNumOperands()-1));
+      AddToQueue(Chain, N.getOperand(N.getNumOperands()-1));
       Ops.push_back(Chain);
     }
     
@@ -1293,10 +1246,8 @@
     
     Chain = SDOperand(ResNode, 0);
     InFlag = SDOperand(ResNode, 1);
-    SelectionDAG::InsertISelMapEntry(CodeGenMap, N.Val, 0, Chain.Val,
-                                     Chain.ResNo);
-    SelectionDAG::InsertISelMapEntry(CodeGenMap, N.Val, 1, InFlag.Val, 
-                                     InFlag.ResNo);
+    ReplaceUses(SDOperand(N.Val, 0), Chain);
+    ReplaceUses(SDOperand(N.Val, 1), InFlag);
     Result = SDOperand(ResNode, N.ResNo);
     return;
   }
@@ -1313,13 +1264,13 @@
 
     // Push varargs arguments, not including optional flag.
     for (unsigned i = 2, e = N.getNumOperands()-hasFlag; i != e; ++i) {
-      Select(Chain, N.getOperand(i));
+      AddToQueue(Chain, N.getOperand(i));
       Ops.push_back(Chain);
     }
-    Select(Chain, N.getOperand(0));
+    AddToQueue(Chain, N.getOperand(0));
     Ops.push_back(Chain);
     if (hasFlag) {
-      Select(Chain, N.getOperand(N.getNumOperands()-1));
+      AddToQueue(Chain, N.getOperand(N.getNumOperands()-1));
       Ops.push_back(Chain);
     }
     
@@ -1327,10 +1278,8 @@
 
     Chain = SDOperand(ResNode, 0);
     InFlag = SDOperand(ResNode, 1);
-    SelectionDAG::InsertISelMapEntry(CodeGenMap, N.Val, 0, Chain.Val,
-                                     Chain.ResNo);
-    SelectionDAG::InsertISelMapEntry(CodeGenMap, N.Val, 1, InFlag.Val,
-                                     InFlag.ResNo);
+    ReplaceUses(SDOperand(N.Val, 0), Chain);
+    ReplaceUses(SDOperand(N.Val, 1), InFlag);
     Result = SDOperand(ResNode, N.ResNo);
     return;
   }






More information about the llvm-commits mailing list