[llvm] b568d3d - [X86] Add vector support to sub(C1, xor(X, C2)) -> add(xor(X, ~C2), C1+1) fold.
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Sun Feb 21 13:52:06 PST 2021
Author: Simon Pilgrim
Date: 2021-02-21T21:51:27Z
New Revision: b568d3d6c915a515624f6292af0785c43ffaba37
URL: https://github.com/llvm/llvm-project/commit/b568d3d6c915a515624f6292af0785c43ffaba37
DIFF: https://github.com/llvm/llvm-project/commit/b568d3d6c915a515624f6292af0785c43ffaba37.diff
LOG: [X86] Add vector support to sub(C1, xor(X, C2)) -> add(xor(X, ~C2), C1+1) fold.
Added:
Modified:
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/combine-sub.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 98eea45a9152..51d626b23113 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -49123,8 +49123,10 @@ static SDValue combineSub(SDNode *N, SelectionDAG &DAG,
// negation into a preceding instruction. If the RHS of the sub is a XOR with
// one use and a constant, invert the immediate, saving one register.
// sub(C1, xor(X, C2)) -> add(xor(X, ~C2), C1+1)
- if (Op1.getOpcode() == ISD::XOR && isa<ConstantSDNode>(Op0) &&
- isa<ConstantSDNode>(Op1.getOperand(1)) && Op1->hasOneUse()) {
+ if (Op1.getOpcode() == ISD::XOR &&
+ DAG.isConstantIntBuildVectorOrConstantInt(Op0) &&
+ DAG.isConstantIntBuildVectorOrConstantInt(Op1.getOperand(1)) &&
+ Op1->hasOneUse()) {
SDLoc DL(N);
EVT VT = Op0.getValueType();
SDValue NewXor = DAG.getNode(ISD::XOR, SDLoc(Op1), VT, Op1.getOperand(0),
diff --git a/llvm/test/CodeGen/X86/combine-sub.ll b/llvm/test/CodeGen/X86/combine-sub.ll
index f16768b87b0e..eb333dcd1684 100644
--- a/llvm/test/CodeGen/X86/combine-sub.ll
+++ b/llvm/test/CodeGen/X86/combine-sub.ll
@@ -246,16 +246,13 @@ define <4 x i32> @combine_vec_sub_xor_consts(<4 x i32> %x) {
; SSE-LABEL: combine_vec_sub_xor_consts:
; SSE: # %bb.0:
; SSE-NEXT: pxor {{.*}}(%rip), %xmm0
-; SSE-NEXT: movdqa {{.*#+}} xmm1 = [1,2,3,4]
-; SSE-NEXT: psubd %xmm0, %xmm1
-; SSE-NEXT: movdqa %xmm1, %xmm0
+; SSE-NEXT: paddd {{.*}}(%rip), %xmm0
; SSE-NEXT: retq
;
; AVX-LABEL: combine_vec_sub_xor_consts:
; AVX: # %bb.0:
; AVX-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
-; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [1,2,3,4]
-; AVX-NEXT: vpsubd %xmm0, %xmm1, %xmm0
+; AVX-NEXT: vpaddd {{.*}}(%rip), %xmm0, %xmm0
; AVX-NEXT: retq
%xor = xor <4 x i32> %x, <i32 28, i32 29, i32 -1, i32 -31>
%sub = sub <4 x i32> <i32 1, i32 2, i32 3, i32 4>, %xor
More information about the llvm-commits
mailing list