[llvm-commits] CVS: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
Evan Cheng
evan.cheng at apple.com
Fri May 19 18:37:04 PDT 2006
Changes in directory llvm/lib/Target/X86:
X86ISelDAGToDAG.cpp updated: 1.61 -> 1.62
---
Log message:
Handle indirect call which folds a load manually. This never matches by
the TableGen generated code since the load's chain result is read by
the callseq_start node.
---
Diffs of the changes: (+58 -0)
X86ISelDAGToDAG.cpp | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 58 insertions(+)
Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.61 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.62
--- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.61 Tue May 16 02:21:53 2006
+++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Fri May 19 20:36:52 2006
@@ -516,6 +516,13 @@
return CurDAG->getRegister(GlobalBaseReg, MVT::i32);
}
+static SDNode *FindCallStartFromCall(SDNode *Node) {
+ if (Node->getOpcode() == ISD::CALLSEQ_START) return Node;
+ assert(Node->getOperand(0).getValueType() == MVT::Other &&
+ "Node doesn't have a token chain argument!");
+ return FindCallStartFromCall(Node->getOperand(0).Val);
+}
+
void X86DAGToDAGISel::Select(SDOperand &Result, SDOperand N) {
SDNode *Node = N.Val;
MVT::ValueType NVT = Node->getValueType(0);
@@ -826,6 +833,57 @@
return;
}
}
+
+ case X86ISD::CALL: {
+ // Handle indirect call which folds a load here. This never matches by
+ // the TableGen generated code since the load's chain result is read by
+ // the callseq_start node.
+ SDOperand N1 = Node->getOperand(1);
+ if (N1.getOpcode() == ISD::LOAD && N1.hasOneUse() &&
+ !CodeGenMap.count(N1.getValue(0))) {
+ SDOperand Chain = Node->getOperand(0);
+ SDNode *CallStart = FindCallStartFromCall(Chain.Val);
+ if (!CallStart || CallStart->getOperand(0).Val != N1.Val)
+ break;
+ SDOperand Base, Scale, Index, Disp;
+ if (SelectAddr(N1.getOperand(1), Base, Scale, Index, Disp)) {
+ Select(Base, Base);
+ Select(Scale, Scale);
+ Select(Index, Index);
+ Select(Disp, Disp);
+ Select(Chain, Chain);
+ bool HasOptInFlag = false;
+ SDOperand InFlag;
+ if (N.getNumOperands() == 3) {
+ Select(InFlag, N.getOperand(2));
+ HasOptInFlag = true;
+ }
+ SDNode *ResNode;
+ if (HasOptInFlag)
+ ResNode = CurDAG->getTargetNode(X86::CALL32m, MVT::Other, MVT::Flag,
+ Base, Scale, Index, Disp, Chain,
+ InFlag);
+ else
+ ResNode = CurDAG->getTargetNode(X86::CALL32m, MVT::Other, MVT::Flag,
+ Base, Scale, Index, Disp, Chain);
+
+ SelectionDAG::InsertISelMapEntry(CodeGenMap, N.Val, 0, Chain.Val,
+ Chain.ResNo);
+ SelectionDAG::InsertISelMapEntry(CodeGenMap, N1.Val, 1, ResNode, 0);
+ SelectionDAG::InsertISelMapEntry(CodeGenMap, N.Val, 1, ResNode, 1);
+ Result = SDOperand(ResNode, 0);
+
+#ifndef NDEBUG
+ DEBUG(std::cerr << std::string(Indent-2, ' '));
+ DEBUG(std::cerr << "== ");
+ DEBUG(Result.Val->dump(CurDAG));
+ DEBUG(std::cerr << "\n");
+ Indent -= 2;
+#endif
+ return;
+ }
+ }
+ }
}
SelectCode(Result, N);
More information about the llvm-commits
mailing list