[llvm] [ValueTracking][X86] Compute KnownBits for phadd/phsub (PR #92429)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 10 03:30:36 PDT 2024
================
@@ -37276,6 +37296,55 @@ void X86TargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
computeKnownBitsForPSADBW(LHS, RHS, Known, DemandedElts, DAG, Depth);
break;
}
+ case Intrinsic::x86_ssse3_phadd_d:
+ case Intrinsic::x86_ssse3_phadd_w:
+ case Intrinsic::x86_ssse3_phadd_d_128:
+ case Intrinsic::x86_ssse3_phadd_w_128:
+ case Intrinsic::x86_avx2_phadd_d:
+ case Intrinsic::x86_avx2_phadd_w: {
+ Known = computeKnownBitsForHorizontalOperation(
+ Op, DemandedElts, Depth, /*OpIndexStart=*/1, DAG,
+ [](const KnownBits &KnownLHS, const KnownBits &KnownRHS) {
+ return KnownBits::computeForAddSub(
+ /*Add=*/true, /*NSW=*/false, /*NUW=*/false, KnownLHS, KnownRHS);
+ });
+ break;
+ }
+ case Intrinsic::x86_ssse3_phadd_sw:
+ case Intrinsic::x86_ssse3_phadd_sw_128:
+ case Intrinsic::x86_avx2_phadd_sw: {
+ Known = computeKnownBitsForHorizontalOperation(
+ Op, DemandedElts, Depth, /*OpIndexStart=*/1, DAG,
+ [](const KnownBits &KnownLHS, const KnownBits &KnownRHS) {
+ return KnownBits::sadd_sat(KnownLHS, KnownRHS);
+ });
+ break;
+ }
+ case Intrinsic::x86_ssse3_phsub_d:
+ case Intrinsic::x86_ssse3_phsub_w:
+ case Intrinsic::x86_ssse3_phsub_d_128:
+ case Intrinsic::x86_ssse3_phsub_w_128:
+ case Intrinsic::x86_avx2_phsub_d:
+ case Intrinsic::x86_avx2_phsub_w: {
+ Known = computeKnownBitsForHorizontalOperation(
+ Op, DemandedElts, Depth, /*OpIndexStart=*/1, DAG,
+ [](const KnownBits &KnownLHS, const KnownBits &KnownRHS) {
+ return KnownBits::computeForAddSub(/*Add=*/false, /*NSW=*/false,
+ /*NUW=*/false, KnownLHS,
+ KnownRHS);
+ });
+ break;
+ }
+ case Intrinsic::x86_ssse3_phsub_sw:
+ case Intrinsic::x86_ssse3_phsub_sw_128:
+ case Intrinsic::x86_avx2_phsub_sw: {
+ Known = computeKnownBitsForHorizontalOperation(
+ Op, DemandedElts, Depth, /*OpIndexStart=*/1, DAG,
+ [](const KnownBits &KnownLHS, const KnownBits &KnownRHS) {
+ return KnownBits::ssub_sat(KnownLHS, KnownRHS);
+ });
+ break;
----------------
RKSimon wrote:
I'd prefer it in the DAG if we just handled the X86ISD::HADD/SUB nodes and not the intrinsics - we try to do as little as possible with MMX types in DAG, and the saturation instructions are very rare - its much more likely that we just need to determine knownbits for X86ISD::HADD/SUB nodes we've created in the DAG.
https://github.com/llvm/llvm-project/pull/92429
More information about the llvm-commits
mailing list