[Bug tree-optimization/105937] [12/13 Regression] maybe-uninitialized with std::optional

cvs-commit at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon Aug 22 06:18:35 GMT 2022


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

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

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

commit r13-2134-gc77fae1ca796d6ea06d5cd437909905c3d3d771c
Author: Richard Biener <rguenther@suse.de>
Date:   Fri Aug 19 14:12:52 2022 +0200

    tree-optimization/105937 - avoid uninit diagnostics crossing iterations

    The following avoids adding PHIs to the worklist for uninit processing
    if we reach them following backedges.  That confuses predicate analysis
    because it assumes the use is happening in the same iteration as the the
    definition.  For the testcase in the PR the situation is like

    void foo (int val)
    {
      int uninit;
      # val = PHI <..> (B)
      for (..)
        {
          if (..)
            {
              .. = val; (C)
              val = uninit;
            }
          # val = PHI <..> (A)
        }
    }

    and starting from (A) with 'uninit' as argument we arrive at (B)
    and from there at (C).  Predicate analysis then tries to prove
    the predicate of (B) (not the backedge) can prove that the
    path from (B) to (C) is unreachable which isn't really what it
    necessary - that's what we'd need to do when the preheader
    edge of the loop were the edge with the uninitialized def.

    So the following makes those cases intentionally false negatives.

            PR tree-optimization/105937
            * tree-ssa-uninit.cc (find_uninit_use): Do not queue PHIs
            on backedges.
            (execute_late_warn_uninitialized): Mark backedges.

            * g++.dg/uninit-pr105937.C: New testcase.


More information about the Gcc-bugs mailing list