From bf2ce6ba422b93d5338f36654168aa1fa4e78798 Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Sat, 1 Apr 2023 20:28:25 +0100 Subject: [PATCH] [X86] combinePTESTCC - fold TESTC(X,~X) -> TESTC(X,-1) Partial fix for Issue #59998 --- llvm/lib/Target/X86/X86ISelLowering.cpp | 12 + llvm/test/CodeGen/X86/combine-ptest.ll | 3 +- llvm/test/CodeGen/X86/vector-reduce-and-bool.ll | 151 +++------- llvm/test/CodeGen/X86/vector-reduce-and-cmp.ll | 349 ++++------------------ llvm/test/CodeGen/X86/vector-reduce-and-scalar.ll | 320 ++++---------------- 5 files changed, 164 insertions(+), 671 deletions(-) diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index c146aa7..e012026 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -47233,6 +47233,18 @@ static SDValue combinePTESTCC(SDValue EFLAGS, X86::CondCode &CC, } } + if (CC == X86::COND_B || CC == X86::COND_AE) { + // TESTC(X,~X) == TESTC(X,-1) + if (SDValue NotOp1 = IsNOT(Op1, DAG)) { + if (peekThroughBitcasts(NotOp1) == peekThroughBitcasts(Op0)) { + SDLoc DL(EFLAGS); + return DAG.getNode(EFLAGS.getOpcode(), DL, VT, + DAG.getBitcast(OpVT, NotOp1), + DAG.getAllOnesConstant(DL, OpVT)); + } + } + } + if (CC == X86::COND_E || CC == X86::COND_NE) { // TESTZ(X,~Y) == TESTC(Y,X) if (SDValue NotOp1 = IsNOT(Op1, DAG)) { diff --git a/llvm/test/CodeGen/X86/combine-ptest.ll b/llvm/test/CodeGen/X86/combine-ptest.ll index bff6d5f..61ca920 100644 --- a/llvm/test/CodeGen/X86/combine-ptest.ll +++ b/llvm/test/CodeGen/X86/combine-ptest.ll @@ -150,7 +150,7 @@ define i32 @ptestnzc_256_invert0_commute(<4 x i64> %c, <4 x i64> %d, i32 %a, i32 } ; -; TODO: testc(X,~X) -> testc(X,-1) +; testc(X,~X) -> testc(X,-1) ; define i32 @ptestc_128_not(<2 x i64> %c, <2 x i64> %d, i32 %a, i32 %b) { @@ -158,7 +158,6 @@ define i32 @ptestc_128_not(<2 x i64> %c, <2 x i64> %d, i32 %a, i32 %b) { ; CHECK: # %bb.0: ; CHECK-NEXT: movl %edi, %eax ; CHECK-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vpxor %xmm1, %xmm0, %xmm1 ; CHECK-NEXT: vptest %xmm1, %xmm0 ; CHECK-NEXT: cmovael %esi, %eax ; CHECK-NEXT: retq diff --git a/llvm/test/CodeGen/X86/vector-reduce-and-bool.ll b/llvm/test/CodeGen/X86/vector-reduce-and-bool.ll index 1cf8317..6763250 100644 --- a/llvm/test/CodeGen/X86/vector-reduce-and-bool.ll +++ b/llvm/test/CodeGen/X86/vector-reduce-and-bool.ll @@ -1554,7 +1554,6 @@ define i1 @icmp1_v2i64_v2i1(<2 x i64>) { ; SSE41-LABEL: icmp1_v2i64_v2i1: ; SSE41: # %bb.0: ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq @@ -1562,7 +1561,6 @@ define i1 @icmp1_v2i64_v2i1(<2 x i64>) { ; AVX1OR2-LABEL: icmp1_v2i64_v2i1: ; AVX1OR2: # %bb.0: ; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 -; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm1 ; AVX1OR2-NEXT: vptest %xmm1, %xmm0 ; AVX1OR2-NEXT: setb %al ; AVX1OR2-NEXT: retq @@ -1615,7 +1613,6 @@ define i1 @icmp1_v4i32_v4i1(<4 x i32>) { ; SSE41-LABEL: icmp1_v4i32_v4i1: ; SSE41: # %bb.0: ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq @@ -1623,7 +1620,6 @@ define i1 @icmp1_v4i32_v4i1(<4 x i32>) { ; AVX1OR2-LABEL: icmp1_v4i32_v4i1: ; AVX1OR2: # %bb.0: ; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 -; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm1 ; AVX1OR2-NEXT: vptest %xmm1, %xmm0 ; AVX1OR2-NEXT: setb %al ; AVX1OR2-NEXT: retq @@ -1676,7 +1672,6 @@ define i1 @icmp1_v8i16_v8i1(<8 x i16>) { ; SSE41-LABEL: icmp1_v8i16_v8i1: ; SSE41: # %bb.0: ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq @@ -1684,7 +1679,6 @@ define i1 @icmp1_v8i16_v8i1(<8 x i16>) { ; AVX1OR2-LABEL: icmp1_v8i16_v8i1: ; AVX1OR2: # %bb.0: ; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 -; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm1 ; AVX1OR2-NEXT: vptest %xmm1, %xmm0 ; AVX1OR2-NEXT: setb %al ; AVX1OR2-NEXT: retq @@ -1703,18 +1697,14 @@ define i1 @icmp1_v8i16_v8i1(<8 x i16>) { ; ; AVX512BW-LABEL: icmp1_v8i16_v8i1: ; AVX512BW: # %bb.0: -; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 -; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512BW-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 +; AVX512BW-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 ; AVX512BW-NEXT: vptest %xmm1, %xmm0 ; AVX512BW-NEXT: setb %al -; AVX512BW-NEXT: vzeroupper ; AVX512BW-NEXT: retq ; ; AVX512VL-LABEL: icmp1_v8i16_v8i1: ; AVX512VL: # %bb.0: -; AVX512VL-NEXT: vmovdqa %xmm0, %xmm1 -; AVX512VL-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm1 +; AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 ; AVX512VL-NEXT: vptest %xmm1, %xmm0 ; AVX512VL-NEXT: setb %al ; AVX512VL-NEXT: retq @@ -1736,46 +1726,16 @@ define i1 @icmp1_v16i8_v16i1(<16 x i8>) { ; SSE41-LABEL: icmp1_v16i8_v16i1: ; SSE41: # %bb.0: ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq ; -; AVX1OR2-LABEL: icmp1_v16i8_v16i1: -; AVX1OR2: # %bb.0: -; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 -; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm1 -; AVX1OR2-NEXT: vptest %xmm1, %xmm0 -; AVX1OR2-NEXT: setb %al -; AVX1OR2-NEXT: retq -; -; AVX512F-LABEL: icmp1_v16i8_v16i1: -; AVX512F: # %bb.0: -; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 -; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512F-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512F-NEXT: vptest %xmm1, %xmm0 -; AVX512F-NEXT: setb %al -; AVX512F-NEXT: vzeroupper -; AVX512F-NEXT: retq -; -; AVX512BW-LABEL: icmp1_v16i8_v16i1: -; AVX512BW: # %bb.0: -; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 -; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512BW-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512BW-NEXT: vptest %xmm1, %xmm0 -; AVX512BW-NEXT: setb %al -; AVX512BW-NEXT: vzeroupper -; AVX512BW-NEXT: retq -; -; AVX512VL-LABEL: icmp1_v16i8_v16i1: -; AVX512VL: # %bb.0: -; AVX512VL-NEXT: vmovdqa %xmm0, %xmm1 -; AVX512VL-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm1 -; AVX512VL-NEXT: vptest %xmm1, %xmm0 -; AVX512VL-NEXT: setb %al -; AVX512VL-NEXT: retq +; AVX-LABEL: icmp1_v16i8_v16i1: +; AVX: # %bb.0: +; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 +; AVX-NEXT: vptest %xmm1, %xmm0 +; AVX-NEXT: setb %al +; AVX-NEXT: retq %a = icmp eq <16 x i8> %0, %b = call i1 @llvm.vector.reduce.and.v16i1(<16 x i1> %a) ret i1 %b @@ -1794,10 +1754,9 @@ define i1 @icmp1_v4i64_v4i1(<4 x i64>) { ; ; SSE41-LABEL: icmp1_v4i64_v4i1: ; SSE41: # %bb.0: -; SSE41-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE41-NEXT: pand %xmm1, %xmm0 -; SSE41-NEXT: pxor %xmm0, %xmm2 -; SSE41-NEXT: ptest %xmm2, %xmm0 +; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq ; @@ -1816,7 +1775,6 @@ define i1 @icmp1_v4i64_v4i1(<4 x i64>) { ; AVX2-LABEL: icmp1_v4i64_v4i1: ; AVX2: # %bb.0: ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setb %al ; AVX2-NEXT: vzeroupper @@ -1871,10 +1829,9 @@ define i1 @icmp1_v8i32_v8i1(<8 x i32>) { ; ; SSE41-LABEL: icmp1_v8i32_v8i1: ; SSE41: # %bb.0: -; SSE41-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE41-NEXT: pand %xmm1, %xmm0 -; SSE41-NEXT: pxor %xmm0, %xmm2 -; SSE41-NEXT: ptest %xmm2, %xmm0 +; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq ; @@ -1893,40 +1850,18 @@ define i1 @icmp1_v8i32_v8i1(<8 x i32>) { ; AVX2-LABEL: icmp1_v8i32_v8i1: ; AVX2: # %bb.0: ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setb %al ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; -; AVX512F-LABEL: icmp1_v8i32_v8i1: -; AVX512F: # %bb.0: -; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 -; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512F-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512F-NEXT: vptest %ymm1, %ymm0 -; AVX512F-NEXT: setb %al -; AVX512F-NEXT: vzeroupper -; AVX512F-NEXT: retq -; -; AVX512BW-LABEL: icmp1_v8i32_v8i1: -; AVX512BW: # %bb.0: -; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 -; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512BW-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512BW-NEXT: vptest %ymm1, %ymm0 -; AVX512BW-NEXT: setb %al -; AVX512BW-NEXT: vzeroupper -; AVX512BW-NEXT: retq -; -; AVX512VL-LABEL: icmp1_v8i32_v8i1: -; AVX512VL: # %bb.0: -; AVX512VL-NEXT: vmovdqa %ymm0, %ymm1 -; AVX512VL-NEXT: vpternlogq $15, %ymm0, %ymm0, %ymm1 -; AVX512VL-NEXT: vptest %ymm1, %ymm0 -; AVX512VL-NEXT: setb %al -; AVX512VL-NEXT: vzeroupper -; AVX512VL-NEXT: retq +; AVX512-LABEL: icmp1_v8i32_v8i1: +; AVX512: # %bb.0: +; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 +; AVX512-NEXT: vptest %ymm1, %ymm0 +; AVX512-NEXT: setb %al +; AVX512-NEXT: vzeroupper +; AVX512-NEXT: retq %a = icmp eq <8 x i32> %0, %b = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> %a) ret i1 %b @@ -1945,10 +1880,9 @@ define i1 @icmp1_v16i16_v16i1(<16 x i16>) { ; ; SSE41-LABEL: icmp1_v16i16_v16i1: ; SSE41: # %bb.0: -; SSE41-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE41-NEXT: pand %xmm1, %xmm0 -; SSE41-NEXT: pxor %xmm0, %xmm2 -; SSE41-NEXT: ptest %xmm2, %xmm0 +; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq ; @@ -1967,7 +1901,6 @@ define i1 @icmp1_v16i16_v16i1(<16 x i16>) { ; AVX2-LABEL: icmp1_v16i16_v16i1: ; AVX2: # %bb.0: ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setb %al ; AVX2-NEXT: vzeroupper @@ -1986,9 +1919,7 @@ define i1 @icmp1_v16i16_v16i1(<16 x i16>) { ; ; AVX512BW-LABEL: icmp1_v16i16_v16i1: ; AVX512BW: # %bb.0: -; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 -; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512BW-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 +; AVX512BW-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 ; AVX512BW-NEXT: vptest %ymm1, %ymm0 ; AVX512BW-NEXT: setb %al ; AVX512BW-NEXT: vzeroupper @@ -1996,8 +1927,7 @@ define i1 @icmp1_v16i16_v16i1(<16 x i16>) { ; ; AVX512VL-LABEL: icmp1_v16i16_v16i1: ; AVX512VL: # %bb.0: -; AVX512VL-NEXT: vmovdqa %ymm0, %ymm1 -; AVX512VL-NEXT: vpternlogq $15, %ymm0, %ymm0, %ymm1 +; AVX512VL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 ; AVX512VL-NEXT: vptest %ymm1, %ymm0 ; AVX512VL-NEXT: setb %al ; AVX512VL-NEXT: vzeroupper @@ -2022,7 +1952,6 @@ define i1 @icmp1_v32i8_v32i1(<32 x i8>) { ; SSE41: # %bb.0: ; SSE41-NEXT: pand %xmm1, %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq @@ -2042,7 +1971,6 @@ define i1 @icmp1_v32i8_v32i1(<32 x i8>) { ; AVX2-LABEL: icmp1_v32i8_v32i1: ; AVX2: # %bb.0: ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setb %al ; AVX2-NEXT: vzeroupper @@ -2071,9 +1999,7 @@ define i1 @icmp1_v32i8_v32i1(<32 x i8>) { ; ; AVX512BW-LABEL: icmp1_v32i8_v32i1: ; AVX512BW: # %bb.0: -; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 -; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512BW-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 +; AVX512BW-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 ; AVX512BW-NEXT: vptest %ymm1, %ymm0 ; AVX512BW-NEXT: setb %al ; AVX512BW-NEXT: vzeroupper @@ -2081,8 +2007,7 @@ define i1 @icmp1_v32i8_v32i1(<32 x i8>) { ; ; AVX512VL-LABEL: icmp1_v32i8_v32i1: ; AVX512VL: # %bb.0: -; AVX512VL-NEXT: vmovdqa %ymm0, %ymm1 -; AVX512VL-NEXT: vpternlogq $15, %ymm0, %ymm0, %ymm1 +; AVX512VL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 ; AVX512VL-NEXT: vptest %ymm1, %ymm0 ; AVX512VL-NEXT: setb %al ; AVX512VL-NEXT: vzeroupper @@ -2107,12 +2032,11 @@ define i1 @icmp1_v8i64_v8i1(<8 x i64>) { ; ; SSE41-LABEL: icmp1_v8i64_v8i1: ; SSE41: # %bb.0: -; SSE41-NEXT: pcmpeqd %xmm4, %xmm4 ; SSE41-NEXT: pand %xmm3, %xmm1 ; SSE41-NEXT: pand %xmm2, %xmm0 ; SSE41-NEXT: pand %xmm1, %xmm0 -; SSE41-NEXT: pxor %xmm0, %xmm4 -; SSE41-NEXT: ptest %xmm4, %xmm0 +; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq ; @@ -2131,9 +2055,8 @@ define i1 @icmp1_v8i64_v8i1(<8 x i64>) { ; ; AVX2-LABEL: icmp1_v8i64_v8i1: ; AVX2: # %bb.0: -; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 -; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm1 +; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setb %al ; AVX2-NEXT: vzeroupper @@ -2167,12 +2090,11 @@ define i1 @icmp1_v16i32_v16i1(<16 x i32>) { ; ; SSE41-LABEL: icmp1_v16i32_v16i1: ; SSE41: # %bb.0: -; SSE41-NEXT: pcmpeqd %xmm4, %xmm4 ; SSE41-NEXT: pand %xmm3, %xmm1 ; SSE41-NEXT: pand %xmm2, %xmm0 ; SSE41-NEXT: pand %xmm1, %xmm0 -; SSE41-NEXT: pxor %xmm0, %xmm4 -; SSE41-NEXT: ptest %xmm4, %xmm0 +; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq ; @@ -2191,9 +2113,8 @@ define i1 @icmp1_v16i32_v16i1(<16 x i32>) { ; ; AVX2-LABEL: icmp1_v16i32_v16i1: ; AVX2: # %bb.0: -; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 -; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm1 +; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setb %al ; AVX2-NEXT: vzeroupper @@ -2227,12 +2148,11 @@ define i1 @icmp1_v32i16_v32i1(<32 x i16>) { ; ; SSE41-LABEL: icmp1_v32i16_v32i1: ; SSE41: # %bb.0: -; SSE41-NEXT: pcmpeqd %xmm4, %xmm4 ; SSE41-NEXT: pand %xmm3, %xmm1 ; SSE41-NEXT: pand %xmm2, %xmm0 ; SSE41-NEXT: pand %xmm1, %xmm0 -; SSE41-NEXT: pxor %xmm0, %xmm4 -; SSE41-NEXT: ptest %xmm4, %xmm0 +; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq ; @@ -2251,9 +2171,8 @@ define i1 @icmp1_v32i16_v32i1(<32 x i16>) { ; ; AVX2-LABEL: icmp1_v32i16_v32i1: ; AVX2: # %bb.0: -; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 -; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm1 +; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setb %al ; AVX2-NEXT: vzeroupper @@ -2322,7 +2241,6 @@ define i1 @icmp1_v64i8_v64i1(<64 x i8>) { ; SSE41-NEXT: pand %xmm2, %xmm0 ; SSE41-NEXT: pand %xmm1, %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq @@ -2344,7 +2262,6 @@ define i1 @icmp1_v64i8_v64i1(<64 x i8>) { ; AVX2: # %bb.0: ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setb %al ; AVX2-NEXT: vzeroupper diff --git a/llvm/test/CodeGen/X86/vector-reduce-and-cmp.ll b/llvm/test/CodeGen/X86/vector-reduce-and-cmp.ll index 7f20ef7..d4d79dd 100644 --- a/llvm/test/CodeGen/X86/vector-reduce-and-cmp.ll +++ b/llvm/test/CodeGen/X86/vector-reduce-and-cmp.ll @@ -24,46 +24,16 @@ define i1 @test_v2i64(<2 x i64> %a0) { ; SSE41-LABEL: test_v2i64: ; SSE41: # %bb.0: ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq ; -; AVX1OR2-LABEL: test_v2i64: -; AVX1OR2: # %bb.0: -; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 -; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm1 -; AVX1OR2-NEXT: vptest %xmm1, %xmm0 -; AVX1OR2-NEXT: setb %al -; AVX1OR2-NEXT: retq -; -; AVX512F-LABEL: test_v2i64: -; AVX512F: # %bb.0: -; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 -; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512F-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512F-NEXT: vptest %xmm1, %xmm0 -; AVX512F-NEXT: setb %al -; AVX512F-NEXT: vzeroupper -; AVX512F-NEXT: retq -; -; AVX512BW-LABEL: test_v2i64: -; AVX512BW: # %bb.0: -; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 -; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512BW-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512BW-NEXT: vptest %xmm1, %xmm0 -; AVX512BW-NEXT: setb %al -; AVX512BW-NEXT: vzeroupper -; AVX512BW-NEXT: retq -; -; AVX512BWVL-LABEL: test_v2i64: -; AVX512BWVL: # %bb.0: -; AVX512BWVL-NEXT: vmovdqa %xmm0, %xmm1 -; AVX512BWVL-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm1 -; AVX512BWVL-NEXT: vptest %xmm1, %xmm0 -; AVX512BWVL-NEXT: setb %al -; AVX512BWVL-NEXT: retq +; AVX-LABEL: test_v2i64: +; AVX: # %bb.0: +; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 +; AVX-NEXT: vptest %xmm1, %xmm0 +; AVX-NEXT: setb %al +; AVX-NEXT: retq %1 = call i64 @llvm.vector.reduce.and.v2i64(<2 x i64> %a0) %2 = icmp eq i64 %1, -1 ret i1 %2 @@ -84,7 +54,6 @@ define i1 @test_v4i64(<4 x i64> %a0) { ; SSE41: # %bb.0: ; SSE41-NEXT: pand %xmm1, %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setae %al ; SSE41-NEXT: retq @@ -93,7 +62,6 @@ define i1 @test_v4i64(<4 x i64> %a0) { ; AVX1: # %bb.0: ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 -; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm1 ; AVX1-NEXT: vptest %ymm1, %ymm0 ; AVX1-NEXT: setae %al ; AVX1-NEXT: vzeroupper @@ -102,40 +70,18 @@ define i1 @test_v4i64(<4 x i64> %a0) { ; AVX2-LABEL: test_v4i64: ; AVX2: # %bb.0: ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setae %al ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; -; AVX512F-LABEL: test_v4i64: -; AVX512F: # %bb.0: -; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 -; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512F-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512F-NEXT: vptest %ymm1, %ymm0 -; AVX512F-NEXT: setae %al -; AVX512F-NEXT: vzeroupper -; AVX512F-NEXT: retq -; -; AVX512BW-LABEL: test_v4i64: -; AVX512BW: # %bb.0: -; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 -; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512BW-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512BW-NEXT: vptest %ymm1, %ymm0 -; AVX512BW-NEXT: setae %al -; AVX512BW-NEXT: vzeroupper -; AVX512BW-NEXT: retq -; -; AVX512BWVL-LABEL: test_v4i64: -; AVX512BWVL: # %bb.0: -; AVX512BWVL-NEXT: vmovdqa %ymm0, %ymm1 -; AVX512BWVL-NEXT: vpternlogq $15, %ymm0, %ymm0, %ymm1 -; AVX512BWVL-NEXT: vptest %ymm1, %ymm0 -; AVX512BWVL-NEXT: setae %al -; AVX512BWVL-NEXT: vzeroupper -; AVX512BWVL-NEXT: retq +; AVX512-LABEL: test_v4i64: +; AVX512: # %bb.0: +; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 +; AVX512-NEXT: vptest %ymm1, %ymm0 +; AVX512-NEXT: setae %al +; AVX512-NEXT: vzeroupper +; AVX512-NEXT: retq %1 = call i64 @llvm.vector.reduce.and.v4i64(<4 x i64> %a0) %2 = icmp ne i64 %1, -1 ret i1 %2 @@ -160,7 +106,6 @@ define i1 @test_v8i64(<8 x i64> %a0) { ; SSE41-NEXT: pand %xmm2, %xmm0 ; SSE41-NEXT: pand %xmm1, %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq @@ -170,7 +115,6 @@ define i1 @test_v8i64(<8 x i64> %a0) { ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 -; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm1 ; AVX1-NEXT: vptest %ymm1, %ymm0 ; AVX1-NEXT: setb %al ; AVX1-NEXT: vzeroupper @@ -180,7 +124,6 @@ define i1 @test_v8i64(<8 x i64> %a0) { ; AVX2: # %bb.0: ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setb %al ; AVX2-NEXT: vzeroupper @@ -226,7 +169,6 @@ define i1 @test_v16i64(<16 x i64> %a0) { ; SSE41-NEXT: pand %xmm2, %xmm0 ; SSE41-NEXT: pand %xmm1, %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setae %al ; SSE41-NEXT: retq @@ -238,7 +180,6 @@ define i1 @test_v16i64(<16 x i64> %a0) { ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 -; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm1 ; AVX1-NEXT: vptest %ymm1, %ymm0 ; AVX1-NEXT: setae %al ; AVX1-NEXT: vzeroupper @@ -250,7 +191,6 @@ define i1 @test_v16i64(<16 x i64> %a0) { ; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setae %al ; AVX2-NEXT: vzeroupper @@ -306,46 +246,16 @@ define i1 @test_v4i32(<4 x i32> %a0) { ; SSE41-LABEL: test_v4i32: ; SSE41: # %bb.0: ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setae %al ; SSE41-NEXT: retq ; -; AVX1OR2-LABEL: test_v4i32: -; AVX1OR2: # %bb.0: -; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 -; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm1 -; AVX1OR2-NEXT: vptest %xmm1, %xmm0 -; AVX1OR2-NEXT: setae %al -; AVX1OR2-NEXT: retq -; -; AVX512F-LABEL: test_v4i32: -; AVX512F: # %bb.0: -; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 -; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512F-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512F-NEXT: vptest %xmm1, %xmm0 -; AVX512F-NEXT: setae %al -; AVX512F-NEXT: vzeroupper -; AVX512F-NEXT: retq -; -; AVX512BW-LABEL: test_v4i32: -; AVX512BW: # %bb.0: -; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 -; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512BW-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512BW-NEXT: vptest %xmm1, %xmm0 -; AVX512BW-NEXT: setae %al -; AVX512BW-NEXT: vzeroupper -; AVX512BW-NEXT: retq -; -; AVX512BWVL-LABEL: test_v4i32: -; AVX512BWVL: # %bb.0: -; AVX512BWVL-NEXT: vmovdqa %xmm0, %xmm1 -; AVX512BWVL-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm1 -; AVX512BWVL-NEXT: vptest %xmm1, %xmm0 -; AVX512BWVL-NEXT: setae %al -; AVX512BWVL-NEXT: retq +; AVX-LABEL: test_v4i32: +; AVX: # %bb.0: +; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 +; AVX-NEXT: vptest %xmm1, %xmm0 +; AVX-NEXT: setae %al +; AVX-NEXT: retq %1 = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> %a0) %2 = icmp ne i32 %1, -1 ret i1 %2 @@ -366,7 +276,6 @@ define i1 @test_v8i32(<8 x i32> %a0) { ; SSE41: # %bb.0: ; SSE41-NEXT: pand %xmm1, %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq @@ -375,7 +284,6 @@ define i1 @test_v8i32(<8 x i32> %a0) { ; AVX1: # %bb.0: ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 -; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm1 ; AVX1-NEXT: vptest %ymm1, %ymm0 ; AVX1-NEXT: setb %al ; AVX1-NEXT: vzeroupper @@ -384,40 +292,18 @@ define i1 @test_v8i32(<8 x i32> %a0) { ; AVX2-LABEL: test_v8i32: ; AVX2: # %bb.0: ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setb %al ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; -; AVX512F-LABEL: test_v8i32: -; AVX512F: # %bb.0: -; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 -; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512F-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512F-NEXT: vptest %ymm1, %ymm0 -; AVX512F-NEXT: setb %al -; AVX512F-NEXT: vzeroupper -; AVX512F-NEXT: retq -; -; AVX512BW-LABEL: test_v8i32: -; AVX512BW: # %bb.0: -; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 -; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512BW-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512BW-NEXT: vptest %ymm1, %ymm0 -; AVX512BW-NEXT: setb %al -; AVX512BW-NEXT: vzeroupper -; AVX512BW-NEXT: retq -; -; AVX512BWVL-LABEL: test_v8i32: -; AVX512BWVL: # %bb.0: -; AVX512BWVL-NEXT: vmovdqa %ymm0, %ymm1 -; AVX512BWVL-NEXT: vpternlogq $15, %ymm0, %ymm0, %ymm1 -; AVX512BWVL-NEXT: vptest %ymm1, %ymm0 -; AVX512BWVL-NEXT: setb %al -; AVX512BWVL-NEXT: vzeroupper -; AVX512BWVL-NEXT: retq +; AVX512-LABEL: test_v8i32: +; AVX512: # %bb.0: +; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 +; AVX512-NEXT: vptest %ymm1, %ymm0 +; AVX512-NEXT: setb %al +; AVX512-NEXT: vzeroupper +; AVX512-NEXT: retq %1 = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> %a0) %2 = icmp eq i32 %1, -1 ret i1 %2 @@ -442,7 +328,6 @@ define i1 @test_v16i32(<16 x i32> %a0) { ; SSE41-NEXT: pand %xmm2, %xmm0 ; SSE41-NEXT: pand %xmm1, %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setae %al ; SSE41-NEXT: retq @@ -452,7 +337,6 @@ define i1 @test_v16i32(<16 x i32> %a0) { ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 -; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm1 ; AVX1-NEXT: vptest %ymm1, %ymm0 ; AVX1-NEXT: setae %al ; AVX1-NEXT: vzeroupper @@ -462,7 +346,6 @@ define i1 @test_v16i32(<16 x i32> %a0) { ; AVX2: # %bb.0: ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setae %al ; AVX2-NEXT: vzeroupper @@ -508,7 +391,6 @@ define i1 @test_v32i32(<32 x i32> %a0) { ; SSE41-NEXT: pand %xmm2, %xmm0 ; SSE41-NEXT: pand %xmm1, %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq @@ -520,7 +402,6 @@ define i1 @test_v32i32(<32 x i32> %a0) { ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 -; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm1 ; AVX1-NEXT: vptest %ymm1, %ymm0 ; AVX1-NEXT: setb %al ; AVX1-NEXT: vzeroupper @@ -532,7 +413,6 @@ define i1 @test_v32i32(<32 x i32> %a0) { ; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setb %al ; AVX2-NEXT: vzeroupper @@ -607,46 +487,16 @@ define i1 @test_v8i16(<8 x i16> %a0) { ; SSE41-LABEL: test_v8i16: ; SSE41: # %bb.0: ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq ; -; AVX1OR2-LABEL: test_v8i16: -; AVX1OR2: # %bb.0: -; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 -; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm1 -; AVX1OR2-NEXT: vptest %xmm1, %xmm0 -; AVX1OR2-NEXT: setb %al -; AVX1OR2-NEXT: retq -; -; AVX512F-LABEL: test_v8i16: -; AVX512F: # %bb.0: -; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 -; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512F-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512F-NEXT: vptest %xmm1, %xmm0 -; AVX512F-NEXT: setb %al -; AVX512F-NEXT: vzeroupper -; AVX512F-NEXT: retq -; -; AVX512BW-LABEL: test_v8i16: -; AVX512BW: # %bb.0: -; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 -; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512BW-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512BW-NEXT: vptest %xmm1, %xmm0 -; AVX512BW-NEXT: setb %al -; AVX512BW-NEXT: vzeroupper -; AVX512BW-NEXT: retq -; -; AVX512BWVL-LABEL: test_v8i16: -; AVX512BWVL: # %bb.0: -; AVX512BWVL-NEXT: vmovdqa %xmm0, %xmm1 -; AVX512BWVL-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm1 -; AVX512BWVL-NEXT: vptest %xmm1, %xmm0 -; AVX512BWVL-NEXT: setb %al -; AVX512BWVL-NEXT: retq +; AVX-LABEL: test_v8i16: +; AVX: # %bb.0: +; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 +; AVX-NEXT: vptest %xmm1, %xmm0 +; AVX-NEXT: setb %al +; AVX-NEXT: retq %1 = call i16 @llvm.vector.reduce.and.v8i16(<8 x i16> %a0) %2 = icmp eq i16 %1, -1 ret i1 %2 @@ -667,7 +517,6 @@ define i1 @test_v16i16(<16 x i16> %a0) { ; SSE41: # %bb.0: ; SSE41-NEXT: pand %xmm1, %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setae %al ; SSE41-NEXT: retq @@ -676,7 +525,6 @@ define i1 @test_v16i16(<16 x i16> %a0) { ; AVX1: # %bb.0: ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 -; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm1 ; AVX1-NEXT: vptest %ymm1, %ymm0 ; AVX1-NEXT: setae %al ; AVX1-NEXT: vzeroupper @@ -685,40 +533,18 @@ define i1 @test_v16i16(<16 x i16> %a0) { ; AVX2-LABEL: test_v16i16: ; AVX2: # %bb.0: ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setae %al ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; -; AVX512F-LABEL: test_v16i16: -; AVX512F: # %bb.0: -; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 -; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512F-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512F-NEXT: vptest %ymm1, %ymm0 -; AVX512F-NEXT: setae %al -; AVX512F-NEXT: vzeroupper -; AVX512F-NEXT: retq -; -; AVX512BW-LABEL: test_v16i16: -; AVX512BW: # %bb.0: -; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 -; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512BW-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512BW-NEXT: vptest %ymm1, %ymm0 -; AVX512BW-NEXT: setae %al -; AVX512BW-NEXT: vzeroupper -; AVX512BW-NEXT: retq -; -; AVX512BWVL-LABEL: test_v16i16: -; AVX512BWVL: # %bb.0: -; AVX512BWVL-NEXT: vmovdqa %ymm0, %ymm1 -; AVX512BWVL-NEXT: vpternlogq $15, %ymm0, %ymm0, %ymm1 -; AVX512BWVL-NEXT: vptest %ymm1, %ymm0 -; AVX512BWVL-NEXT: setae %al -; AVX512BWVL-NEXT: vzeroupper -; AVX512BWVL-NEXT: retq +; AVX512-LABEL: test_v16i16: +; AVX512: # %bb.0: +; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 +; AVX512-NEXT: vptest %ymm1, %ymm0 +; AVX512-NEXT: setae %al +; AVX512-NEXT: vzeroupper +; AVX512-NEXT: retq %1 = call i16 @llvm.vector.reduce.and.v16i16(<16 x i16> %a0) %2 = icmp ne i16 %1, -1 ret i1 %2 @@ -743,7 +569,6 @@ define i1 @test_v32i16(<32 x i16> %a0) { ; SSE41-NEXT: pand %xmm2, %xmm0 ; SSE41-NEXT: pand %xmm1, %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq @@ -753,7 +578,6 @@ define i1 @test_v32i16(<32 x i16> %a0) { ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 -; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm1 ; AVX1-NEXT: vptest %ymm1, %ymm0 ; AVX1-NEXT: setb %al ; AVX1-NEXT: vzeroupper @@ -763,7 +587,6 @@ define i1 @test_v32i16(<32 x i16> %a0) { ; AVX2: # %bb.0: ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setb %al ; AVX2-NEXT: vzeroupper @@ -809,7 +632,6 @@ define i1 @test_v64i16(<64 x i16> %a0) { ; SSE41-NEXT: pand %xmm2, %xmm0 ; SSE41-NEXT: pand %xmm1, %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setae %al ; SSE41-NEXT: retq @@ -821,7 +643,6 @@ define i1 @test_v64i16(<64 x i16> %a0) { ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 -; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm1 ; AVX1-NEXT: vptest %ymm1, %ymm0 ; AVX1-NEXT: setae %al ; AVX1-NEXT: vzeroupper @@ -833,7 +654,6 @@ define i1 @test_v64i16(<64 x i16> %a0) { ; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setae %al ; AVX2-NEXT: vzeroupper @@ -927,46 +747,16 @@ define i1 @test_v16i8(<16 x i8> %a0) { ; SSE41-LABEL: test_v16i8: ; SSE41: # %bb.0: ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setae %al ; SSE41-NEXT: retq ; -; AVX1OR2-LABEL: test_v16i8: -; AVX1OR2: # %bb.0: -; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 -; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm1 -; AVX1OR2-NEXT: vptest %xmm1, %xmm0 -; AVX1OR2-NEXT: setae %al -; AVX1OR2-NEXT: retq -; -; AVX512F-LABEL: test_v16i8: -; AVX512F: # %bb.0: -; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 -; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512F-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512F-NEXT: vptest %xmm1, %xmm0 -; AVX512F-NEXT: setae %al -; AVX512F-NEXT: vzeroupper -; AVX512F-NEXT: retq -; -; AVX512BW-LABEL: test_v16i8: -; AVX512BW: # %bb.0: -; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 -; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512BW-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512BW-NEXT: vptest %xmm1, %xmm0 -; AVX512BW-NEXT: setae %al -; AVX512BW-NEXT: vzeroupper -; AVX512BW-NEXT: retq -; -; AVX512BWVL-LABEL: test_v16i8: -; AVX512BWVL: # %bb.0: -; AVX512BWVL-NEXT: vmovdqa %xmm0, %xmm1 -; AVX512BWVL-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm1 -; AVX512BWVL-NEXT: vptest %xmm1, %xmm0 -; AVX512BWVL-NEXT: setae %al -; AVX512BWVL-NEXT: retq +; AVX-LABEL: test_v16i8: +; AVX: # %bb.0: +; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 +; AVX-NEXT: vptest %xmm1, %xmm0 +; AVX-NEXT: setae %al +; AVX-NEXT: retq %1 = call i8 @llvm.vector.reduce.and.v16i8(<16 x i8> %a0) %2 = icmp ne i8 %1, -1 ret i1 %2 @@ -987,7 +777,6 @@ define i1 @test_v32i8(<32 x i8> %a0) { ; SSE41: # %bb.0: ; SSE41-NEXT: pand %xmm1, %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq @@ -996,7 +785,6 @@ define i1 @test_v32i8(<32 x i8> %a0) { ; AVX1: # %bb.0: ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 -; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm1 ; AVX1-NEXT: vptest %ymm1, %ymm0 ; AVX1-NEXT: setb %al ; AVX1-NEXT: vzeroupper @@ -1005,40 +793,18 @@ define i1 @test_v32i8(<32 x i8> %a0) { ; AVX2-LABEL: test_v32i8: ; AVX2: # %bb.0: ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setb %al ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; -; AVX512F-LABEL: test_v32i8: -; AVX512F: # %bb.0: -; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 -; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512F-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512F-NEXT: vptest %ymm1, %ymm0 -; AVX512F-NEXT: setb %al -; AVX512F-NEXT: vzeroupper -; AVX512F-NEXT: retq -; -; AVX512BW-LABEL: test_v32i8: -; AVX512BW: # %bb.0: -; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 -; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512BW-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512BW-NEXT: vptest %ymm1, %ymm0 -; AVX512BW-NEXT: setb %al -; AVX512BW-NEXT: vzeroupper -; AVX512BW-NEXT: retq -; -; AVX512BWVL-LABEL: test_v32i8: -; AVX512BWVL: # %bb.0: -; AVX512BWVL-NEXT: vmovdqa %ymm0, %ymm1 -; AVX512BWVL-NEXT: vpternlogq $15, %ymm0, %ymm0, %ymm1 -; AVX512BWVL-NEXT: vptest %ymm1, %ymm0 -; AVX512BWVL-NEXT: setb %al -; AVX512BWVL-NEXT: vzeroupper -; AVX512BWVL-NEXT: retq +; AVX512-LABEL: test_v32i8: +; AVX512: # %bb.0: +; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 +; AVX512-NEXT: vptest %ymm1, %ymm0 +; AVX512-NEXT: setb %al +; AVX512-NEXT: vzeroupper +; AVX512-NEXT: retq %1 = call i8 @llvm.vector.reduce.and.v32i8(<32 x i8> %a0) %2 = icmp eq i8 %1, -1 ret i1 %2 @@ -1063,7 +829,6 @@ define i1 @test_v64i8(<64 x i8> %a0) { ; SSE41-NEXT: pand %xmm2, %xmm0 ; SSE41-NEXT: pand %xmm1, %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setae %al ; SSE41-NEXT: retq @@ -1073,7 +838,6 @@ define i1 @test_v64i8(<64 x i8> %a0) { ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 -; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm1 ; AVX1-NEXT: vptest %ymm1, %ymm0 ; AVX1-NEXT: setae %al ; AVX1-NEXT: vzeroupper @@ -1083,7 +847,6 @@ define i1 @test_v64i8(<64 x i8> %a0) { ; AVX2: # %bb.0: ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setae %al ; AVX2-NEXT: vzeroupper @@ -1129,7 +892,6 @@ define i1 @test_v128i8(<128 x i8> %a0) { ; SSE41-NEXT: pand %xmm2, %xmm0 ; SSE41-NEXT: pand %xmm1, %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq @@ -1141,7 +903,6 @@ define i1 @test_v128i8(<128 x i8> %a0) { ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 -; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm1 ; AVX1-NEXT: vptest %ymm1, %ymm0 ; AVX1-NEXT: setb %al ; AVX1-NEXT: vzeroupper @@ -1153,7 +914,6 @@ define i1 @test_v128i8(<128 x i8> %a0) { ; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setb %al ; AVX2-NEXT: vzeroupper @@ -1198,3 +958,8 @@ declare i8 @llvm.vector.reduce.and.v16i8(<16 x i8>) declare i8 @llvm.vector.reduce.and.v32i8(<32 x i8>) declare i8 @llvm.vector.reduce.and.v64i8(<64 x i8>) declare i8 @llvm.vector.reduce.and.v128i8(<128 x i8>) +;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: +; AVX1OR2: {{.*}} +; AVX512BW: {{.*}} +; AVX512BWVL: {{.*}} +; AVX512F: {{.*}} diff --git a/llvm/test/CodeGen/X86/vector-reduce-and-scalar.ll b/llvm/test/CodeGen/X86/vector-reduce-and-scalar.ll index 55a6a70..3a38242 100644 --- a/llvm/test/CodeGen/X86/vector-reduce-and-scalar.ll +++ b/llvm/test/CodeGen/X86/vector-reduce-and-scalar.ll @@ -25,48 +25,17 @@ define i1 @test_v2i64(ptr %ptr) nounwind { ; SSE41: # %bb.0: ; SSE41-NEXT: movdqa (%rdi), %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq ; -; AVX1OR2-LABEL: test_v2i64: -; AVX1OR2: # %bb.0: -; AVX1OR2-NEXT: vmovdqa (%rdi), %xmm0 -; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 -; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm1 -; AVX1OR2-NEXT: vptest %xmm1, %xmm0 -; AVX1OR2-NEXT: setb %al -; AVX1OR2-NEXT: retq -; -; AVX512F-LABEL: test_v2i64: -; AVX512F: # %bb.0: -; AVX512F-NEXT: vmovdqa (%rdi), %xmm0 -; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512F-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512F-NEXT: vptest %xmm1, %xmm0 -; AVX512F-NEXT: setb %al -; AVX512F-NEXT: vzeroupper -; AVX512F-NEXT: retq -; -; AVX512BW-LABEL: test_v2i64: -; AVX512BW: # %bb.0: -; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0 -; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512BW-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512BW-NEXT: vptest %xmm1, %xmm0 -; AVX512BW-NEXT: setb %al -; AVX512BW-NEXT: vzeroupper -; AVX512BW-NEXT: retq -; -; AVX512VL-LABEL: test_v2i64: -; AVX512VL: # %bb.0: -; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0 -; AVX512VL-NEXT: vmovdqa %xmm0, %xmm1 -; AVX512VL-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm1 -; AVX512VL-NEXT: vptest %xmm1, %xmm0 -; AVX512VL-NEXT: setb %al -; AVX512VL-NEXT: retq +; AVX-LABEL: test_v2i64: +; AVX: # %bb.0: +; AVX-NEXT: vmovdqa (%rdi), %xmm0 +; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 +; AVX-NEXT: vptest %xmm1, %xmm0 +; AVX-NEXT: setb %al +; AVX-NEXT: retq %vload = load <2 x i64>, ptr %ptr %v0 = extractelement <2 x i64> %vload, i32 0 %v1 = extractelement <2 x i64> %vload, i32 1 @@ -92,17 +61,15 @@ define i1 @test_v4i64(ptr %ptr) nounwind { ; SSE41-NEXT: movdqa (%rdi), %xmm0 ; SSE41-NEXT: pand 16(%rdi), %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq ; ; AVX1-LABEL: test_v4i64: ; AVX1: # %bb.0: -; AVX1-NEXT: vmovaps (%rdi), %ymm0 +; AVX1-NEXT: vmovdqa (%rdi), %ymm0 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 -; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm1 ; AVX1-NEXT: vptest %ymm1, %ymm0 ; AVX1-NEXT: setb %al ; AVX1-NEXT: vzeroupper @@ -112,41 +79,19 @@ define i1 @test_v4i64(ptr %ptr) nounwind { ; AVX2: # %bb.0: ; AVX2-NEXT: vmovdqa (%rdi), %ymm0 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setb %al ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; -; AVX512F-LABEL: test_v4i64: -; AVX512F: # %bb.0: -; AVX512F-NEXT: vmovdqa (%rdi), %ymm0 -; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512F-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512F-NEXT: vptest %ymm1, %ymm0 -; AVX512F-NEXT: setb %al -; AVX512F-NEXT: vzeroupper -; AVX512F-NEXT: retq -; -; AVX512BW-LABEL: test_v4i64: -; AVX512BW: # %bb.0: -; AVX512BW-NEXT: vmovdqa (%rdi), %ymm0 -; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512BW-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512BW-NEXT: vptest %ymm1, %ymm0 -; AVX512BW-NEXT: setb %al -; AVX512BW-NEXT: vzeroupper -; AVX512BW-NEXT: retq -; -; AVX512VL-LABEL: test_v4i64: -; AVX512VL: # %bb.0: -; AVX512VL-NEXT: vmovdqa (%rdi), %ymm0 -; AVX512VL-NEXT: vmovdqa %ymm0, %ymm1 -; AVX512VL-NEXT: vpternlogq $15, %ymm0, %ymm0, %ymm1 -; AVX512VL-NEXT: vptest %ymm1, %ymm0 -; AVX512VL-NEXT: setb %al -; AVX512VL-NEXT: vzeroupper -; AVX512VL-NEXT: retq +; AVX512-LABEL: test_v4i64: +; AVX512: # %bb.0: +; AVX512-NEXT: vmovdqa (%rdi), %ymm0 +; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 +; AVX512-NEXT: vptest %ymm1, %ymm0 +; AVX512-NEXT: setb %al +; AVX512-NEXT: vzeroupper +; AVX512-NEXT: retq %vload = load <4 x i64>, ptr %ptr %v0 = extractelement <4 x i64> %vload, i32 0 %v1 = extractelement <4 x i64> %vload, i32 1 @@ -182,7 +127,6 @@ define i1 @test_v8i64(ptr %ptr) nounwind { ; SSE41-NEXT: pand 32(%rdi), %xmm0 ; SSE41-NEXT: pand %xmm1, %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq @@ -193,7 +137,6 @@ define i1 @test_v8i64(ptr %ptr) nounwind { ; AVX1-NEXT: vandps 32(%rdi), %ymm0, %ymm0 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 -; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm1 ; AVX1-NEXT: vptest %ymm1, %ymm0 ; AVX1-NEXT: setb %al ; AVX1-NEXT: vzeroupper @@ -204,7 +147,6 @@ define i1 @test_v8i64(ptr %ptr) nounwind { ; AVX2-NEXT: vmovdqa (%rdi), %ymm0 ; AVX2-NEXT: vpand 32(%rdi), %ymm0, %ymm0 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setb %al ; AVX2-NEXT: vzeroupper @@ -273,7 +215,6 @@ define i1 @test_v16i64(ptr %ptr) nounwind { ; SSE41-NEXT: pand %xmm2, %xmm0 ; SSE41-NEXT: pand %xmm1, %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq @@ -287,7 +228,6 @@ define i1 @test_v16i64(ptr %ptr) nounwind { ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 -; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm1 ; AVX1-NEXT: vptest %ymm1, %ymm0 ; AVX1-NEXT: setb %al ; AVX1-NEXT: vzeroupper @@ -301,7 +241,6 @@ define i1 @test_v16i64(ptr %ptr) nounwind { ; AVX2-NEXT: vpand 64(%rdi), %ymm0, %ymm0 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setb %al ; AVX2-NEXT: vzeroupper @@ -391,48 +330,17 @@ define i1 @test_v4i32(ptr %ptr) nounwind { ; SSE41: # %bb.0: ; SSE41-NEXT: movdqa (%rdi), %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq ; -; AVX1OR2-LABEL: test_v4i32: -; AVX1OR2: # %bb.0: -; AVX1OR2-NEXT: vmovdqa (%rdi), %xmm0 -; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 -; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm1 -; AVX1OR2-NEXT: vptest %xmm1, %xmm0 -; AVX1OR2-NEXT: setb %al -; AVX1OR2-NEXT: retq -; -; AVX512F-LABEL: test_v4i32: -; AVX512F: # %bb.0: -; AVX512F-NEXT: vmovdqa (%rdi), %xmm0 -; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512F-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512F-NEXT: vptest %xmm1, %xmm0 -; AVX512F-NEXT: setb %al -; AVX512F-NEXT: vzeroupper -; AVX512F-NEXT: retq -; -; AVX512BW-LABEL: test_v4i32: -; AVX512BW: # %bb.0: -; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0 -; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512BW-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512BW-NEXT: vptest %xmm1, %xmm0 -; AVX512BW-NEXT: setb %al -; AVX512BW-NEXT: vzeroupper -; AVX512BW-NEXT: retq -; -; AVX512VL-LABEL: test_v4i32: -; AVX512VL: # %bb.0: -; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0 -; AVX512VL-NEXT: vmovdqa %xmm0, %xmm1 -; AVX512VL-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm1 -; AVX512VL-NEXT: vptest %xmm1, %xmm0 -; AVX512VL-NEXT: setb %al -; AVX512VL-NEXT: retq +; AVX-LABEL: test_v4i32: +; AVX: # %bb.0: +; AVX-NEXT: vmovdqa (%rdi), %xmm0 +; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 +; AVX-NEXT: vptest %xmm1, %xmm0 +; AVX-NEXT: setb %al +; AVX-NEXT: retq %vload = load <4 x i32>, ptr %ptr %v0 = extractelement <4 x i32> %vload, i32 0 %v1 = extractelement <4 x i32> %vload, i32 1 @@ -462,17 +370,15 @@ define i1 @test_v8i32(ptr %ptr) nounwind { ; SSE41-NEXT: movdqa (%rdi), %xmm0 ; SSE41-NEXT: pand 16(%rdi), %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq ; ; AVX1-LABEL: test_v8i32: ; AVX1: # %bb.0: -; AVX1-NEXT: vmovaps (%rdi), %ymm0 +; AVX1-NEXT: vmovdqa (%rdi), %ymm0 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 -; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm1 ; AVX1-NEXT: vptest %ymm1, %ymm0 ; AVX1-NEXT: setb %al ; AVX1-NEXT: vzeroupper @@ -482,41 +388,19 @@ define i1 @test_v8i32(ptr %ptr) nounwind { ; AVX2: # %bb.0: ; AVX2-NEXT: vmovdqa (%rdi), %ymm0 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setb %al ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; -; AVX512F-LABEL: test_v8i32: -; AVX512F: # %bb.0: -; AVX512F-NEXT: vmovdqa (%rdi), %ymm0 -; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512F-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512F-NEXT: vptest %ymm1, %ymm0 -; AVX512F-NEXT: setb %al -; AVX512F-NEXT: vzeroupper -; AVX512F-NEXT: retq -; -; AVX512BW-LABEL: test_v8i32: -; AVX512BW: # %bb.0: -; AVX512BW-NEXT: vmovdqa (%rdi), %ymm0 -; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512BW-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512BW-NEXT: vptest %ymm1, %ymm0 -; AVX512BW-NEXT: setb %al -; AVX512BW-NEXT: vzeroupper -; AVX512BW-NEXT: retq -; -; AVX512VL-LABEL: test_v8i32: -; AVX512VL: # %bb.0: -; AVX512VL-NEXT: vmovdqa (%rdi), %ymm0 -; AVX512VL-NEXT: vmovdqa %ymm0, %ymm1 -; AVX512VL-NEXT: vpternlogq $15, %ymm0, %ymm0, %ymm1 -; AVX512VL-NEXT: vptest %ymm1, %ymm0 -; AVX512VL-NEXT: setb %al -; AVX512VL-NEXT: vzeroupper -; AVX512VL-NEXT: retq +; AVX512-LABEL: test_v8i32: +; AVX512: # %bb.0: +; AVX512-NEXT: vmovdqa (%rdi), %ymm0 +; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 +; AVX512-NEXT: vptest %ymm1, %ymm0 +; AVX512-NEXT: setb %al +; AVX512-NEXT: vzeroupper +; AVX512-NEXT: retq %vload = load <8 x i32>, ptr %ptr %v0 = extractelement <8 x i32> %vload, i32 0 %v1 = extractelement <8 x i32> %vload, i32 1 @@ -560,7 +444,6 @@ define i1 @test_v16i32(ptr %ptr) nounwind { ; SSE41-NEXT: pand 32(%rdi), %xmm0 ; SSE41-NEXT: pand %xmm1, %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq @@ -571,7 +454,6 @@ define i1 @test_v16i32(ptr %ptr) nounwind { ; AVX1-NEXT: vandps 32(%rdi), %ymm0, %ymm0 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 -; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm1 ; AVX1-NEXT: vptest %ymm1, %ymm0 ; AVX1-NEXT: setb %al ; AVX1-NEXT: vzeroupper @@ -582,7 +464,6 @@ define i1 @test_v16i32(ptr %ptr) nounwind { ; AVX2-NEXT: vmovdqa (%rdi), %ymm0 ; AVX2-NEXT: vpand 32(%rdi), %ymm0, %ymm0 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setb %al ; AVX2-NEXT: vzeroupper @@ -694,48 +575,17 @@ define i1 @test_v8i16(ptr %ptr) nounwind { ; SSE41: # %bb.0: ; SSE41-NEXT: movdqa (%rdi), %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq ; -; AVX1OR2-LABEL: test_v8i16: -; AVX1OR2: # %bb.0: -; AVX1OR2-NEXT: vmovdqa (%rdi), %xmm0 -; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 -; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm1 -; AVX1OR2-NEXT: vptest %xmm1, %xmm0 -; AVX1OR2-NEXT: setb %al -; AVX1OR2-NEXT: retq -; -; AVX512F-LABEL: test_v8i16: -; AVX512F: # %bb.0: -; AVX512F-NEXT: vmovdqa (%rdi), %xmm0 -; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512F-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512F-NEXT: vptest %xmm1, %xmm0 -; AVX512F-NEXT: setb %al -; AVX512F-NEXT: vzeroupper -; AVX512F-NEXT: retq -; -; AVX512BW-LABEL: test_v8i16: -; AVX512BW: # %bb.0: -; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0 -; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512BW-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512BW-NEXT: vptest %xmm1, %xmm0 -; AVX512BW-NEXT: setb %al -; AVX512BW-NEXT: vzeroupper -; AVX512BW-NEXT: retq -; -; AVX512VL-LABEL: test_v8i16: -; AVX512VL: # %bb.0: -; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0 -; AVX512VL-NEXT: vmovdqa %xmm0, %xmm1 -; AVX512VL-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm1 -; AVX512VL-NEXT: vptest %xmm1, %xmm0 -; AVX512VL-NEXT: setb %al -; AVX512VL-NEXT: retq +; AVX-LABEL: test_v8i16: +; AVX: # %bb.0: +; AVX-NEXT: vmovdqa (%rdi), %xmm0 +; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 +; AVX-NEXT: vptest %xmm1, %xmm0 +; AVX-NEXT: setb %al +; AVX-NEXT: retq %vload = load <8 x i16>, ptr %ptr %v0 = extractelement <8 x i16> %vload, i32 0 %v1 = extractelement <8 x i16> %vload, i32 1 @@ -773,17 +623,15 @@ define i1 @test_v16i16(ptr %ptr) nounwind { ; SSE41-NEXT: movdqa (%rdi), %xmm0 ; SSE41-NEXT: pand 16(%rdi), %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq ; ; AVX1-LABEL: test_v16i16: ; AVX1: # %bb.0: -; AVX1-NEXT: vmovaps (%rdi), %ymm0 +; AVX1-NEXT: vmovdqa (%rdi), %ymm0 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 -; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm1 ; AVX1-NEXT: vptest %ymm1, %ymm0 ; AVX1-NEXT: setb %al ; AVX1-NEXT: vzeroupper @@ -793,41 +641,19 @@ define i1 @test_v16i16(ptr %ptr) nounwind { ; AVX2: # %bb.0: ; AVX2-NEXT: vmovdqa (%rdi), %ymm0 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 -; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 ; AVX2-NEXT: vptest %ymm1, %ymm0 ; AVX2-NEXT: setb %al ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; -; AVX512F-LABEL: test_v16i16: -; AVX512F: # %bb.0: -; AVX512F-NEXT: vmovdqa (%rdi), %ymm0 -; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512F-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512F-NEXT: vptest %ymm1, %ymm0 -; AVX512F-NEXT: setb %al -; AVX512F-NEXT: vzeroupper -; AVX512F-NEXT: retq -; -; AVX512BW-LABEL: test_v16i16: -; AVX512BW: # %bb.0: -; AVX512BW-NEXT: vmovdqa (%rdi), %ymm0 -; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512BW-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512BW-NEXT: vptest %ymm1, %ymm0 -; AVX512BW-NEXT: setb %al -; AVX512BW-NEXT: vzeroupper -; AVX512BW-NEXT: retq -; -; AVX512VL-LABEL: test_v16i16: -; AVX512VL: # %bb.0: -; AVX512VL-NEXT: vmovdqa (%rdi), %ymm0 -; AVX512VL-NEXT: vmovdqa %ymm0, %ymm1 -; AVX512VL-NEXT: vpternlogq $15, %ymm0, %ymm0, %ymm1 -; AVX512VL-NEXT: vptest %ymm1, %ymm0 -; AVX512VL-NEXT: setb %al -; AVX512VL-NEXT: vzeroupper -; AVX512VL-NEXT: retq +; AVX512-LABEL: test_v16i16: +; AVX512: # %bb.0: +; AVX512-NEXT: vmovdqa (%rdi), %ymm0 +; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 +; AVX512-NEXT: vptest %ymm1, %ymm0 +; AVX512-NEXT: setb %al +; AVX512-NEXT: vzeroupper +; AVX512-NEXT: retq %vload = load <16 x i16>, ptr %ptr %v0 = extractelement <16 x i16> %vload, i32 0 %v1 = extractelement <16 x i16> %vload, i32 1 @@ -958,48 +784,17 @@ define i1 @test_v16i8(ptr %ptr) nounwind { ; SSE41: # %bb.0: ; SSE41-NEXT: movdqa (%rdi), %xmm0 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm0, %xmm1 ; SSE41-NEXT: ptest %xmm1, %xmm0 ; SSE41-NEXT: setb %al ; SSE41-NEXT: retq ; -; AVX1OR2-LABEL: test_v16i8: -; AVX1OR2: # %bb.0: -; AVX1OR2-NEXT: vmovdqa (%rdi), %xmm0 -; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 -; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm1 -; AVX1OR2-NEXT: vptest %xmm1, %xmm0 -; AVX1OR2-NEXT: setb %al -; AVX1OR2-NEXT: retq -; -; AVX512F-LABEL: test_v16i8: -; AVX512F: # %bb.0: -; AVX512F-NEXT: vmovdqa (%rdi), %xmm0 -; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512F-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512F-NEXT: vptest %xmm1, %xmm0 -; AVX512F-NEXT: setb %al -; AVX512F-NEXT: vzeroupper -; AVX512F-NEXT: retq -; -; AVX512BW-LABEL: test_v16i8: -; AVX512BW: # %bb.0: -; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0 -; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 -; AVX512BW-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm1 -; AVX512BW-NEXT: vptest %xmm1, %xmm0 -; AVX512BW-NEXT: setb %al -; AVX512BW-NEXT: vzeroupper -; AVX512BW-NEXT: retq -; -; AVX512VL-LABEL: test_v16i8: -; AVX512VL: # %bb.0: -; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0 -; AVX512VL-NEXT: vmovdqa %xmm0, %xmm1 -; AVX512VL-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm1 -; AVX512VL-NEXT: vptest %xmm1, %xmm0 -; AVX512VL-NEXT: setb %al -; AVX512VL-NEXT: retq +; AVX-LABEL: test_v16i8: +; AVX: # %bb.0: +; AVX-NEXT: vmovdqa (%rdi), %xmm0 +; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 +; AVX-NEXT: vptest %xmm1, %xmm0 +; AVX-NEXT: setb %al +; AVX-NEXT: retq %vload = load <16 x i8>, ptr %ptr %v0 = extractelement <16 x i8> %vload, i32 0 %v1 = extractelement <16 x i8> %vload, i32 1 @@ -1036,3 +831,8 @@ define i1 @test_v16i8(ptr %ptr) nounwind { ret i1 %vcheck } +;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: +; AVX1OR2: {{.*}} +; AVX512BW: {{.*}} +; AVX512F: {{.*}} +; AVX512VL: {{.*}} -- 2.7.4