diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-05-17 14:04:56 +0000 |
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-05-17 14:04:56 +0000 |
| commit | 62c7032c1832d50d474f562341a3283c5c6aa521 (patch) | |
| tree | 52c41138b4471b0e71aba91097f8b6d9ab9799e7 /llvm/lib/Target | |
| parent | c8dcbed6e4cf3185b292f2a7458c335c002ac5c0 (diff) | |
| download | bcm5719-llvm-62c7032c1832d50d474f562341a3283c5c6aa521.tar.gz bcm5719-llvm-62c7032c1832d50d474f562341a3283c5c6aa521.zip | |
[X86][AVX] isNOT - add extract_subvector(xor X, -1) -> extract_subvector(X) fold.
Prep work for the removal of the remaining x86 CTTZ vector lowering.
llvm-svn: 361035
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index a63110070c4..6366f2e4f7c 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -37448,11 +37448,20 @@ static SDValue combineCompareEqual(SDNode *N, SelectionDAG &DAG, } // Match (xor X, -1) -> X. +// Match extract_subvector(xor X, -1) -> extract_subvector(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); + if (V.getOpcode() == ISD::EXTRACT_SUBVECTOR && + (isNullConstant(V.getOperand(1)) || V.getOperand(0).hasOneUse())) { + if (SDValue Not = IsNOT(V.getOperand(0), DAG)) { + Not = DAG.getBitcast(V.getOperand(0).getValueType(), Not); + return DAG.getNode(ISD::EXTRACT_SUBVECTOR, SDLoc(Not), V.getValueType(), + Not, V.getOperand(1)); + } + } return SDValue(); } |

