diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 258576f0cdff83..85abf00774a026 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -1739,6 +1739,20 @@ static void computeKnownBitsFromOperator(const Operator *I, Known &= Known2.anyextOrTrunc(BitWidth); break; } + case Intrinsic::x86_sse2_pmulh_w: + case Intrinsic::x86_avx2_pmulh_w: + case Intrinsic::x86_avx512_pmulh_w_512: + computeKnownBits(I->getOperand(0), DemandedElts, Known, Depth + 1, Q); + computeKnownBits(I->getOperand(1), DemandedElts, Known2, Depth + 1, Q); + Known = KnownBits::mulhs(Known, Known2); + break; + case Intrinsic::x86_sse2_pmulhu_w: + case Intrinsic::x86_avx2_pmulhu_w: + case Intrinsic::x86_avx512_pmulhu_w_512: + computeKnownBits(I->getOperand(0), DemandedElts, Known, Depth + 1, Q); + computeKnownBits(I->getOperand(1), DemandedElts, Known2, Depth + 1, Q); + Known = KnownBits::mulhu(Known, Known2); + break; case Intrinsic::x86_sse42_crc32_64_64: Known.Zero.setBitsFrom(32); break; diff --git a/llvm/test/Transforms/InstCombine/X86/x86-pmulh.ll b/llvm/test/Transforms/InstCombine/X86/x86-pmulh.ll index 63b6b1a7c6b17e..947c7d38d26ee0 100644 --- a/llvm/test/Transforms/InstCombine/X86/x86-pmulh.ll +++ b/llvm/test/Transforms/InstCombine/X86/x86-pmulh.ll @@ -240,11 +240,7 @@ define <32 x i16> @elts_pmulh_512(<32 x i16> %a0, <32 x i16> %a1) { define <8 x i16> @known_pmulh_128(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> %a2) { ; CHECK-LABEL: @known_pmulh_128( -; CHECK-NEXT: [[X0:%.*]] = lshr <8 x i16> [[A0:%.*]], -; CHECK-NEXT: [[X1:%.*]] = and <8 x i16> [[A1:%.*]], -; CHECK-NEXT: [[M:%.*]] = tail call <8 x i16> @llvm.x86.sse2.pmulh.w(<8 x i16> [[X0]], <8 x i16> [[X1]]) -; CHECK-NEXT: [[R:%.*]] = add <8 x i16> [[M]], [[A2:%.*]] -; CHECK-NEXT: ret <8 x i16> [[R]] +; CHECK-NEXT: ret <8 x i16> [[A2:%.*]] ; %x0 = lshr <8 x i16> %a0, %x1 = and <8 x i16> %a1, @@ -255,11 +251,7 @@ define <8 x i16> @known_pmulh_128(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> %a2) { define <16 x i16> @known_pmulh_256(<16 x i16> %a0, <16 x i16> %a1, <16 x i16> %a2) { ; CHECK-LABEL: @known_pmulh_256( -; CHECK-NEXT: [[X0:%.*]] = lshr <16 x i16> [[A0:%.*]], -; CHECK-NEXT: [[X1:%.*]] = and <16 x i16> [[A1:%.*]], -; CHECK-NEXT: [[M:%.*]] = tail call <16 x i16> @llvm.x86.avx2.pmulh.w(<16 x i16> [[X0]], <16 x i16> [[X1]]) -; CHECK-NEXT: [[R:%.*]] = add <16 x i16> [[M]], [[A2:%.*]] -; CHECK-NEXT: ret <16 x i16> [[R]] +; CHECK-NEXT: ret <16 x i16> [[A2:%.*]] ; %x0 = lshr <16 x i16> %a0, %x1 = and <16 x i16> %a1, @@ -270,11 +262,7 @@ define <16 x i16> @known_pmulh_256(<16 x i16> %a0, <16 x i16> %a1, <16 x i16> %a define <32 x i16> @known_pmulh_512(<32 x i16> %a0, <32 x i16> %a1, <32 x i16> %a2) { ; CHECK-LABEL: @known_pmulh_512( -; CHECK-NEXT: [[X0:%.*]] = lshr <32 x i16> [[A0:%.*]], -; CHECK-NEXT: [[X1:%.*]] = and <32 x i16> [[A1:%.*]], -; CHECK-NEXT: [[M:%.*]] = tail call <32 x i16> @llvm.x86.avx512.pmulh.w.512(<32 x i16> [[X0]], <32 x i16> [[X1]]) -; CHECK-NEXT: [[R:%.*]] = add <32 x i16> [[M]], [[A2:%.*]] -; CHECK-NEXT: ret <32 x i16> [[R]] +; CHECK-NEXT: ret <32 x i16> [[A2:%.*]] ; %x0 = lshr <32 x i16> %a0, %x1 = and <32 x i16> %a1, diff --git a/llvm/test/Transforms/InstCombine/X86/x86-pmulhu.ll b/llvm/test/Transforms/InstCombine/X86/x86-pmulhu.ll index 8234bba696db5b..560969f7c4a81d 100644 --- a/llvm/test/Transforms/InstCombine/X86/x86-pmulhu.ll +++ b/llvm/test/Transforms/InstCombine/X86/x86-pmulhu.ll @@ -234,11 +234,7 @@ define <32 x i16> @elts_pmulhu_512(<32 x i16> %a0, <32 x i16> %a1) { define <8 x i16> @known_pmulhu_128(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> %a2) { ; CHECK-LABEL: @known_pmulhu_128( -; CHECK-NEXT: [[X0:%.*]] = lshr <8 x i16> [[A0:%.*]], -; CHECK-NEXT: [[X1:%.*]] = and <8 x i16> [[A1:%.*]], -; CHECK-NEXT: [[M:%.*]] = tail call <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16> [[X0]], <8 x i16> [[X1]]) -; CHECK-NEXT: [[R:%.*]] = add <8 x i16> [[M]], [[A2:%.*]] -; CHECK-NEXT: ret <8 x i16> [[R]] +; CHECK-NEXT: ret <8 x i16> [[A2:%.*]] ; %x0 = lshr <8 x i16> %a0, %x1 = and <8 x i16> %a1, @@ -249,11 +245,7 @@ define <8 x i16> @known_pmulhu_128(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> %a2) define <16 x i16> @known_pmulhu_256(<16 x i16> %a0, <16 x i16> %a1, <16 x i16> %a2) { ; CHECK-LABEL: @known_pmulhu_256( -; CHECK-NEXT: [[X0:%.*]] = lshr <16 x i16> [[A0:%.*]], -; CHECK-NEXT: [[X1:%.*]] = and <16 x i16> [[A1:%.*]], -; CHECK-NEXT: [[M:%.*]] = tail call <16 x i16> @llvm.x86.avx2.pmulhu.w(<16 x i16> [[X0]], <16 x i16> [[X1]]) -; CHECK-NEXT: [[R:%.*]] = add <16 x i16> [[M]], [[A2:%.*]] -; CHECK-NEXT: ret <16 x i16> [[R]] +; CHECK-NEXT: ret <16 x i16> [[A2:%.*]] ; %x0 = lshr <16 x i16> %a0, %x1 = and <16 x i16> %a1, @@ -264,11 +256,7 @@ define <16 x i16> @known_pmulhu_256(<16 x i16> %a0, <16 x i16> %a1, <16 x i16> % define <32 x i16> @known_pmulhu_512(<32 x i16> %a0, <32 x i16> %a1, <32 x i16> %a2) { ; CHECK-LABEL: @known_pmulhu_512( -; CHECK-NEXT: [[X0:%.*]] = lshr <32 x i16> [[A0:%.*]], -; CHECK-NEXT: [[X1:%.*]] = and <32 x i16> [[A1:%.*]], -; CHECK-NEXT: [[M:%.*]] = tail call <32 x i16> @llvm.x86.avx512.pmulhu.w.512(<32 x i16> [[X0]], <32 x i16> [[X1]]) -; CHECK-NEXT: [[R:%.*]] = add <32 x i16> [[M]], [[A2:%.*]] -; CHECK-NEXT: ret <32 x i16> [[R]] +; CHECK-NEXT: ret <32 x i16> [[A2:%.*]] ; %x0 = lshr <32 x i16> %a0, %x1 = and <32 x i16> %a1,