[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
Chris Lattner
lattner at cs.uiuc.edu
Wed Jan 19 12:24:48 PST 2005
Changes in directory llvm/lib/CodeGen/SelectionDAG:
LegalizeDAG.cpp updated: 1.46 -> 1.47
---
Log message:
Add support for targets that pass args in registers to calls.
---
Diffs of the changes: (+25 -6)
Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.46 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.47
--- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.46 Wed Jan 19 13:10:54 2005
+++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Wed Jan 19 14:24:35 2005
@@ -305,15 +305,23 @@
AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1));
return Result.getValue(Op.ResNo);
- case ISD::CALL:
+ case ISD::CALL: {
Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain.
Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the callee.
- if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1)) {
+
+ bool Changed = false;
+ std::vector<SDOperand> Ops;
+ for (unsigned i = 2, e = Node->getNumOperands(); i != e; ++i) {
+ Ops.push_back(LegalizeOp(Node->getOperand(i)));
+ Changed |= Ops.back() != Node->getOperand(i);
+ }
+
+ if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) || Changed) {
std::vector<MVT::ValueType> RetTyVTs;
RetTyVTs.reserve(Node->getNumValues());
for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i)
RetTyVTs.push_back(Node->getValueType(i));
- Result = SDOperand(DAG.getCall(RetTyVTs, Tmp1, Tmp2), 0);
+ Result = SDOperand(DAG.getCall(RetTyVTs, Tmp1, Tmp2, Ops), 0);
} else {
Result = Result.getValue(0);
}
@@ -322,7 +330,7 @@
for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i)
AddLegalizedOperand(SDOperand(Node, i), Result.getValue(i));
return Result.getValue(Op.ResNo);
-
+ }
case ISD::BR:
Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain.
if (Tmp1 != Node->getOperand(0))
@@ -1151,13 +1159,17 @@
Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain.
Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the callee.
+ std::vector<SDOperand> Ops;
+ for (unsigned i = 2, e = Node->getNumOperands(); i != e; ++i)
+ Ops.push_back(LegalizeOp(Node->getOperand(i)));
+
assert(Node->getNumValues() == 2 && Op.ResNo == 0 &&
"Can only promote single result calls");
std::vector<MVT::ValueType> RetTyVTs;
RetTyVTs.reserve(2);
RetTyVTs.push_back(NVT);
RetTyVTs.push_back(MVT::Other);
- SDNode *NC = DAG.getCall(RetTyVTs, Tmp1, Tmp2);
+ SDNode *NC = DAG.getCall(RetTyVTs, Tmp1, Tmp2, Ops);
Result = SDOperand(NC, 0);
// Insert the new chain mapping.
@@ -1320,6 +1332,13 @@
SDOperand Chain = LegalizeOp(Node->getOperand(0)); // Legalize the chain.
SDOperand Callee = LegalizeOp(Node->getOperand(1)); // Legalize the callee.
+ bool Changed = false;
+ std::vector<SDOperand> Ops;
+ for (unsigned i = 2, e = Node->getNumOperands(); i != e; ++i) {
+ Ops.push_back(LegalizeOp(Node->getOperand(i)));
+ Changed |= Ops.back() != Node->getOperand(i);
+ }
+
assert(Node->getNumValues() == 2 && Op.ResNo == 0 &&
"Can only expand a call once so far, not i64 -> i16!");
@@ -1328,7 +1347,7 @@
RetTyVTs.push_back(NVT);
RetTyVTs.push_back(NVT);
RetTyVTs.push_back(MVT::Other);
- SDNode *NC = DAG.getCall(RetTyVTs, Chain, Callee);
+ SDNode *NC = DAG.getCall(RetTyVTs, Chain, Callee, Ops);
Lo = SDOperand(NC, 0);
Hi = SDOperand(NC, 1);
More information about the llvm-commits
mailing list