[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp SelectionDAGISel.cpp
Chris Lattner
lattner at cs.uiuc.edu
Thu Jan 12 18:50:15 PST 2006
Changes in directory llvm/lib/CodeGen/SelectionDAG:
LegalizeDAG.cpp updated: 1.260 -> 1.261
SelectionDAGISel.cpp updated: 1.122 -> 1.123
---
Log message:
Compile llvm.stacksave/restore into STACKSAVE/STACKRESTORE nodes, and allow
targets to custom expand them as they desire.
---
Diffs of the changes: (+72 -4)
LegalizeDAG.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++
SelectionDAGISel.cpp | 18 ++++++++++++---
2 files changed, 72 insertions(+), 4 deletions(-)
Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.260 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.261
--- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.260 Wed Jan 11 16:14:47 2006
+++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Thu Jan 12 20:50:02 2006
@@ -1425,6 +1425,64 @@
if (Tmp1 != Node->getOperand(0))
Result = DAG.getNode(ISD::PCMARKER, MVT::Other, Tmp1,Node->getOperand(1));
break;
+ case ISD::STACKSAVE:
+ Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain.
+ if (Tmp1 != Node->getOperand(0)) {
+ std::vector<MVT::ValueType> VTs;
+ VTs.push_back(Node->getValueType(0));
+ VTs.push_back(MVT::Other);
+ std::vector<SDOperand> Ops;
+ Ops.push_back(Tmp1);
+ Result = DAG.getNode(ISD::STACKSAVE, VTs, Ops);
+ }
+
+ switch (TLI.getOperationAction(ISD::STACKSAVE, MVT::Other)) {
+ default: assert(0 && "This action is not supported yet!");
+ case TargetLowering::Custom: {
+ SDOperand Tmp = TLI.LowerOperation(Result, DAG);
+ if (Tmp.Val) {
+ Result = LegalizeOp(Tmp);
+ break;
+ }
+ // FALLTHROUGH if the target thinks it is legal.
+ }
+ case TargetLowering::Legal:
+ // Since stacksave produce two values, make sure to remember that we
+ // legalized both of them.
+ AddLegalizedOperand(SDOperand(Node, 0), Result);
+ AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1));
+ return Result.getValue(Op.ResNo);
+ case TargetLowering::Expand:
+ Tmp1 = DAG.getNode(ISD::UNDEF, Node->getValueType(0));
+ AddLegalizedOperand(SDOperand(Node, 0), Tmp1);
+ AddLegalizedOperand(SDOperand(Node, 1), Node->getOperand(0));
+ return Op.ResNo ? Node->getOperand(0) : Tmp1;
+ }
+
+ case ISD::STACKRESTORE:
+ Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain.
+ Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the pointer.
+ if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1))
+ Result = DAG.getNode(ISD::STACKRESTORE, MVT::Other, Tmp1, Tmp2);
+
+ switch (TLI.getOperationAction(ISD::STACKRESTORE, MVT::Other)) {
+ default: assert(0 && "This action is not supported yet!");
+ case TargetLowering::Custom: {
+ SDOperand Tmp = TLI.LowerOperation(Result, DAG);
+ if (Tmp.Val) {
+ Result = LegalizeOp(Tmp);
+ break;
+ }
+ // FALLTHROUGH if the target thinks it is legal.
+ }
+ case TargetLowering::Legal:
+ break;
+ case TargetLowering::Expand:
+ Result = Tmp1;
+ break;
+ }
+ break;
+
case ISD::READCYCLECOUNTER:
Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain
if (Tmp1 != Node->getOperand(0)) {
Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.122 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.123
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.122 Thu Jan 12 20:24:42 2006
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Thu Jan 12 20:50:02 2006
@@ -1004,11 +1004,21 @@
getValue(I.getOperand(1)).getValueType(),
getValue(I.getOperand(1))));
return 0;
- case Intrinsic::stacksave:
- setValue(&I, DAG.getNode(ISD::UNDEF, TLI.getValueType(I.getType())));
- return 0; // FIXME: discard stacksave/restore
+ case Intrinsic::stacksave: {
+ std::vector<MVT::ValueType> VTs;
+ VTs.push_back(TLI.getPointerTy());
+ VTs.push_back(MVT::Other);
+ std::vector<SDOperand> Ops;
+ Ops.push_back(getRoot());
+ SDOperand Tmp = DAG.getNode(ISD::STACKSAVE, VTs, Ops);
+ setValue(&I, Tmp);
+ DAG.setRoot(Tmp.getValue(1));
+ return 0;
+ }
case Intrinsic::stackrestore:
- return 0; // FIXME: discard stacksave/restore
+ DAG.setRoot(DAG.getNode(ISD::STACKRESTORE, MVT::Other, DAG.getRoot(),
+ getValue(I.getOperand(1))));
+ return 0;
case Intrinsic::prefetch:
// FIXME: Currently discarding prefetches.
return 0;
More information about the llvm-commits
mailing list