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

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

https://gcc.gnu.org/g:5f1024922d3f675852196cdd45b47935892c2c96

commit r16-8128-g5f1024922d3f675852196cdd45b47935892c2c96
Author: Richard Biener <[email protected]>
Date:   Fri Mar 13 13:11:56 2026 +0100

    tree-optimization/122380 - avoid PRE/hoisting of incompatible access-path

    This decouples the PRE reference IL from the VN hash tables, following
    the corresponding PR103037 fix for nary expressions in r12-7389 to avoid
    correctness issues regarding to access paths when inserting expressions.

    Unfortunately this makes existing workarounds for alignment and alias
    mismatches ineffective so those have to be re-implemented.  Instead
    of going back to implement canonexpr() during the ANTIC dataflow the
    following does this at insertion time, hoping all relevant reaching
    expressions will survive.  A convenient place to do this is
    sorted_array_from_bitmap_set, the actual magic worker is 'prefer',
    for the moment handling alignment and innermost access size only,
    as those are the cases we have test coverage.  In particular the
    access path difference seen in this PR is not covered - it is enough
    to fix the AVAIL_OUT computation in compute_avail for this.

    Where the old fixup code massaged the expressions the new code selects
    from existing expressions or as fallback makes sure to not perform
    code insertion when two incompatible expressions met.

            PR tree-optimization/122380
            * tree-ssa-sccvn.h (copy_reference_ops_from_ref): Declare.
            (vn_reference_compute_hash): Likewise.
            (vn_reference_eq): Add parameter indicating lexical equivalence,
            defaulted to false.
            * tree-ssa-sccvn.cc (vn_reference_eq): Likewise.
            (print_vn_reference_ops): Print alias type and alignment.
            (vn_reference_compute_hash): Export.
            (copy_reference_ops_from_ref): Likewise.
            * tree-ssa-pre.cc (pre_expr_d::equal): Use lexical equivalence.
            (get_or_alloc_expr_for_reference): Also get value-id, upon
            zero assign a new value-id if the expression is unknown.
            (expr_cmp): New helper.
            (prefer): Likewise.
            (pre_expr_DFS): Get expression exclusion bitmap and honor it.
            (sorted_array_from_bitmap_set): If done for insertion, do limited
            canonexpr() via pairwise prefer on expression pairs with the same
            value, populating an exclution bitmap.
            (phi_translate_1): Do not use the VN hashtable expressions
            or insert there.  Instead maintain a PRE view of expressions.
            (clean): Adjust.
            (do_hoist_insertion): Likewise.
            (insert): Likewise.
            (compute_avail): Use gimple_could_trap_p_1
            on the original stmt rather than vn_reference_may_trap on
            the VN leader.  Use the original stmt operands for the PRE
            view of reference expressions, only use the value number from the
VN
            tables.  Remove no longer effective workarounds for semantically
            different references with same value.
            (fini_pre): Release operand vectors for PRE IL reference
            expressions.

            * g++.dg/torture/pr122380.C: New testcase.
            * gcc.dg/torture/pr65270-3.c: Likewise.
            * gcc.dg/tree-ssa/ssa-pre-30.c: XFAIL.

Reply via email to