Index: lib/Target/X86/X86ISelLowering.cpp =================================================================== --- lib/Target/X86/X86ISelLowering.cpp (revision 61100) +++ lib/Target/X86/X86ISelLowering.cpp (working copy) @@ -4639,22 +4639,43 @@ Tmp3 = DAG.getNode(isSRA ? ISD::SRA : ISD::SRL, VT, ShOpHi, ShAmt); } - SDValue AndNode = DAG.getNode(ISD::AND, MVT::i8, ShAmt, + APInt KnownZero, KnownOne; + DAG.ComputeMaskedBits(ShAmt, APInt(8, VTBits), KnownZero, KnownOne, 0); + + SDValue Hi, Lo; + if (KnownZero == VTBits) { + if (Op.getOpcode() == ISD::SHL_PARTS) { + Lo = Tmp3; + Hi = Tmp2; + } else { + Lo = Tmp2; + Hi = Tmp3; + } + } else if (KnownOne == VTBits) { + if (Op.getOpcode() == ISD::SHL_PARTS) { + Lo = Tmp1; + Hi = Tmp3; + } else { + Lo = Tmp3; + Hi = Tmp1; + } + } else { + SDValue AndNode = DAG.getNode(ISD::AND, MVT::i8, ShAmt, DAG.getConstant(VTBits, MVT::i8)); - SDValue Cond = DAG.getNode(X86ISD::CMP, VT, + SDValue Cond = DAG.getNode(X86ISD::CMP, VT, AndNode, DAG.getConstant(0, MVT::i8)); - SDValue Hi, Lo; - SDValue CC = DAG.getConstant(X86::COND_NE, MVT::i8); - SDValue Ops0[4] = { Tmp2, Tmp3, CC, Cond }; - SDValue Ops1[4] = { Tmp3, Tmp1, CC, Cond }; + SDValue CC = DAG.getConstant(X86::COND_NE, MVT::i8); + SDValue Ops0[4] = { Tmp2, Tmp3, CC, Cond }; + SDValue Ops1[4] = { Tmp3, Tmp1, CC, Cond }; - if (Op.getOpcode() == ISD::SHL_PARTS) { - Hi = DAG.getNode(X86ISD::CMOV, VT, Ops0, 4); - Lo = DAG.getNode(X86ISD::CMOV, VT, Ops1, 4); - } else { - Lo = DAG.getNode(X86ISD::CMOV, VT, Ops0, 4); - Hi = DAG.getNode(X86ISD::CMOV, VT, Ops1, 4); + if (Op.getOpcode() == ISD::SHL_PARTS) { + Hi = DAG.getNode(X86ISD::CMOV, VT, Ops0, 4); + Lo = DAG.getNode(X86ISD::CMOV, VT, Ops1, 4); + } else { + Lo = DAG.getNode(X86ISD::CMOV, VT, Ops0, 4); + Hi = DAG.getNode(X86ISD::CMOV, VT, Ops1, 4); + } } SDValue Ops[2] = { Lo, Hi }; @@ -7291,7 +7312,15 @@ KnownZero |= APInt::getHighBitsSet(Mask.getBitWidth(), Mask.getBitWidth() - 1); break; + case X86ISD::CMOV: { + APInt KnownZero2, KnownOne2; + DAG.ComputeMaskedBits(Op.getOperand(0), Mask, KnownZero, KnownOne, Depth+1); + DAG.ComputeMaskedBits(Op.getOperand(1), Mask, KnownZero2, KnownOne2, Depth+1); + KnownZero &= KnownZero2; + KnownOne &= KnownOne2; + break; } + } } /// isGAPlusOffset - Returns true (and the GlobalValue and the offset) if the