diff options
author | Chris Lattner <sabre@nondot.org> | 2005-05-14 06:34:48 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-05-14 06:34:48 +0000 |
commit | 3eb8693279f3e7de4cb84a29eb7488647d209012 (patch) | |
tree | d6f335ad1154ecfabcaa09acaacdc02273906ac5 /llvm/lib/CodeGen | |
parent | d5531333086ee6925678af9e5988f33bb7f0ff22 (diff) | |
download | bcm5719-llvm-3eb8693279f3e7de4cb84a29eb7488647d209012.tar.gz bcm5719-llvm-3eb8693279f3e7de4cb84a29eb7488647d209012.zip |
legalize target-specific operations
llvm-svn: 22010
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 3aa45289b8f..680b2ce9bca 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -197,6 +197,29 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { switch (Node->getOpcode()) { default: + if (Node->getOpcode() >= ISD::BUILTIN_OP_END) { + // If this is a target node, legalize it by legalizing the operands then + // passing it through. + std::vector<SDOperand> Ops; + bool Changed = false; + for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) { + Ops.push_back(LegalizeOp(Node->getOperand(i))); + Changed = Changed || Node->getOperand(i) != Ops.back(); + } + if (Changed) + if (Node->getNumValues() == 1) + Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Ops); + else { + std::vector<MVT::ValueType> VTs(Node->value_begin(), + Node->value_end()); + Result = DAG.getNode(Node->getOpcode(), VTs, Ops); + } + + for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i) + AddLegalizedOperand(Op.getValue(i), Result.getValue(i)); + return Result.getValue(Op.ResNo); + } + // Otherwise this is an unhandled builtin node. splat. std::cerr << "NODE: "; Node->dump(); std::cerr << "\n"; assert(0 && "Do not know how to legalize this operator!"); abort(); |