FYI.

Just committed this patch to gcc12 as:

https://gcc.gnu.org/pipermail/gcc-cvs/2022-January/359118.html

Qing
> On Jan 11, 2022, at 9:38 AM, Qing Zhao via Gcc-patches 
> <gcc-patches@gcc.gnu.org> wrote:
> 
> 
> 
>> On Jan 11, 2022, at 7:53 AM, Richard Biener <richard.guent...@gmail.com> 
>> wrote:
>> 
>> On Tue, Jan 11, 2022 at 12:58 AM Qing Zhao <qing.z...@oracle.com> wrote:
>>> 
>>> Hi, Richard,
>>> 
>>> I splited the previous patch for “Enable -Wuninitialized + 
>>> -ftrivial-auto-var-init for address taken variables” into two separate 
>>> patches.
>>> This is the first one
>>> 
>>> This first  patch  is to fix (or work around ) PR103720, therefore it’s an 
>>> important change, and need to be go into GCC12.
>>> At the same time, this patch is the preparation for the second patch that 
>>> will actually enable -Wuninitialized + -ftrivial-auto-var-init for address 
>>> taken variables.
>>> 
>>> The reason I separate the previous patch into two is: most of the previous 
>>> concern was on the second part of the patch (the change in 
>>> tree-ssa-uninit.c), I don’t
>>> want those concern prevent this first patch from being approved into GCC12.
>>> 
>>> 
>>> In this part, I addressed your comments in  gimplify.c :
>>> 
>>> =====
>>> tree decl_name
>>> +    = build_string_literal (IDENTIFIER_LENGTH (DECL_NAME (decl)) + 1,
>>> +                           IDENTIFIER_POINTER (DECL_NAME (decl)));
>>> 
>>> you need to deal with DECL_NAME being NULL.
>>> =====
>>> 
>>> Please also see the detailed description below for the problem and solution 
>>> of this patch.
>>> 
>>> This first patch has been bootstrapped and regressing tested on both X86 
>>> and aarch64.
>>> 
>>> Okay for GCC12?
>> 
>> +
>> +  char *decl_name_anonymous = xasprintf ("D.%u", DECL_UID (decl));
>> +  const char *decl_name_str = DECL_NAME (decl)
>> +                             ? IDENTIFIER_POINTER (DECL_NAME (decl))
>> +                             : decl_name_anonymous;
>> +  tree decl_name
>> +    = build_string_literal (strlen (decl_name_str) + 1,
>> +                           decl_name_str);
>> 
>> please avoid the xasprintf in the case DECL_NAME is not NULL, I'd be happy
>> with sth like
>> 
>>  tree decl_name;
>>  if (DECL_NAME (decl))
>>     decl_name = build_string_literal (...);
>>  else
>>     {
>>        char *decl_name_anon = xasprintf (...);
>>        decl_name = build_string_literal (...);
>>        free (decl_name_anon);
>>     }
>> 
>> otherwise the patch is OK to commit (just do the above change and
>> re-test / push).
> 
> Thanks for the comment, will fix this and commit the patch.
> 
> Qing
>> 
>> Thanks,
>> Richard.
>> 
>>> Thanks.
>>> 
>>> Qing.
>>> 
>>> 
>>> =================================
>>> 
>>> 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-10  qing zhao  <qing.z...@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-10  qing zhao  <qing.z...@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.
>>> 
>>> ******The complete patch is attached:

Reply via email to