Change the 3rd parameter of function .DEFERRED_INIT from IS_VLA to decl name.
authorQing Zhao <qing.zhao@oracle.com>
Tue, 11 Jan 2022 23:18:13 +0000 (23:18 +0000)
committerQing Zhao <qing.zhao@oracle.com>
Tue, 11 Jan 2022 23:18:13 +0000 (23:18 +0000)
commit6c98c8b41b031bdba5c05f4ac875baf48b9efe33
treea56aeb5396a1106e1c04fe36e1529fce470621c7
parenta01be2f3095dc91a6999d4abb3e6c96c58bc5561
Change the 3rd parameter of function .DEFERRED_INIT from IS_VLA to decl name.

Currently, the 3rd parameter of function .DEFERRED_INIT is IS_VLA, which is
not needed at all;

In this patch, we change the 3rd parameter from IS_VLA to the name of the var
decl for the following purposes:

1. Fix (or work around) PR103720:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103720

As confirmed in PR103720, with the current definition of .DEFERRED_INIT,

Dom transformed:
  c$a$0_6 = .DEFERRED_INIT (8, 2, 0);
  _1 = .DEFERRED_INIT (8, 2, 0);

into:
  c$a$0_6 = .DEFERRED_INIT (8, 2, 0);
  _1 = c$a$0_6;

which is incorrectly done due to Dom treating the two calls to const function
.DEFERRED_INIT as the same call since all actual parameters are the same.

The same issue has been exposed in PR102608 due to a different optimization VN,
the fix for PR102608 is to specially handle call to .DEFERRED_INIT in VN to
exclude it from CSE.

To fix PR103720, we could do the same as the fix to PR102608 to specially
handle call to .DEFERRED_INIT in Dom to exclude it from being optimized.

However, in addition to Dom and VN, there should be other optimizations that
have the same issue as PR103720 or PR102608 (As I built Linux kernel with
-ftrivial-auto-var-init=zero -Werror, I noticed a bunch of bugos warnings).

Other than identifying all the optimizations and specially handling call to
.DEFERRED_INIT in all these optimizations, changing the 3rd parameter of the
function .DEFERRED_INIT from IS_VLA to the name string of the var decl might
be a better workaround (or a fix). After this change, since the 3rd actual
parameter is the name string of the variable, different calls for different
variables will have different name strings as the 3rd actual, As a result, the
optimization that previously treated the different calls to .DEFERRED_INIT as
the same will be prevented.

2. Prepare for enabling -Wuninitialized + -ftrivail-auto-var-init for address
taken variables.

As discussion in the following thread:

https://gcc.gnu.org/pipermail/gcc-patches/2021-August/577431.html

With the current implemenation of -ftrivial-auto-var-init and uninitialized
warning analysis, the uninitialized warning for an address taken auto variable
might be missed since the variable is completely eliminated by optimization and
replaced with a temporary variable in all the uses.

In order to improve such situation, changing the 3rd parameter of the function
.DEFERRED_INIT to the name string of the variable will provide necessary
information to uninitialized warning analysis to make the missing warning
possible.

gcc/ChangeLog:

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

* gimplify.c (gimple_add_init_for_auto_var): Delete the 3rd argument.
Change the 3rd argument of function .DEFERRED_INIT to the name of the
decl.
(gimplify_decl_expr): Delete the 3rd argument when call
gimple_add_init_for_auto_var.
* internal-fn.c (expand_DEFERRED_INIT): Update comments to reflect
the 3rd argument change of function .DEFERRED_INIT.
* tree-cfg.c (verify_gimple_call): Update comments and verification
to reflect the 3rd argument change of function .DEFERRED_INIT.
* tree-sra.c (generate_subtree_deferred_init): Delete the 3rd argument.
(sra_modify_deferred_init): Change the 3rd argument of function
.DEFERRED_INIT to the name of the decl.

gcc/testsuite/ChangeLog:

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

* c-c++-common/auto-init-1.c: Adjust testcase to reflect the 3rd
argument change of function .DEFERRED_INIT.
* c-c++-common/auto-init-10.c: Likewise.
* c-c++-common/auto-init-11.c: Likewise.
* c-c++-common/auto-init-12.c: Likewise.
* c-c++-common/auto-init-13.c: Likewise.
* c-c++-common/auto-init-14.c: Likewise.
* c-c++-common/auto-init-15.c: Likewise.
* c-c++-common/auto-init-16.c: Likewise.
* c-c++-common/auto-init-2.c: Likewise.
* c-c++-common/auto-init-3.c: Likewise.
* c-c++-common/auto-init-4.c: Likewise.
* c-c++-common/auto-init-5.c: Likewise.
* c-c++-common/auto-init-6.c: Likewise.
* c-c++-common/auto-init-7.c: Likewise.
* c-c++-common/auto-init-8.c: Likewise.
* c-c++-common/auto-init-9.c: Likewise.
* c-c++-common/auto-init-esra.c: Likewise.
* c-c++-common/auto-init-padding-1.c: Likewise.
* gcc.target/aarch64/auto-init-2.c: Likewise.
23 files changed:
gcc/gimplify.c
gcc/internal-fn.c
gcc/testsuite/c-c++-common/auto-init-1.c
gcc/testsuite/c-c++-common/auto-init-10.c
gcc/testsuite/c-c++-common/auto-init-11.c
gcc/testsuite/c-c++-common/auto-init-12.c
gcc/testsuite/c-c++-common/auto-init-13.c
gcc/testsuite/c-c++-common/auto-init-14.c
gcc/testsuite/c-c++-common/auto-init-15.c
gcc/testsuite/c-c++-common/auto-init-16.c
gcc/testsuite/c-c++-common/auto-init-2.c
gcc/testsuite/c-c++-common/auto-init-3.c
gcc/testsuite/c-c++-common/auto-init-4.c
gcc/testsuite/c-c++-common/auto-init-5.c
gcc/testsuite/c-c++-common/auto-init-6.c
gcc/testsuite/c-c++-common/auto-init-7.c
gcc/testsuite/c-c++-common/auto-init-8.c
gcc/testsuite/c-c++-common/auto-init-9.c
gcc/testsuite/c-c++-common/auto-init-esra.c
gcc/testsuite/c-c++-common/auto-init-padding-1.c
gcc/testsuite/gcc.target/aarch64/auto-init-2.c
gcc/tree-cfg.c
gcc/tree-sra.c