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

--- Comment #25 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:0502e6b1e7be3d3fe00727e2936d3c3a03537c4e

commit r17-3442-g0502e6b1e7be3d3fe00727e2936d3c3a03537c4e
Author: Konstantinos Eleftheriou <[email protected]>
Date:   Thu Jul 9 02:22:29 2026 -0700

    match.pd, forwprop: Recognize long-multiply carries written as 2-arg PHI

    Hand-written long-multiply code commonly writes the carry as a 2-arg
    PHI

        if (mul_hilo0 > low_sum)
          result = result_partial + (1ULL << N);
        else
          result = result_partial;

    with no top-level + at the join for the chain walk to start from.

    Add a PHI-driven entry: cond_carry_add / cond_carry_add_neg match
    PHI<base + pow2, base> guarded by an unsigned compare on (a, sum) in
    either polarity; the captured sum is classified into a carry summand,
    base is linearized for the remaining summands, and on a match the
    2N-bit multiply is emitted with the PHI result as its LHS.  Only
    HIGH_PART rows are reachable; LOW_PART rows are BIT_IOR chains and
    never produce a carry PHI.

            PR tree-optimization/107090

    gcc/ChangeLog:

            * match.pd: Add cond_carry_add and cond_carry_add_neg match
            recognizers for the 2-arg PHI form PHI<base + pow2, base>,
            one per gcond polarity.
            * tree-ssa-forwprop.cc (gimple_cond_carry_add): Declare.
            (gimple_cond_carry_add_neg): Likewise.
            (long_mul_check_low_plus_defer): Note that the PHI entry commits
            only to HIGH_PART rows.
            (long_mul_classify_match): Take the candidate statement for the
            per-row checks.
            (long_mul_classify_chain): Take an optional pre-classified extra
            summand, for the carry the PHI entry synthesizes.
            (match_long_mul): Adjust.
            (match_long_mul_phi): New PHI-driven entry; recognizes a
            cond_carry_add(_neg) PHI and folds the long-multiply
            when the rest of the high-part chain matches.
            (pass_forwprop::execute): Call match_long_mul_phi on each
            PHI in the degenerate-PHI walk.

    gcc/testsuite/ChangeLog:

            * gcc.dg/tree-ssa/long-mul-carry.c: Add PHI-form CARRY_LOW_SUM,
            CARRY_CROSS_SUM, and negated-branch compile variants; split the
            forwprop1 high-part fold count into 10 on int128 and 8 on !int128.
            * gcc.dg/tree-ssa/long-mul-two-carry.c: Add the
            mulh_two_carry_low_phi function and its forwprop3 high-part
            (carry PHI) fold scan.
            * gcc.dg/tree-ssa/long-mul-boundary-64.c: New test.
            * gcc.dg/tree-ssa/long-mul-boundary.c: New test.
            * gcc.dg/tree-ssa/long-mul-partial.c: New test.

    Co-authored-by: Philipp Tomsich <[email protected]>

Reply via email to