summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/SelectionDAG
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2008-11-24 19:21:46 +0000
committerBill Wendling <isanbard@gmail.com>2008-11-24 19:21:46 +0000
commit66835479d742e248c905e9dcd87b1d8e01b5aa0b (patch)
tree6583f27af9280fa4b04e07e753973f5b5dc63df6 /llvm/lib/CodeGen/SelectionDAG
parent2e5df906f823fdc84b14095e877c3c4dda1b4b1d (diff)
downloadbcm5719-llvm-66835479d742e248c905e9dcd87b1d8e01b5aa0b.tar.gz
bcm5719-llvm-66835479d742e248c905e9dcd87b1d8e01b5aa0b.zip
- Make lowering of "add with overflow" customizable by back-ends.
- Mark "add with overflow" as having a custom lowering for X86. Give it a null lowering representation for now. llvm-svn: 59971
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp44
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp3
2 files changed, 29 insertions, 18 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
index 0e926adc312..972e4ae8c28 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
@@ -4172,22 +4172,34 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
case ISD::SADDO:
case ISD::UADDO: {
- SDValue LHS = LegalizeOp(Node->getOperand(0));
- SDValue RHS = LegalizeOp(Node->getOperand(1));
-
- SDValue Sum = DAG.getNode(ISD::ADD, LHS.getValueType(), LHS, RHS);
- MVT OType = SDValue(Node, 1).getValueType();
- SDValue Cmp = DAG.getSetCC(OType, Sum, LHS,
- (Node->getOpcode() == ISD::SADDO) ?
- ISD::SETLT : ISD::SETULT);
-
- MVT ValueVTs[] = { LHS.getValueType(), OType };
- SDValue Ops[] = { Sum, Cmp };
-
- Result = DAG.getMergeValues(DAG.getVTList(&ValueVTs[0], 2), &Ops[0], 2);
- SDNode *RNode = Result.getNode();
- DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 0), SDValue(RNode, 0));
- DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 1), SDValue(RNode, 1));
+ MVT VT = Node->getValueType(0);
+ switch (TLI.getOperationAction(Node->getOpcode(), VT)) {
+ default: assert(0 && "This action not supported for this op yet!");
+ case TargetLowering::Custom:
+ Result = TLI.LowerOperation(Op, DAG);
+ if (Result.getNode()) break;
+ // FALLTHROUGH
+ case TargetLowering::Legal: {
+ SDValue LHS = LegalizeOp(Node->getOperand(0));
+ SDValue RHS = LegalizeOp(Node->getOperand(1));
+
+ SDValue Sum = DAG.getNode(ISD::ADD, LHS.getValueType(), LHS, RHS);
+ MVT OType = Node->getValueType(1);
+ SDValue Cmp = DAG.getSetCC(OType, Sum, LHS,
+ (Node->getOpcode() == ISD::SADDO) ?
+ ISD::SETLT : ISD::SETULT);
+
+ MVT ValueVTs[] = { LHS.getValueType(), OType };
+ SDValue Ops[] = { Sum, Cmp };
+
+ Result = DAG.getMergeValues(DAG.getVTList(&ValueVTs[0], 2), &Ops[0], 2);
+ SDNode *RNode = Result.getNode();
+ DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 0), SDValue(RNode, 0));
+ DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 1), SDValue(RNode, 1));
+ break;
+ }
+ }
+
break;
}
}
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
index f3948f9ee8a..41d4425cc5b 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
@@ -4096,9 +4096,8 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
case Intrinsic::sadd_with_overflow: {
SDValue Op1 = getValue(I.getOperand(1));
SDValue Op2 = getValue(I.getOperand(2));
- MVT Ty = Op1.getValueType();
- MVT ValueVTs[] = { Ty, MVT::i1 };
+ MVT ValueVTs[] = { Op1.getValueType(), MVT::i1 };
SDValue Ops[] = { Op1, Op2 };
SDValue Result =
OpenPOWER on IntegriCloud