forked from OSchip/llvm-project
When trying to fold X86::SETCC into a Select, make a copy if it has more than
one use. This allows more CMOV instructions. llvm-svn: 25634
This commit is contained in:
parent
120f31b1fd
commit
944d1e91ea
|
@ -1669,9 +1669,17 @@ SDOperand X86TargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
|
||||||
// If the X86ISD::SETCC has more than one use, then it's probably better
|
// 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
|
// to use a test instead of duplicating the X86ISD::CMP (for register
|
||||||
// pressure reason).
|
// pressure reason).
|
||||||
// FIXME: Check number of live Op0 uses since we are in the middle of
|
if (Op0.getOperand(1).getOpcode() == X86ISD::CMP) {
|
||||||
// legalization process.
|
if (!Op0.hasOneUse()) {
|
||||||
if (Op0.hasOneUse() && Op0.getOperand(1).getOpcode() == X86ISD::CMP) {
|
std::vector<MVT::ValueType> Tys;
|
||||||
|
for (unsigned i = 0; i < Op0.Val->getNumValues(); ++i)
|
||||||
|
Tys.push_back(Op0.Val->getValueType(i));
|
||||||
|
std::vector<SDOperand> Ops;
|
||||||
|
for (unsigned i = 0; i < Op0.getNumOperands(); ++i)
|
||||||
|
Ops.push_back(Op0.getOperand(i));
|
||||||
|
Op0 = DAG.getNode(X86ISD::SETCC, Tys, Ops);
|
||||||
|
}
|
||||||
|
|
||||||
CC = Op0.getOperand(0);
|
CC = Op0.getOperand(0);
|
||||||
Cond = Op0.getOperand(1);
|
Cond = Op0.getOperand(1);
|
||||||
// Make a copy as flag result cannot be used by more than one.
|
// Make a copy as flag result cannot be used by more than one.
|
||||||
|
@ -1720,9 +1728,17 @@ SDOperand X86TargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
|
||||||
// If the X86ISD::SETCC has more than one use, then it's probably better
|
// 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
|
// to use a test instead of duplicating the X86ISD::CMP (for register
|
||||||
// pressure reason).
|
// pressure reason).
|
||||||
// FIXME: Check number of live Cond uses since we are in the middle of
|
if (Cond.getOperand(1).getOpcode() == X86ISD::CMP) {
|
||||||
// legalization process.
|
if (!Cond.hasOneUse()) {
|
||||||
if (Cond.hasOneUse() && Cond.getOperand(1).getOpcode() == X86ISD::CMP) {
|
std::vector<MVT::ValueType> Tys;
|
||||||
|
for (unsigned i = 0; i < Cond.Val->getNumValues(); ++i)
|
||||||
|
Tys.push_back(Cond.Val->getValueType(i));
|
||||||
|
std::vector<SDOperand> Ops;
|
||||||
|
for (unsigned i = 0; i < Cond.getNumOperands(); ++i)
|
||||||
|
Ops.push_back(Cond.getOperand(i));
|
||||||
|
Cond = DAG.getNode(X86ISD::SETCC, Tys, Ops);
|
||||||
|
}
|
||||||
|
|
||||||
CC = Cond.getOperand(0);
|
CC = Cond.getOperand(0);
|
||||||
Cond = Cond.getOperand(1);
|
Cond = Cond.getOperand(1);
|
||||||
// Make a copy as flag result cannot be used by more than one.
|
// Make a copy as flag result cannot be used by more than one.
|
||||||
|
|
Loading…
Reference in New Issue