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

--- Comment #15 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Richard Biener <rgue...@gcc.gnu.org>:

https://gcc.gnu.org/g:fedcf3c476aff7533741a1c61071200f0a38cf83

commit r12-2254-gfedcf3c476aff7533741a1c61071200f0a38cf83
Author: Richard Biener <rguent...@suse.de>
Date:   Thu Jul 8 09:52:49 2021 +0200

    tree-optimization/101373 - avoid PRE across externally throwing call

    PRE already tries to avoid hoisting possibly trapping expressions
    across calls that might not return normally but fails to consider
    const calls that throw externally.  The following fixes that and
    also plugs the hole of trapping references not pruned in case
    they are not catched by the actuall call clobbering it.

    At -Os we hit the same issue in RTL PRE and postreload-gcse has
    even more incomplete checks so the patch adjusts both of those
    as well.

    2021-07-08  Richard Biener  <rguent...@suse.de>

            PR tree-optimization/101373
            * tree-ssa-pre.c (prune_clobbered_mems): Also prune trapping
            references when the BB may not return.
            (compute_avail): Pass in the function we're working on and
            replace cfun references with it.  Externally throwing
            const calls also possibly terminate the function.
            (pass_pre::execute): Pass down the function we're working on.
            * gcse.c (compute_hash_table_work): Externally throwing
            const/pure calls also need record_last_mem_set_info.
            * postreload-gcse.c (record_opr_changes): Looping or externally
            throwing const/pure calls also need record_last_mem_set_info.

            * g++.dg/torture/pr101373.C: New testcase, XFAILed.
            * gnat.dg/opt95.adb: Likewise.

Reply via email to