Changes in directory llvm/lib/Target/X86:
X86ISelLowering.cpp updated: 1.57 -> 1.58 --- Log message: When trying to fold X86::SETCC into a Select, make a copy if it has more than one use. This allows more CMOV instructions. --- Diffs of the changes: (+22 -6) X86ISelLowering.cpp | 28 ++++++++++++++++++++++------ 1 files changed, 22 insertions(+), 6 deletions(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.57 llvm/lib/Target/X86/X86ISelLowering.cpp:1.58 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.57 Wed Jan 25 12:21:52 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Wed Jan 25 20:13:10 2006 @@ -1669,9 +1669,17 @@ // 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) { + if (Op0.getOperand(1).getOpcode() == X86ISD::CMP) { + if (!Op0.hasOneUse()) { + 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); Cond = Op0.getOperand(1); // Make a copy as flag result cannot be used by more than one. @@ -1720,9 +1728,17 @@ // 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) { + if (Cond.getOperand(1).getOpcode() == X86ISD::CMP) { + if (!Cond.hasOneUse()) { + 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); Cond = Cond.getOperand(1); // Make a copy as flag result cannot be used by more than one. _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits