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

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

https://gcc.gnu.org/g:301afaab5b8eafd3d24234fbc266be05590e1acf

commit r17-3970-g301afaab5b8eafd3d24234fbc266be05590e1acf
Author: Kyrylo Tkachov <[email protected]>
Date:   Sun Aug 23 10:33:15 2026 +0200

    ifcvt: Handle arm-only diamond live-outs [PR125557]

    The diamond conversion currently requires one arm's live-out destinations
    to contain the other's.  This rejects diamonds in which the arms update
    different values, although a destination can keep its incoming value on the
    path that does not assign it.

    For example, convert

      then:                    else:
        x = a;                   z = c;
        y = b;                   w = d;

    to

      z_tmp = c;
      w_tmp = d;
      x = cond ? a : x;
      y = cond ? b : y;
      z = cond ? z : z_tmp;
      w = cond ? w : w_tmp;

    Build the metadata for both arms once.  Append an output entry for the last
    else definition of each live-out destination that the then arm does not
    define.  The existing conditional-move loop then selects between the else
    temporary and the incoming value for these entries.  It continues to select
    between the then and else values for shared entries.

    Form the union of the live-out destinations and permit arm-only
destinations
    and one-set arms.  Do not restrict partially overlapping sets based on the
    source of a shared destination.  Keep the CFG arm order and evaluate the
else
    arm into temporaries.  Include the complete live-out union and the appended
    output entries in the conversion limit.

    Add execution and code-generation tests for disjoint and partially
    overlapping outputs, one-set arms, cross-arm incoming values, repeated
    definitions, condition inputs, unequal output counts, condition-code
    clobbers, and the final output limit.

    Bootstrapped and tested on aarch64-none-linux-gnu.

    gcc/ChangeLog:

            PR tree-optimization/125557
            * ifcvt.cc (noce_convert_multiple_sets): Build metadata for both
arms.
            Append entries for else-only live-out destinations, enforce the
final
            output limit, and preserve the then-arm source location.
            (noce_convert_multiple_sets_1): Consume the unified output
metadata.
            Select incoming values for destinations defined by only one arm.
            (init_noce_multiple_sets_info): Initialize stable metadata fields.
            (bb_ok_for_noce_convert_multiple_sets): Remove final-source
            classification.
            (noce_process_if_block): Form the union of the arm live-outs,
accept
            arm-only destinations and one-set arms without a shared-source
gate, and
            keep the CFG arm order.

    gcc/testsuite/ChangeLog:

            PR tree-optimization/125557
            * gcc.target/aarch64/ifcvt_multiple_sets_diamond_4.c: Test
disjoint,
            partially overlapping, and one-set outputs.
            * gcc.target/aarch64/ifcvt_multiple_sets_diamond_5.c: Update
expected
            code generation for the fixed arm order.
            * gcc.target/aarch64/ifcvt_multiple_sets_diamond_6.c: New test.
            * gcc.target/aarch64/ifcvt_multiple_sets_diamond_7.c: New test.
            * gcc.target/i386/ifcvt-multiple-sets-diamond-1.c: Test disjoint
outputs
            with a condition-code clobber.

    Co-authored-by: Cui Lili <[email protected]>
    Signed-off-by: Kyrylo Tkachov <[email protected]>

Reply via email to