[X86] canonicalizeShuffleWithBinOps - ensure a binary shuffle of binops have the...
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Mon, 5 Jun 2023 10:18:17 +0000 (11:18 +0100)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Mon, 5 Jun 2023 10:18:28 +0000 (11:18 +0100)
Fixes #63091

llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/pr63091.ll

index f660c84..2542c8d 100644 (file)
@@ -41808,6 +41808,7 @@ static SDValue canonicalizeShuffleWithBinOps(SDValue N, SelectionDAG &DAG,
       SDValue N1 = peekThroughOneUseBitcasts(N.getOperand(1));
       unsigned SrcOpcode = N0.getOpcode();
       if (TLI.isBinOp(SrcOpcode) && N1.getOpcode() == SrcOpcode &&
+          N0.getValueType() == N1.getValueType() &&
           IsSafeToMoveShuffle(N0, SrcOpcode) &&
           IsSafeToMoveShuffle(N1, SrcOpcode)) {
         SDValue Op00 = peekThroughOneUseBitcasts(N0.getOperand(0));
index 2982e3a..3f50be8 100644 (file)
@@ -5,20 +5,22 @@
 
 ; Ensure canonicalizeShuffleWithBinOps doesn't merge binops with different types
 
-; FIXME: Don't merge PCMPGT nodes of different types
+; Don't merge PCMPGT nodes of different types
 define <4 x i32> @dont_merge_pcmpgt(<16 x i8> %0, <4 x i32> %1) {
 ; SSE-LABEL: dont_merge_pcmpgt:
 ; SSE:       # %bb.0:
 ; SSE-NEXT:    pxor %xmm2, %xmm2
-; SSE-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5],xmm1[6,7]
 ; SSE-NEXT:    pcmpgtb %xmm2, %xmm0
+; SSE-NEXT:    pcmpgtd %xmm2, %xmm1
+; SSE-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5],xmm1[6,7]
 ; SSE-NEXT:    retq
 ;
 ; AVX-LABEL: dont_merge_pcmpgt:
 ; AVX:       # %bb.0:
 ; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
-; AVX-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3]
 ; AVX-NEXT:    vpcmpgtb %xmm2, %xmm0, %xmm0
+; AVX-NEXT:    vpcmpgtd %xmm2, %xmm1, %xmm1
+; AVX-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3]
 ; AVX-NEXT:    retq
   %3 = icmp sgt <16 x i8> %0, zeroinitializer
   %4 = sext <16 x i1> %3 to <16 x i8>