Make fsel emission work with both the pattern and dag-dag selectors, by
authorChris Lattner <sabre@nondot.org>
Fri, 26 Aug 2005 20:25:03 +0000 (20:25 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 26 Aug 2005 20:25:03 +0000 (20:25 +0000)
giving it a non-instruction opcode.  The dag->dag selector used to not
select the operands of the fsel, because it thought that whole tree was
already selected.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23091 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/PPCISelDAGToDAG.cpp
lib/Target/PowerPC/PPCISelLowering.cpp
lib/Target/PowerPC/PPCISelLowering.h
lib/Target/PowerPC/PPCISelPattern.cpp

index 8c0d6d00bec259a0e219b94786b9ba28312bdb70..934f811fb14524cdc76492491dce00272f21f638 100644 (file)
@@ -629,7 +629,8 @@ SDOperand PPC32DAGToDAGISel::BuildUDIVSequence(SDNode *N) {
 // target-specific node if it hasn't already been changed.
 SDOperand PPC32DAGToDAGISel::Select(SDOperand Op) {
   SDNode *N = Op.Val;
-  if (N->getOpcode() >= ISD::BUILTIN_OP_END)
+  if (N->getOpcode() >= ISD::BUILTIN_OP_END &&
+      N->getOpcode() < PPCISD::FIRST_NUMBER)
     return Op;   // Already selected.
   
   switch (N->getOpcode()) {
@@ -747,6 +748,12 @@ SDOperand PPC32DAGToDAGISel::Select(SDOperand Op) {
     assert(N->getValueType(0) == MVT::i32);
     CurDAG->SelectNodeTo(N, PPC::CNTLZW, MVT::i32, Select(N->getOperand(0)));
     break;
+  case PPCISD::FSEL:
+    CurDAG->SelectNodeTo(N, PPC::FSEL, N->getValueType(0),
+                         Select(N->getOperand(0)),
+                         Select(N->getOperand(1)),
+                         Select(N->getOperand(2)));
+    break;
   case ISD::ADD: {
     MVT::ValueType Ty = N->getValueType(0);
     if (Ty == MVT::i32) {
index 7d46477b33951e79168b06a00625923b4aaf065c..d84552c5c0a6143bc15a1b4a003c5c95c197ec20 100644 (file)
@@ -125,34 +125,34 @@ SDOperand PPC32TargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
           std::swap(TV, FV);  // fsel is natively setge, swap operands for setlt
         case ISD::SETUGE:
         case ISD::SETGE:
-          return DAG.getTargetNode(PPC::FSEL, ResVT, LHS, TV, FV);
+          return DAG.getNode(PPCISD::FSEL, ResVT, LHS, TV, FV);
         case ISD::SETUGT:
         case ISD::SETGT:
           std::swap(TV, FV);  // fsel is natively setge, swap operands for setlt
         case ISD::SETULE:
         case ISD::SETLE:
-          return DAG.getTargetNode(PPC::FSEL, ResVT,
-                                   DAG.getNode(ISD::FNEG, ResVT, LHS), TV, FV);
+          return DAG.getNode(PPCISD::FSEL, ResVT,
+                             DAG.getNode(ISD::FNEG, ResVT, LHS), TV, FV);
         }
       
       switch (CC) {
       default: assert(0 && "Invalid FSEL condition"); abort();
       case ISD::SETULT:
       case ISD::SETLT:
-        return DAG.getTargetNode(PPC::FSEL, ResVT,
-                                 DAG.getNode(ISD::SUB, CmpVT, LHS, RHS), FV,TV);
+        return DAG.getNode(PPCISD::FSEL, ResVT,
+                           DAG.getNode(ISD::SUB, CmpVT, LHS, RHS), FV, TV);
       case ISD::SETUGE:
       case ISD::SETGE:
-        return DAG.getTargetNode(PPC::FSEL, ResVT,
-                                 DAG.getNode(ISD::SUB, CmpVT, LHS, RHS), TV,FV);
+        return DAG.getNode(PPCISD::FSEL, ResVT,
+                           DAG.getNode(ISD::SUB, CmpVT, LHS, RHS), TV, FV);
       case ISD::SETUGT:
       case ISD::SETGT:
-        return DAG.getTargetNode(PPC::FSEL, ResVT,
-                                 DAG.getNode(ISD::SUB, CmpVT, RHS, LHS), FV,TV);
+        return DAG.getNode(PPCISD::FSEL, ResVT,
+                           DAG.getNode(ISD::SUB, CmpVT, RHS, LHS), FV, TV);
       case ISD::SETULE:
       case ISD::SETLE:
-        return DAG.getTargetNode(PPC::FSEL, ResVT,
-                                 DAG.getNode(ISD::SUB, CmpVT, RHS, LHS), TV,FV);
+        return DAG.getNode(PPCISD::FSEL, ResVT,
+                           DAG.getNode(ISD::SUB, CmpVT, RHS, LHS), TV, FV);
       }
     }
     break;    
index aa01934aa1e30d9303bab59d04dc87a74ff9dfb2..b2dd4daedde9126955276e03644ce0971fc856d1 100644 (file)
@@ -1,4 +1,4 @@
-//===-- PPC32ISelLowering.cpp - PPC32 DAG Lowering Impl. --------*- C++ -*-===//
+//===-- PPC32ISelLowering.h - PPC32 DAG Lowering Interface ------*- C++ -*-===//
 //
 //                     The LLVM Compiler Infrastructure
 //
 #define LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H
 
 #include "llvm/Target/TargetLowering.h"
+#include "llvm/CodeGen/SelectionDAG.h"
+#include "PowerPC.h"
 
 namespace llvm {
+  namespace PPCISD {
+    enum NodeType {
+      // Start the numbering where the builting ops and target ops leave off.
+      FIRST_NUMBER = ISD::BUILTIN_OP_END+PPC::INSTRUCTION_LIST_END,
+
+      /// FSEL - Traditional three-operand fsel node.
+      ///
+      FSEL,
+    };
+  }  
+  
   class PPC32TargetLowering : public TargetLowering {
     int VarArgsFrameIndex;            // FrameIndex for start of varargs area.
     int ReturnAddrIndex;              // FrameIndex for return slot.
index de87667b634b412805c8715467ac20850e5b3720..50b10e41f14a7b29a855699ddd319b4528a07ec1 100644 (file)
@@ -811,7 +811,7 @@ unsigned ISel::SelectExpr(SDOperand N, bool Recording) {
   default:
     Node->dump(); std::cerr << '\n';
     assert(0 && "Node not handled!\n");
-  case ISD::BUILTIN_OP_END+PPC::FSEL:
+  case PPCISD::FSEL:
     Tmp1 = SelectExpr(N.getOperand(0));
     Tmp2 = SelectExpr(N.getOperand(1));
     Tmp3 = SelectExpr(N.getOperand(2));