From ef06a7508deab1b6a8bd0c3c595ac61e013bfec0 Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Fri, 17 May 2019 10:37:08 +0000 Subject: [PATCH] [X86] Pull out IsNOT helper. NFCI. Return the input value for the NOT pattern: (xor X, -1) -> X git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@361012 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ISelLowering.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 282cba98538..a63110070c4 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -37447,6 +37447,15 @@ static SDValue combineCompareEqual(SDNode *N, SelectionDAG &DAG, return SDValue(); } +// Match (xor X, -1) -> X. +static SDValue IsNOT(SDValue V, SelectionDAG &DAG) { + V = peekThroughBitcasts(V); + if (V.getOpcode() == ISD::XOR && + ISD::isBuildVectorAllOnes(V.getOperand(1).getNode())) + return V.getOperand(0); + return SDValue(); +} + /// Try to fold: (and (xor X, -1), Y) -> (andnp X, Y). static SDValue combineANDXORWithAllOnesIntoANDNP(SDNode *N, SelectionDAG &DAG) { assert(N->getOpcode() == ISD::AND); @@ -37456,15 +37465,14 @@ static SDValue combineANDXORWithAllOnesIntoANDNP(SDNode *N, SelectionDAG &DAG) { return SDValue(); SDValue X, Y; - SDValue N0 = peekThroughBitcasts(N->getOperand(0)); - SDValue N1 = peekThroughBitcasts(N->getOperand(1)); - if (N0.getOpcode() == ISD::XOR && - ISD::isBuildVectorAllOnes(N0.getOperand(1).getNode())) { - X = N0.getOperand(0); + SDValue N0 = N->getOperand(0); + SDValue N1 = N->getOperand(1); + + if (SDValue Not = IsNOT(N0, DAG)) { + X = Not; Y = N1; - } else if (N1.getOpcode() == ISD::XOR && - ISD::isBuildVectorAllOnes(N1.getOperand(1).getNode())) { - X = N1.getOperand(0); + } else if (SDValue Not = IsNOT(N1, DAG)) { + X = Not; Y = N0; } else return SDValue(); -- 2.50.1