https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107090

--- Comment #23 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Philipp Tomsich <[email protected]>:

https://gcc.gnu.org/g:91cca3ac45e7f286e770536030da982d65615d4f

commit r17-3440-g91cca3ac45e7f286e770536030da982d65615d4f
Author: Konstantinos Eleftheriou <[email protected]>
Date:   Wed Jul 8 02:40:33 2026 -0700

    forwprop: Add long-multiply ladder variants

    Extend the long-multiply fold to the ladder forms, which propagate the
    cross-product carries via mask / shift / add steps on intermediate
    sums rather than via an explicit overflow compare:

      ladder_sum1     = (hilo & mask) + hilo' + (xl*yl >> N)
      ladder_part_sum = (xl*yl >> N) + hilo
      ladder_sum2     = (ladder_part_sum & mask) + hilo'
      ladder_sum3     = (hilo & mask) + (hilo' & mask) + (xl*yl >> N)

    The high-part chain is xh*yh + (hilo >> N) + (ladder_sumN >> N) [+ ...];
    the corresponding LOW_PART recovers (xl*yl & mask) | (ladder_sumN << N).

            PR tree-optimization/107090

    gcc/ChangeLog:

            * match.pd: Add mul_ladder_sum1, mul_ladder_sum2,
            mul_ladder_sum3 and mul_ladder_part_sum atom recognizers.
            * tree-ssa-forwprop.cc (gimple_mul_ladder_sum1): Declare.
            (gimple_mul_ladder_sum2): Likewise.
            (gimple_mul_ladder_sum3): Likewise.
            (gimple_mul_ladder_part_sum): Likewise.
            (enum long_mul_kind): Add LMK_LADDER_SUM1 / LMK_LADDER_SUM2
            / LMK_LADDER_SUM3 / LMK_LADDER_PART_SUM, with the
            long_mul_table HIGH_PART and LOW_PART rows for each ladder
            form.
            (long_mul_set_summand): Handle the new kinds.
            (long_mul_classify_carry): Update the specificity note above
            long_mul_classify_plus_kinds.
            (long_mul_classify_plus_kinds): Try mul_ladder_sum3 and
            mul_ladder_sum1 before mul_low_sum (more-constrained
            first); add mul_ladder_sum2.
            (long_mul_classify_hi_extract): Add mul_ladder_part_sum
            branch.
            (long_mul_classify_lo_extract): Adjust.

    gcc/testsuite/ChangeLog:

            * gcc.target/aarch64/long_mul.c: Add mulh_ladder and
            mulh_ladder_32 functions; bump expected umulh / umull
            scan counts from 1 to 2.
            * gcc.target/i386/long_mul.c: Same for mulq / imulq.
            * gcc.dg/tree-ssa/long-mul-ladder.c: New test.

Reply via email to