summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-08-30 01:57:02 +0000
committerChris Lattner <sabre@nondot.org>2005-08-30 01:57:02 +0000
commit7a59b1cf90b50bdf3ddf6ea8f69b8f70097d75d6 (patch)
tree17a0529fdd208a20cb87436434833f1cf92d4151 /llvm/lib
parent709190d540cd3d902e4173363810945162fb6c67 (diff)
downloadbcm5719-llvm-7a59b1cf90b50bdf3ddf6ea8f69b8f70097d75d6.tar.gz
bcm5719-llvm-7a59b1cf90b50bdf3ddf6ea8f69b8f70097d75d6.zip
Make sure the selector emits register register copies with flag operands
linking them to calls when appropriate, this prevents the scheduler from pulling these copies away from the call. This fixes Ptrdist/yacr2 llvm-svn: 23143
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp30
1 files changed, 20 insertions, 10 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
index f2d65697da7..06f363601a4 100644
--- a/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
+++ b/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
@@ -1512,6 +1512,8 @@ SDOperand PPC32DAGToDAGISel::Select(SDOperand Op) {
PPC::F8, PPC::F9, PPC::F10, PPC::F11, PPC::F12, PPC::F13
};
+ SDOperand InFlag; // Null incoming flag value.
+
for (unsigned i = 2, e = N->getNumOperands(); i != e; ++i) {
unsigned DestReg = 0;
MVT::ValueType RegTy;
@@ -1528,17 +1530,21 @@ SDOperand PPC32DAGToDAGISel::Select(SDOperand Op) {
}
if (N->getOperand(i).getOpcode() != ISD::UNDEF) {
- SDOperand Reg = CurDAG->getRegister(DestReg, RegTy);
- Chain = CurDAG->getNode(ISD::CopyToReg, MVT::Other, Chain, Reg,
- Select(N->getOperand(i)));
- CallOperands.push_back(Reg);
+ Chain = CurDAG->getCopyToReg(Chain, DestReg,
+ Select(N->getOperand(i)), InFlag);
+ InFlag = Chain.getValue(1);
+ CallOperands.push_back(CurDAG->getRegister(DestReg, RegTy));
}
}
// Finally, once everything is in registers to pass to the call, emit the
// call itself.
- CallOperands.push_back(Chain);
- Chain = CurDAG->getTargetNode(CallOpcode, MVT::Other, CallOperands);
+ if (InFlag.Val)
+ CallOperands.push_back(InFlag); // Strong dep on register copies.
+ else
+ CallOperands.push_back(Chain); // Weak dep on whatever occurs before
+ Chain = CurDAG->getTargetNode(CallOpcode, MVT::Other, MVT::Flag,
+ CallOperands);
std::vector<SDOperand> CallResults;
@@ -1548,18 +1554,22 @@ SDOperand PPC32DAGToDAGISel::Select(SDOperand Op) {
case MVT::Other: break;
case MVT::i32:
if (N->getValueType(1) == MVT::i32) {
- Chain = CurDAG->getCopyFromReg(Chain, PPC::R4, MVT::i32).getValue(1);
+ Chain = CurDAG->getCopyFromReg(Chain, PPC::R4, MVT::i32,
+ Chain.getValue(1)).getValue(1);
CallResults.push_back(Chain.getValue(0));
- Chain = CurDAG->getCopyFromReg(Chain, PPC::R3, MVT::i32).getValue(1);
+ Chain = CurDAG->getCopyFromReg(Chain, PPC::R3, MVT::i32,
+ Chain.getValue(1)).getValue(1);
CallResults.push_back(Chain.getValue(0));
} else {
- Chain = CurDAG->getCopyFromReg(Chain, PPC::R3, MVT::i32).getValue(1);
+ Chain = CurDAG->getCopyFromReg(Chain, PPC::R3, MVT::i32,
+ Chain.getValue(1)).getValue(1);
CallResults.push_back(Chain.getValue(0));
}
break;
case MVT::f32:
case MVT::f64:
- Chain = CurDAG->getCopyFromReg(Chain, PPC::F1, MVT::f64).getValue(1);
+ Chain = CurDAG->getCopyFromReg(Chain, PPC::F1, MVT::f64,
+ Chain.getValue(1)).getValue(1);
if (N->getValueType(0) == MVT::f64)
CallResults.push_back(Chain.getValue(0));
else
OpenPOWER on IntegriCloud