Enable -Wuninitialized + -ftrivial-auto-var-init for address taken variables.
authorQing Zhao <qing.zhao@oracle.com>
Mon, 17 Jan 2022 17:41:07 +0000 (17:41 +0000)
committerQing Zhao <qing.zhao@oracle.com>
Mon, 17 Jan 2022 17:41:07 +0000 (17:41 +0000)
commit6cb61e50ade62f1e7c8653b8d6fc6a632fd3977f
treef6d73e01f4e4c0cab5eb81a441e587d7b3832e8c
parentaeca44768d54b089243004d1ef00d34dfa9f6530
Enable -Wuninitialized + -ftrivial-auto-var-init for address taken variables.

With -ftrivial-auto-var-init, the address taken auto variable is replaced with
a temporary variable during gimplification, and the original auto variable might
be eliminated by compiler optimization completely. As a result, the current
uninitialized warning analysis cannot get enough information from the IR,
therefore the uninitialized warnings for address taken variable cannot be
issued based on the current implemenation of -ftrival-auto-var-init.

For more info please refer to:
https://gcc.gnu.org/pipermail/gcc-patches/2021-August/577431.html

In order to improve this situation, we can improve uninitialized analysis
for address taken auto variables with -ftrivial-auto-var-init as following:

for the following stmt:

    _1 = .DEFERRED_INIT (4, 2, &"alt_reloc"[0]);
    if (_1 != 0)

The original variable DECL has been eliminated from the IR, all the necessary
information that is needed for reporting the warnings for DECL can be acquired
from the call to .DEFERRED_INIT.

    A. the name string of DECL from the 3rd parameter of the call;
    B. the location of the DECL from the location of the call;
    C. the call can also be used to hold the information on whether the warning
       has been issued or not to suppress warning messages when needed;

The current testing cases for uninitialized warnings + -ftrivial-auto-var-init
are adjusted to reflect the fact that we can issue warnings for address taken
variables.

gcc/ChangeLog:

2022-01-17  qing zhao  <qing.zhao@oracle.com>

* tree-ssa-uninit.c (warn_uninit): Delete the 4th parameter. Handle
.DEFERRED_INIT call with an anonymous SSA_NAME specially.
(check_defs): Handle .DEFERRED_INIT call with an anonymous SSA_NAME
specially.
(warn_uninit_phi_uses): Delete the 4th actual when call warn_uninit.
(warn_uninitialized_vars): Likewise.
(warn_uninitialized_phi): Likewise.

gcc/testsuite/ChangeLog:

2022-01-17  qing zhao  <qing.zhao@oracle.com>

* gcc.dg/auto-init-uninit-16.c (testfunc): Delete xfail to reflect
the fact that address taken variable can be warned.
* gcc.dg/auto-init-uninit-34.c (warn_scalar_1): Likewise.
(warn_scalar_2): Likewise.
* gcc.dg/auto-init-uninit-37.c (T1): Likewise.
(T2): Likewise.
* gcc.dg/auto-init-uninit-B.c (baz): Likewise.
gcc/testsuite/gcc.dg/auto-init-uninit-16.c
gcc/testsuite/gcc.dg/auto-init-uninit-34.c
gcc/testsuite/gcc.dg/auto-init-uninit-37.c
gcc/testsuite/gcc.dg/auto-init-uninit-B.c
gcc/tree-ssa-uninit.c