another couple selects
authorAndrew Lenharth <andrewl@lenharth.org>
Mon, 23 Jan 2006 21:51:14 +0000 (21:51 +0000)
committerAndrew Lenharth <andrewl@lenharth.org>
Mon, 23 Jan 2006 21:51:14 +0000 (21:51 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25551 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/SelectionDAG.h
include/llvm/CodeGen/SelectionDAGNodes.h
lib/CodeGen/SelectionDAG/SelectionDAG.cpp

index 1991cd3efedf91907478c7adc682efc3b109ccb5..f9d7172672e9ee169168c13b098e02866501cd3a 100644 (file)
@@ -318,6 +318,10 @@ public:
                          SDOperand Op1, SDOperand Op2, SDOperand Op3,
                          SDOperand Op4, SDOperand Op5, SDOperand Op6,
                         SDOperand Op7);
+  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT, 
+                         SDOperand Op1, SDOperand Op2, SDOperand Op3,
+                         SDOperand Op4, SDOperand Op5, SDOperand Op6,
+                        SDOperand Op7, SDOperand Op8);
   SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1, 
                          MVT::ValueType VT2, SDOperand Op1, SDOperand Op2);
   SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1,
@@ -383,6 +387,22 @@ public:
     Ops.push_back(Op7);
     return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Ops);
   }
+  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
+                          SDOperand Op1, SDOperand Op2, SDOperand Op3,
+                          SDOperand Op4, SDOperand Op5, SDOperand Op6,
+                          SDOperand Op7, SDOperand Op8) {
+    std::vector<SDOperand> Ops;
+    Ops.reserve(8);
+    Ops.push_back(Op1);
+    Ops.push_back(Op2);
+    Ops.push_back(Op3);
+    Ops.push_back(Op4);
+    Ops.push_back(Op5);
+    Ops.push_back(Op6);
+    Ops.push_back(Op7);
+    Ops.push_back(Op8);
+    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Ops);
+  }
   SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
                           std::vector<SDOperand> &Ops) {
     return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Ops);
index 7b4242903144ed50194910b8e96d479e1f20155d..5cb2d1c9dcce6e7bdb48919821b4d35b70f7bf22 100644 (file)
@@ -856,6 +856,24 @@ protected:
     Op4.Val->Uses.push_back(this); Op5.Val->Uses.push_back(this);
     Op6.Val->Uses.push_back(this);
   }
+  void setOperands(SDOperand Op0, SDOperand Op1, SDOperand Op2, SDOperand Op3,
+                   SDOperand Op4, SDOperand Op5, SDOperand Op6, SDOperand Op7) {
+    assert(NumOperands == 0 && "Should not have operands yet!");
+    OperandList = new SDOperand[8];
+    OperandList[0] = Op0;
+    OperandList[1] = Op1;
+    OperandList[2] = Op2;
+    OperandList[3] = Op3;
+    OperandList[4] = Op4;
+    OperandList[5] = Op5;
+    OperandList[6] = Op6;
+    OperandList[7] = Op7;
+    NumOperands = 8;
+    Op0.Val->Uses.push_back(this); Op1.Val->Uses.push_back(this);
+    Op2.Val->Uses.push_back(this); Op3.Val->Uses.push_back(this);
+    Op4.Val->Uses.push_back(this); Op5.Val->Uses.push_back(this);
+    Op6.Val->Uses.push_back(this); Op7.Val->Uses.push_back(this);
+  }
 
   void addUser(SDNode *User) {
     Uses.push_back(User);
index 3165fc1d651289be55bfe041c4c2e7ca4224ab98..c1ba5ebc4ab95fbf5351df6d3b14d05a751b6414 100644 (file)
@@ -1671,6 +1671,28 @@ SDOperand SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
   ON = N;   // Memoize the new node.
   return SDOperand(N, 0);
 }
+SDOperand SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
+                                     MVT::ValueType VT, SDOperand Op1,
+                                     SDOperand Op2, SDOperand Op3,SDOperand Op4,
+                                     SDOperand Op5, SDOperand Op6,
+                                    SDOperand Op7, SDOperand Op8) {
+  // If an identical node already exists, use it.
+  std::vector<SDOperand> OpList;
+  OpList.push_back(Op1); OpList.push_back(Op2); OpList.push_back(Op3);
+  OpList.push_back(Op4); OpList.push_back(Op5); OpList.push_back(Op6);
+  OpList.push_back(Op7); OpList.push_back(Op8);
+  SDNode *&ON = OneResultNodes[std::make_pair(ISD::BUILTIN_OP_END+TargetOpc,
+                                              std::make_pair(VT, OpList))];
+  if (ON) return SDOperand(ON, 0);
+
+  RemoveNodeFromCSEMaps(N);
+  N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc);
+  N->setValueTypes(VT);
+  N->setOperands(Op1, Op2, Op3, Op4, Op5, Op6, Op7, Op8);
+  
+  ON = N;   // Memoize the new node.
+  return SDOperand(N, 0);
+}
 
 SDOperand SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc, 
                                      MVT::ValueType VT1, MVT::ValueType VT2,