summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNAKAMURA Takumi <geek4civic@gmail.com>2012-08-30 15:52:29 +0000
committerNAKAMURA Takumi <geek4civic@gmail.com>2012-08-30 15:52:29 +0000
commitd2a35f2937af443241fc3d1b0c6104a587170f24 (patch)
tree65816637c3f9a1c0c2fe53e7ccc3a8ba205c8334
parent25f6b5a5541e34f8e703f0b5e090e4910dc9d0d7 (diff)
PPCISelLowering.cpp: Fix r162725.
[Tobias von Koch] What's happening here is that the CR6SET/CR6UNSET is breaking the chain of register copies glued to the function call (BL_SVR4 node). The scheduler then moves other instructions in between those and the function call, which isn't good! Right. That's the case where there is no chain of register copies before the call, so InFlag == 0... Attached is a new revision of the patch which should fix this for good. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@162916 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/PowerPC/PPCISelLowering.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/lib/Target/PowerPC/PPCISelLowering.cpp b/lib/Target/PowerPC/PPCISelLowering.cpp
index 49d7c278478..dbb3b144a75 100644
--- a/lib/Target/PowerPC/PPCISelLowering.cpp
+++ b/lib/Target/PowerPC/PPCISelLowering.cpp
@@ -3164,8 +3164,12 @@ PPCTargetLowering::LowerCall_SVR4(SDValue Chain, SDValue Callee,
// Set CR bit 6 to true if this is a vararg call with floating args passed in
// registers.
if (isVarArg) {
+ SDVTList VTs = DAG.getVTList(MVT::Other, MVT::Glue);
+ SDValue Ops[] = { Chain, InFlag };
+
Chain = DAG.getNode(seenFloatArg ? PPCISD::CR6SET : PPCISD::CR6UNSET,
- dl, DAG.getVTList(MVT::Other, MVT::Glue), Chain);
+ dl, VTs, Ops, InFlag.getNode() ? 2 : 1);
+
InFlag = Chain.getValue(1);
}