Index: lib/CodeGen/SelectionDAG/TargetLowering.cpp =================================================================== --- lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -2203,7 +2203,8 @@ if (C1 == MinVal) return DAG.getBoolConstant(false, dl, VT, OpVT); // X < MIN --> false - if (!VT.isVector()) { // TODO: Support this for vectors. + // TODO: Support this for vectors after legalize ops. + if (!VT.isVector() || DCI.isBeforeLegalizeOps()) { // Canonicalize setlt X, Max --> setne X, Max if (C1 == MaxVal) return DAG.getSetCC(dl, VT, N0, N1, ISD::SETNE); @@ -2220,7 +2221,8 @@ if (C1 == MaxVal) return DAG.getBoolConstant(false, dl, VT, OpVT); // X > MAX --> false - if (!VT.isVector()) { // TODO: Support this for vectors. + // TODO: Support this for vectors after legalize ops. + if (!VT.isVector() || DCI.isBeforeLegalizeOps()) { // Canonicalize setgt X, Min --> setne X, Min if (C1 == MinVal) return DAG.getSetCC(dl, VT, N0, N1, ISD::SETNE); @@ -2235,7 +2237,8 @@ // If we have "setcc X, C0", check to see if we can shrink the immediate // by changing cc. - if (!VT.isVector()) { // TODO: Support this for vectors. + // TODO: Support this for vectors after legalize ops. + if (!VT.isVector() || DCI.isBeforeLegalizeOps()) { // SETUGT X, SINTMAX -> SETLT X, 0 if (Cond == ISD::SETUGT && C1 == APInt::getSignedMaxValue(OperandBitSize)) Index: test/CodeGen/X86/avx512-insert-extract.ll =================================================================== --- test/CodeGen/X86/avx512-insert-extract.ll +++ test/CodeGen/X86/avx512-insert-extract.ll @@ -1707,7 +1707,6 @@ ; KNL-NEXT: subq $64, %rsp ; KNL-NEXT: ## kill: def $esi killed $esi def $rsi ; KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1 -; KNL-NEXT: vpminub %ymm1, %ymm0, %ymm1 ; KNL-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0 ; KNL-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 ; KNL-NEXT: andl $31, %esi @@ -1739,8 +1738,7 @@ ; SKX-NEXT: andq $-32, %rsp ; SKX-NEXT: subq $64, %rsp ; SKX-NEXT: ## kill: def $esi killed $esi def $rsi -; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 -; SKX-NEXT: vpcmpnleub %ymm1, %ymm0, %k0 +; SKX-NEXT: vptestmb %ymm0, %ymm0, %k0 ; SKX-NEXT: andl $31, %esi ; SKX-NEXT: testb %dil, %dil ; SKX-NEXT: vpmovm2b %k0, %ymm0 @@ -1772,10 +1770,8 @@ ; KNL-NEXT: subq $128, %rsp ; KNL-NEXT: ## kill: def $esi killed $esi def $rsi ; KNL-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; KNL-NEXT: vpminub %ymm2, %ymm0, %ymm3 -; KNL-NEXT: vpcmpeqb %ymm3, %ymm0, %ymm0 +; KNL-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0 ; KNL-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 -; KNL-NEXT: vpminub %ymm2, %ymm1, %ymm2 ; KNL-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm1 ; KNL-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 ; KNL-NEXT: andl $63, %esi @@ -1824,8 +1820,7 @@ ; SKX-NEXT: andq $-64, %rsp ; SKX-NEXT: subq $128, %rsp ; SKX-NEXT: ## kill: def $esi killed $esi def $rsi -; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 -; SKX-NEXT: vpcmpnleub %zmm1, %zmm0, %k0 +; SKX-NEXT: vptestmb %zmm0, %zmm0, %k0 ; SKX-NEXT: andl $63, %esi ; SKX-NEXT: testb %dil, %dil ; SKX-NEXT: vpmovm2b %k0, %zmm0 @@ -1955,14 +1950,11 @@ ; KNL-NEXT: vpinsrb $15, 216(%rbp), %xmm3, %xmm3 ; KNL-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 ; KNL-NEXT: vpxor %xmm3, %xmm3, %xmm3 -; KNL-NEXT: vpminub %ymm3, %ymm2, %ymm4 -; KNL-NEXT: vpcmpeqb %ymm4, %ymm2, %ymm2 +; KNL-NEXT: vpcmpeqb %ymm3, %ymm2, %ymm2 ; KNL-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; KNL-NEXT: vpminub %ymm3, %ymm1, %ymm4 -; KNL-NEXT: vpcmpeqb %ymm4, %ymm1, %ymm1 +; KNL-NEXT: vpcmpeqb %ymm3, %ymm1, %ymm1 ; KNL-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; KNL-NEXT: vpminub %ymm3, %ymm0, %ymm4 -; KNL-NEXT: vpcmpeqb %ymm4, %ymm0, %ymm0 +; KNL-NEXT: vpcmpeqb %ymm3, %ymm0, %ymm0 ; KNL-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 ; KNL-NEXT: movl 744(%rbp), %eax ; KNL-NEXT: andl $127, %eax @@ -2138,9 +2130,8 @@ ; SKX-NEXT: vpinsrb $14, 720(%rbp), %xmm2, %xmm2 ; SKX-NEXT: vpinsrb $15, 728(%rbp), %xmm2, %xmm2 ; SKX-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 -; SKX-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; SKX-NEXT: vpcmpnleub %zmm2, %zmm0, %k0 -; SKX-NEXT: vpcmpnleub %zmm2, %zmm1, %k1 +; SKX-NEXT: vptestmb %zmm0, %zmm0, %k0 +; SKX-NEXT: vptestmb %zmm1, %zmm1, %k1 ; SKX-NEXT: movl 744(%rbp), %eax ; SKX-NEXT: andl $127, %eax ; SKX-NEXT: cmpb $0, 736(%rbp) @@ -2178,16 +2169,12 @@ ; KNL-NEXT: subq $256, %rsp ## imm = 0x100 ; KNL-NEXT: ## kill: def $esi killed $esi def $rsi ; KNL-NEXT: vpxor %xmm4, %xmm4, %xmm4 -; KNL-NEXT: vpminub %ymm4, %ymm0, %ymm5 -; KNL-NEXT: vpcmpeqb %ymm5, %ymm0, %ymm0 +; KNL-NEXT: vpcmpeqb %ymm4, %ymm0, %ymm0 ; KNL-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 -; KNL-NEXT: vpminub %ymm4, %ymm1, %ymm5 -; KNL-NEXT: vpcmpeqb %ymm5, %ymm1, %ymm1 +; KNL-NEXT: vpcmpeqb %ymm4, %ymm1, %ymm1 ; KNL-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; KNL-NEXT: vpminub %ymm4, %ymm2, %ymm5 -; KNL-NEXT: vpcmpeqb %ymm5, %ymm2, %ymm2 +; KNL-NEXT: vpcmpeqb %ymm4, %ymm2, %ymm2 ; KNL-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; KNL-NEXT: vpminub %ymm4, %ymm3, %ymm4 ; KNL-NEXT: vpcmpeqb %ymm4, %ymm3, %ymm3 ; KNL-NEXT: vpternlogq $15, %zmm3, %zmm3, %zmm3 ; KNL-NEXT: andl $127, %esi @@ -2264,9 +2251,8 @@ ; SKX-NEXT: andq $-128, %rsp ; SKX-NEXT: subq $256, %rsp ## imm = 0x100 ; SKX-NEXT: ## kill: def $esi killed $esi def $rsi -; SKX-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; SKX-NEXT: vpcmpnleub %zmm2, %zmm0, %k0 -; SKX-NEXT: vpcmpnleub %zmm2, %zmm1, %k1 +; SKX-NEXT: vptestmb %zmm0, %zmm0, %k0 +; SKX-NEXT: vptestmb %zmm1, %zmm1, %k1 ; SKX-NEXT: andl $127, %esi ; SKX-NEXT: testb %dil, %dil ; SKX-NEXT: vpmovm2b %k1, %zmm0 Index: test/CodeGen/X86/vector-compare-simplify.ll =================================================================== --- test/CodeGen/X86/vector-compare-simplify.ll +++ test/CodeGen/X86/vector-compare-simplify.ll @@ -113,9 +113,10 @@ define <4 x i32> @ugt_min(<4 x i32> %x) { ; CHECK-LABEL: ugt_min: ; CHECK: # %bb.0: -; CHECK-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648] +; CHECK-NEXT: pxor %xmm1, %xmm1 +; CHECK-NEXT: pcmpeqd %xmm1, %xmm0 +; CHECK-NEXT: pcmpeqd %xmm1, %xmm1 ; CHECK-NEXT: pxor %xmm1, %xmm0 -; CHECK-NEXT: pcmpgtd %xmm1, %xmm0 ; CHECK-NEXT: retq %cmp = icmp ugt <4 x i32> %x, zeroinitializer %r = sext <4 x i1> %cmp to <4 x i32> @@ -159,10 +160,9 @@ define <4 x i32> @ult_max(<4 x i32> %x) { ; CHECK-LABEL: ult_max: ; CHECK: # %bb.0: -; CHECK-NEXT: pxor {{.*}}(%rip), %xmm0 -; CHECK-NEXT: movdqa {{.*#+}} xmm1 = [2147483647,2147483647,2147483647,2147483647] -; CHECK-NEXT: pcmpgtd %xmm0, %xmm1 -; CHECK-NEXT: movdqa %xmm1, %xmm0 +; CHECK-NEXT: pcmpeqd %xmm1, %xmm1 +; CHECK-NEXT: pcmpeqd %xmm1, %xmm0 +; CHECK-NEXT: pxor %xmm1, %xmm0 ; CHECK-NEXT: retq %cmp = icmp ult <4 x i32> %x, %r = sext <4 x i1> %cmp to <4 x i32> @@ -187,9 +187,7 @@ define <4 x i32> @slt_min_plus1(<4 x i32> %x) { ; CHECK-LABEL: slt_min_plus1: ; CHECK: # %bb.0: -; CHECK-NEXT: movdqa {{.*#+}} xmm1 = [2147483649,2147483649,2147483649,2147483649] -; CHECK-NEXT: pcmpgtd %xmm0, %xmm1 -; CHECK-NEXT: movdqa %xmm1, %xmm0 +; CHECK-NEXT: pcmpeqd {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq %cmp = icmp slt <4 x i32> %x, %r = sext <4 x i1> %cmp to <4 x i32> @@ -212,7 +210,7 @@ define <4 x i32> @sgt_max_minus1(<4 x i32> %x) { ; CHECK-LABEL: sgt_max_minus1: ; CHECK: # %bb.0: -; CHECK-NEXT: pcmpgtd {{.*}}(%rip), %xmm0 +; CHECK-NEXT: pcmpeqd {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq %cmp = icmp sgt <4 x i32> %x, %r = sext <4 x i1> %cmp to <4 x i32> @@ -234,10 +232,8 @@ define <4 x i32> @ult_one(<4 x i32> %x) { ; CHECK-LABEL: ult_one: ; CHECK: # %bb.0: -; CHECK-NEXT: pxor {{.*}}(%rip), %xmm0 -; CHECK-NEXT: movdqa {{.*#+}} xmm1 = [2147483649,2147483649,2147483649,2147483649] -; CHECK-NEXT: pcmpgtd %xmm0, %xmm1 -; CHECK-NEXT: movdqa %xmm1, %xmm0 +; CHECK-NEXT: pxor %xmm1, %xmm1 +; CHECK-NEXT: pcmpeqd %xmm1, %xmm0 ; CHECK-NEXT: retq %cmp = icmp ult <4 x i32> %x, %r = sext <4 x i1> %cmp to <4 x i32> @@ -261,8 +257,8 @@ define <4 x i32> @ugt_max_minus1(<4 x i32> %x) { ; CHECK-LABEL: ugt_max_minus1: ; CHECK: # %bb.0: -; CHECK-NEXT: pxor {{.*}}(%rip), %xmm0 -; CHECK-NEXT: pcmpgtd {{.*}}(%rip), %xmm0 +; CHECK-NEXT: pcmpeqd %xmm1, %xmm1 +; CHECK-NEXT: pcmpeqd %xmm1, %xmm0 ; CHECK-NEXT: retq %cmp = icmp ugt <4 x i32> %x, %r = sext <4 x i1> %cmp to <4 x i32> @@ -285,9 +281,9 @@ define <4 x i32> @ugt_smax(<4 x i32> %x) { ; CHECK-LABEL: ugt_smax: ; CHECK: # %bb.0: -; CHECK-NEXT: pxor {{.*}}(%rip), %xmm0 -; CHECK-NEXT: pcmpeqd %xmm1, %xmm1 -; CHECK-NEXT: pcmpgtd %xmm1, %xmm0 +; CHECK-NEXT: pxor %xmm1, %xmm1 +; CHECK-NEXT: pcmpgtd %xmm0, %xmm1 +; CHECK-NEXT: movdqa %xmm1, %xmm0 ; CHECK-NEXT: retq %cmp = icmp ugt <4 x i32> %x, %r = sext <4 x i1> %cmp to <4 x i32> @@ -310,10 +306,8 @@ define <4 x i32> @ult_smin(<4 x i32> %x) { ; CHECK-LABEL: ult_smin: ; CHECK: # %bb.0: -; CHECK-NEXT: pxor {{.*}}(%rip), %xmm0 -; CHECK-NEXT: pxor %xmm1, %xmm1 -; CHECK-NEXT: pcmpgtd %xmm0, %xmm1 -; CHECK-NEXT: movdqa %xmm1, %xmm0 +; CHECK-NEXT: pcmpeqd %xmm1, %xmm1 +; CHECK-NEXT: pcmpgtd %xmm1, %xmm0 ; CHECK-NEXT: retq %cmp = icmp ult <4 x i32> %x, %r = sext <4 x i1> %cmp to <4 x i32>