diff options
Diffstat (limited to 'contrib/llvm/lib/Target/MSP430/MSP430ISelDAGToDAG.cpp')
-rw-r--r-- | contrib/llvm/lib/Target/MSP430/MSP430ISelDAGToDAG.cpp | 134 |
1 files changed, 57 insertions, 77 deletions
diff --git a/contrib/llvm/lib/Target/MSP430/MSP430ISelDAGToDAG.cpp b/contrib/llvm/lib/Target/MSP430/MSP430ISelDAGToDAG.cpp index 8a01334ee2dd..69c609d04b5e 100644 --- a/contrib/llvm/lib/Target/MSP430/MSP430ISelDAGToDAG.cpp +++ b/contrib/llvm/lib/Target/MSP430/MSP430ISelDAGToDAG.cpp @@ -24,7 +24,6 @@ #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/Function.h" #include "llvm/IR/Intrinsics.h" -#include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" @@ -111,10 +110,10 @@ namespace { #include "MSP430GenDAGISel.inc" private: - SDNode *Select(SDNode *N) override; - SDNode *SelectIndexedLoad(SDNode *Op); - SDNode *SelectIndexedBinOp(SDNode *Op, SDValue N1, SDValue N2, - unsigned Opc8, unsigned Opc16); + void Select(SDNode *N) override; + bool tryIndexedLoad(SDNode *Op); + bool tryIndexedBinOp(SDNode *Op, SDValue N1, SDValue N2, unsigned Opc8, + unsigned Opc16); bool SelectAddr(SDValue Addr, SDValue &Base, SDValue &Disp); }; @@ -324,10 +323,10 @@ static bool isValidIndexedLoad(const LoadSDNode *LD) { return true; } -SDNode *MSP430DAGToDAGISel::SelectIndexedLoad(SDNode *N) { +bool MSP430DAGToDAGISel::tryIndexedLoad(SDNode *N) { LoadSDNode *LD = cast<LoadSDNode>(N); if (!isValidIndexedLoad(LD)) - return nullptr; + return false; MVT VT = LD->getMemoryVT().getSimpleVT(); @@ -340,23 +339,23 @@ SDNode *MSP430DAGToDAGISel::SelectIndexedLoad(SDNode *N) { Opcode = MSP430::MOV16rm_POST; break; default: - return nullptr; + return false; } - return CurDAG->getMachineNode(Opcode, SDLoc(N), - VT, MVT::i16, MVT::Other, - LD->getBasePtr(), LD->getChain()); + ReplaceNode(N, + CurDAG->getMachineNode(Opcode, SDLoc(N), VT, MVT::i16, MVT::Other, + LD->getBasePtr(), LD->getChain())); + return true; } -SDNode *MSP430DAGToDAGISel::SelectIndexedBinOp(SDNode *Op, - SDValue N1, SDValue N2, - unsigned Opc8, unsigned Opc16) { +bool MSP430DAGToDAGISel::tryIndexedBinOp(SDNode *Op, SDValue N1, SDValue N2, + unsigned Opc8, unsigned Opc16) { if (N1.getOpcode() == ISD::LOAD && N1.hasOneUse() && IsLegalToFold(N1, Op, Op, OptLevel)) { LoadSDNode *LD = cast<LoadSDNode>(N1); if (!isValidIndexedLoad(LD)) - return nullptr; + return false; MVT VT = LD->getMemoryVT().getSimpleVT(); unsigned Opc = (VT == MVT::i16 ? Opc16 : Opc8); @@ -370,14 +369,14 @@ SDNode *MSP430DAGToDAGISel::SelectIndexedBinOp(SDNode *Op, ReplaceUses(SDValue(N1.getNode(), 2), SDValue(ResNode, 2)); // Transfer writeback. ReplaceUses(SDValue(N1.getNode(), 1), SDValue(ResNode, 1)); - return ResNode; + return true; } - return nullptr; + return false; } -SDNode *MSP430DAGToDAGISel::Select(SDNode *Node) { +void MSP430DAGToDAGISel::Select(SDNode *Node) { SDLoc dl(Node); // Dump information about the Node being selected @@ -391,7 +390,7 @@ SDNode *MSP430DAGToDAGISel::Select(SDNode *Node) { Node->dump(CurDAG); errs() << "\n"); Node->setNodeId(-1); - return nullptr; + return; } // Few custom selection stuff. @@ -401,89 +400,70 @@ SDNode *MSP430DAGToDAGISel::Select(SDNode *Node) { assert(Node->getValueType(0) == MVT::i16); int FI = cast<FrameIndexSDNode>(Node)->getIndex(); SDValue TFI = CurDAG->getTargetFrameIndex(FI, MVT::i16); - if (Node->hasOneUse()) - return CurDAG->SelectNodeTo(Node, MSP430::ADD16ri, MVT::i16, TFI, - CurDAG->getTargetConstant(0, dl, MVT::i16)); - return CurDAG->getMachineNode(MSP430::ADD16ri, dl, MVT::i16, TFI, - CurDAG->getTargetConstant(0, dl, MVT::i16)); + if (Node->hasOneUse()) { + CurDAG->SelectNodeTo(Node, MSP430::ADD16ri, MVT::i16, TFI, + CurDAG->getTargetConstant(0, dl, MVT::i16)); + return; + } + ReplaceNode(Node, CurDAG->getMachineNode( + MSP430::ADD16ri, dl, MVT::i16, TFI, + CurDAG->getTargetConstant(0, dl, MVT::i16))); + return; } case ISD::LOAD: - if (SDNode *ResNode = SelectIndexedLoad(Node)) - return ResNode; + if (tryIndexedLoad(Node)) + return; // Other cases are autogenerated. break; case ISD::ADD: - if (SDNode *ResNode = - SelectIndexedBinOp(Node, - Node->getOperand(0), Node->getOperand(1), - MSP430::ADD8rm_POST, MSP430::ADD16rm_POST)) - return ResNode; - else if (SDNode *ResNode = - SelectIndexedBinOp(Node, Node->getOperand(1), Node->getOperand(0), - MSP430::ADD8rm_POST, MSP430::ADD16rm_POST)) - return ResNode; + if (tryIndexedBinOp(Node, Node->getOperand(0), Node->getOperand(1), + MSP430::ADD8rm_POST, MSP430::ADD16rm_POST)) + return; + else if (tryIndexedBinOp(Node, Node->getOperand(1), Node->getOperand(0), + MSP430::ADD8rm_POST, MSP430::ADD16rm_POST)) + return; // Other cases are autogenerated. break; case ISD::SUB: - if (SDNode *ResNode = - SelectIndexedBinOp(Node, - Node->getOperand(0), Node->getOperand(1), - MSP430::SUB8rm_POST, MSP430::SUB16rm_POST)) - return ResNode; + if (tryIndexedBinOp(Node, Node->getOperand(0), Node->getOperand(1), + MSP430::SUB8rm_POST, MSP430::SUB16rm_POST)) + return; // Other cases are autogenerated. break; case ISD::AND: - if (SDNode *ResNode = - SelectIndexedBinOp(Node, - Node->getOperand(0), Node->getOperand(1), - MSP430::AND8rm_POST, MSP430::AND16rm_POST)) - return ResNode; - else if (SDNode *ResNode = - SelectIndexedBinOp(Node, Node->getOperand(1), Node->getOperand(0), - MSP430::AND8rm_POST, MSP430::AND16rm_POST)) - return ResNode; + if (tryIndexedBinOp(Node, Node->getOperand(0), Node->getOperand(1), + MSP430::AND8rm_POST, MSP430::AND16rm_POST)) + return; + else if (tryIndexedBinOp(Node, Node->getOperand(1), Node->getOperand(0), + MSP430::AND8rm_POST, MSP430::AND16rm_POST)) + return; // Other cases are autogenerated. break; case ISD::OR: - if (SDNode *ResNode = - SelectIndexedBinOp(Node, - Node->getOperand(0), Node->getOperand(1), - MSP430::OR8rm_POST, MSP430::OR16rm_POST)) - return ResNode; - else if (SDNode *ResNode = - SelectIndexedBinOp(Node, Node->getOperand(1), Node->getOperand(0), - MSP430::OR8rm_POST, MSP430::OR16rm_POST)) - return ResNode; + if (tryIndexedBinOp(Node, Node->getOperand(0), Node->getOperand(1), + MSP430::OR8rm_POST, MSP430::OR16rm_POST)) + return; + else if (tryIndexedBinOp(Node, Node->getOperand(1), Node->getOperand(0), + MSP430::OR8rm_POST, MSP430::OR16rm_POST)) + return; // Other cases are autogenerated. break; case ISD::XOR: - if (SDNode *ResNode = - SelectIndexedBinOp(Node, - Node->getOperand(0), Node->getOperand(1), - MSP430::XOR8rm_POST, MSP430::XOR16rm_POST)) - return ResNode; - else if (SDNode *ResNode = - SelectIndexedBinOp(Node, Node->getOperand(1), Node->getOperand(0), - MSP430::XOR8rm_POST, MSP430::XOR16rm_POST)) - return ResNode; + if (tryIndexedBinOp(Node, Node->getOperand(0), Node->getOperand(1), + MSP430::XOR8rm_POST, MSP430::XOR16rm_POST)) + return; + else if (tryIndexedBinOp(Node, Node->getOperand(1), Node->getOperand(0), + MSP430::XOR8rm_POST, MSP430::XOR16rm_POST)) + return; // Other cases are autogenerated. break; } // Select the default instruction - SDNode *ResNode = SelectCode(Node); - - DEBUG(errs() << "=> "); - if (ResNode == nullptr || ResNode == Node) - DEBUG(Node->dump(CurDAG)); - else - DEBUG(ResNode->dump(CurDAG)); - DEBUG(errs() << "\n"); - - return ResNode; + SelectCode(Node); } |