summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-01-25 09:05:09 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-01-25 09:05:09 +0000
commitaff0800fd1c1ff3d701b72378897c190c061530b (patch)
tree1f722fe86e62a7b63bcd3987d56e7c5d15175f5b
parentbc7226a7cca6d510931add3c84d909cd15e1c6e6 (diff)
downloadbcm5719-llvm-aff0800fd1c1ff3d701b72378897c190c061530b.tar.gz
bcm5719-llvm-aff0800fd1c1ff3d701b72378897c190c061530b.zip
Fix a selectcc lowering bug. Make a copy of X86ISD::CMP when folding it.
llvm-svn: 25596
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 5a7b764dc92..b97c57d374f 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -1696,9 +1696,14 @@ SDOperand X86TargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
// If the X86ISD::SETCC has more than one use, then it's probably better
// to use a test instead of duplicating the X86ISD::CMP (for register
// pressure reason).
+ // FIXME: Check number of live Op0 uses since we are in the middle of
+ // legalization process.
if (Op0.hasOneUse() && Op0.getOperand(1).getOpcode() == X86ISD::CMP) {
CC = Op0.getOperand(0);
Cond = Op0.getOperand(1);
+ // Make a copy as flag result cannot be used by more than one.
+ Cond = DAG.getNode(X86ISD::CMP, MVT::Flag,
+ Cond.getOperand(0), Cond.getOperand(1));
addTest =
isFPStack && !hasFPCMov(cast<ConstantSDNode>(CC)->getSignExtended());
} else
@@ -1742,11 +1747,14 @@ SDOperand X86TargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
// If the X86ISD::SETCC has more than one use, then it's probably better
// to use a test instead of duplicating the X86ISD::CMP (for register
// pressure reason).
+ // FIXME: Check number of live Cond uses since we are in the middle of
+ // legalization process.
if (Cond.hasOneUse() && Cond.getOperand(1).getOpcode() == X86ISD::CMP) {
CC = Cond.getOperand(0);
+ Cond = Cond.getOperand(1);
+ // Make a copy as flag result cannot be used by more than one.
Cond = DAG.getNode(X86ISD::CMP, MVT::Flag,
- Cond.getOperand(1).getOperand(0),
- Cond.getOperand(1).getOperand(1));
+ Cond.getOperand(0), Cond.getOperand(1));
} else
addTest = true;
} else if (Cond.getOpcode() == ISD::SETCC) {
OpenPOWER on IntegriCloud