From: Simon Pilgrim Date: Wed, 6 Mar 2019 18:52:52 +0000 (+0000) Subject: [DAGCombine] Improve select (not Cond), N1, N2 -> select Cond, N2, N1 fold X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fa80b421162befbb08f4053a4e2ec735fd204acf;p=llvm [DAGCombine] Improve select (not Cond), N1, N2 -> select Cond, N2, N1 fold Move the x86 combine from D58974 into the DAGCombine VSELECT code and update the SELECT version to use the isBooleanFlip helper as well. Requested by @spatel on D59006 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355533 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 2e4c5933b9e..770c15c81ce 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -2399,9 +2399,12 @@ static SDValue flipBoolean(SDValue V, const SDLoc &DL, EVT VT, } static bool isBooleanFlip(SDValue V, EVT VT, const TargetLowering &TLI) { - if (V.getOpcode() != ISD::XOR) return false; - ConstantSDNode *Const = dyn_cast(V.getOperand(1)); - if (!Const) return false; + if (V.getOpcode() != ISD::XOR) + return false; + + ConstantSDNode *Const = isConstOrConstSplat(V.getOperand(1), false); + if (!Const) + return false; switch(TLI.getBooleanContents(VT)) { case TargetLowering::ZeroOrOneBooleanContent: @@ -7640,11 +7643,9 @@ SDValue DAGCombiner::visitSELECT(SDNode *N) { } } - if (VT0 == MVT::i1) { - // select (not Cond), N1, N2 -> select Cond, N2, N1 - if (isBitwiseNot(N0)) - return DAG.getNode(ISD::SELECT, DL, VT, N0->getOperand(0), N2, N1); - } + // select (not Cond), N1, N2 -> select Cond, N2, N1 + if (isBooleanFlip(N0, VT0, TLI)) + return DAG.getSelect(DL, VT, N0.getOperand(0), N2, N1); // Fold selects based on a setcc into other things, such as min/max/abs. if (N0.getOpcode() == ISD::SETCC) { @@ -8117,11 +8118,17 @@ SDValue DAGCombiner::visitVSELECT(SDNode *N) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); + EVT VT = N->getValueType(0); + EVT VT0 = N0.getValueType(); SDLoc DL(N); if (SDValue V = DAG.simplifySelect(N0, N1, N2)) return V; + // vselect (not Cond), N1, N2 -> vselect Cond, N2, N1 + if (isBooleanFlip(N0, VT0, TLI)) + return DAG.getSelect(DL, VT, N0.getOperand(0), N2, N1); + // Canonicalize integer abs. // vselect (setg[te] X, 0), X, -X -> // vselect (setgt X, -1), X, -X -> @@ -8161,7 +8168,6 @@ SDValue DAGCombiner::visitVSELECT(SDNode *N) { // This is OK if we don't care about what happens if either operand is a // NaN. // - EVT VT = N->getValueType(0); if (N0.hasOneUse() && isLegalToCombineMinNumMaxNum( DAG, N0.getOperand(0), N0.getOperand(1), TLI)) { ISD::CondCode CC = cast(N0.getOperand(2))->get(); diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index afb76014dff..fa18985e4f8 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -34684,12 +34684,6 @@ static SDValue combineSelect(SDNode *N, SelectionDAG &DAG, return DAG.getVectorShuffle(VT, DL, LHS, RHS, Mask); } - // Commute LHS/RHS if the Cond has been XOR'd. - // TODO: Move this to DAGCombine. - if (CondVT.getScalarSizeInBits() == VT.getScalarSizeInBits() && - isBitwiseNot(Cond)) - return DAG.getNode(N->getOpcode(), DL, VT, Cond.getOperand(0), RHS, LHS); - // If we have SSE[12] support, try to form min/max nodes. SSE min/max // instructions match the semantics of the common C idiom x