]> granicus.if.org Git - llvm/commitdiff
[x86] fix remaining miscompile bug in horizontal binop matching (PR40243)
authorSanjay Patel <spatel@rotateright.com>
Thu, 10 Jan 2019 15:27:23 +0000 (15:27 +0000)
committerSanjay Patel <spatel@rotateright.com>
Thu, 10 Jan 2019 15:27:23 +0000 (15:27 +0000)
When we use the partial-matching function on a 128-bit chunk, we must
account for the possibility that we've matched undef halves of the
original source vectors, so the outputs may need to be reset.

This should allow closing PR40243:
https://bugs.llvm.org/show_bug.cgi?id=40243

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@350830 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/phaddsub-undef.ll

index 277fa2d2677238a6fe8f4aa7011c9548d8bfa2d6..1695bc59bb58aef5a64e65e24723be35c782e9c6 100644 (file)
@@ -8370,7 +8370,6 @@ static SDValue LowerToHorizontalOp(const BuildVectorSDNode *BV,
   SDLoc DL(BV);
   SDValue InVec0, InVec1;
   if (VT == MVT::v8i32 || VT == MVT::v16i16) {
-    // Try to match an AVX2 horizontal add/sub of signed integers.
     SDValue InVec2, InVec3;
     unsigned X86Opcode;
     bool CanFold = true;
@@ -8397,12 +8396,16 @@ static SDValue LowerToHorizontalOp(const BuildVectorSDNode *BV,
       if (NumUndefsLO + 1 == Half || NumUndefsHI + 1 == Half)
         return SDValue();
 
-      // Convert this build_vector into a pair of horizontal binop followed by
-      // a concat vector.
+      // Convert this build_vector into a pair of horizontal binops followed by
+      // a concat vector. We must adjust the outputs from the partial horizontal
+      // matching calls above to account for undefined vector halves.
+      SDValue V0 = InVec0.isUndef() ? InVec2 : InVec0;
+      SDValue V1 = InVec1.isUndef() ? InVec3 : InVec1;
+      assert((!V0.isUndef() || !V1.isUndef()) && "Horizontal-op of undefs?");
       bool isUndefLO = NumUndefsLO == Half;
       bool isUndefHI = NumUndefsHI == Half;
-      return ExpandHorizontalBinOp(InVec0, InVec1, DL, DAG, X86Opcode, false,
-                                   isUndefLO, isUndefHI);
+      return ExpandHorizontalBinOp(V0, V1, DL, DAG, X86Opcode, false, isUndefLO,
+                                   isUndefHI);
     }
   }
 
index c827665400ac797a514ffb81cf9a1fb322cbe2da..f763dbe4a7aa59be583c21526af64179ea82632d 100644 (file)
@@ -101,6 +101,10 @@ define <8 x i32> @PR40243_alt(<8 x i32> %a, <8 x i32> %b) {
 ;
 ; AVX1-LABEL: PR40243_alt:
 ; AVX1:       # %bb.0:
+; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
+; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX1-NEXT:    vphaddd %xmm1, %xmm0, %xmm0
+; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
 ; AVX1-NEXT:    retq
 ;
 ; AVX2-LABEL: PR40243_alt: