Thank you. I will commit this patch the beginning of next week. Jakub, let me know if you have any objection on this.
Qing > On Oct 29, 2021, at 2:21 AM, Richard Biener <rguent...@suse.de> wrote: > > On Thu, 28 Oct 2021, Qing Zhao wrote: > >> Ping…. >> >> Hi, >> >> Based on the previous discussion, I thought that we have agreed that the >> proposed patch for this current bug is the correct fix. >> And This bug is an important bug that need to be fixed. >> >> I have created another new PR for the other potential issue with padding >> initialization for long double/_Complex long double variables with explicit >> initializer https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102781, and will be >> fixed separately later if needed. >> >> Please take a look of the new patch and let me know whether there is any >> more issue with this version? Or it’s okay for commit now? > > I think it's reasonable. > > Thus OK unless Jakub has comments. > > Thanks, > Richard. > >> Thanks. >> >> Qing >> >> >> >>> On Oct 25, 2021, at 9:16 AM, Qing Zhao via Gcc-patches >>> <gcc-patches@gcc.gnu.org> wrote: >>> >>> Ping…. >>> >>> Is this Okay for trunk? >>> >>>> On Oct 18, 2021, at 2:26 PM, Qing Zhao via Gcc-patches >>>> <gcc-patches@gcc.gnu.org> wrote: >>>> >>>> Hi, Jakub, >>>> >>>> This is the 2nd version of the patch based on your comment. >>>> >>>> Bootstrapped on both x86 and aarch64. Regression testings are ongoing. >>> >>> The regression testing looks good. >>> >>> Thanks. >>> >>> Qing >>>> >>>> Please let me know if this is ready for committing? >>>> >>>> Thanks a lot. >>>> >>>> Qing. >>>> >>>> ====================== >>>> >>>> From d6f60370dee69b5deb3d7ef51873a5e986490782 Mon Sep 17 00:00:00 2001 >>>> From: Qing Zhao <qing.z...@oracle.com> >>>> Date: Mon, 18 Oct 2021 19:04:39 +0000 >>>> Subject: [PATCH] PR 102281 (-ftrivial-auto-var-init=zero causes ice) >>>> >>>> Do not add call to __builtin_clear_padding when a variable is a gimple >>>> register or it might not have padding. >>>> >>>> gcc/ChangeLog: >>>> >>>> 2021-10-18 qing zhao <qing.z...@oracle.com> >>>> >>>> * gimplify.c (gimplify_decl_expr): Do not add call to >>>> __builtin_clear_padding when a variable is a gimple register >>>> or it might not have padding. >>>> (gimplify_init_constructor): Likewise. >>>> >>>> gcc/testsuite/ChangeLog: >>>> >>>> 2021-10-18 qing zhao <qing.z...@oracle.com> >>>> >>>> * c-c++-common/pr102281.c: New test. >>>> * gcc.target/i386/auto-init-2.c: Adjust testing case. >>>> * gcc.target/i386/auto-init-4.c: Likewise. >>>> * gcc.target/i386/auto-init-6.c: Likewise. >>>> * gcc.target/aarch64/auto-init-6.c: Likewise. >>>> --- >>>> gcc/gimplify.c | 25 ++++++++++++++----- >>>> gcc/testsuite/c-c++-common/pr102281.c | 17 +++++++++++++ >>>> .../gcc.target/aarch64/auto-init-6.c | 4 +-- >>>> gcc/testsuite/gcc.target/i386/auto-init-2.c | 2 +- >>>> gcc/testsuite/gcc.target/i386/auto-init-4.c | 10 +++----- >>>> gcc/testsuite/gcc.target/i386/auto-init-6.c | 7 +++--- >>>> 6 files changed, 47 insertions(+), 18 deletions(-) >>>> create mode 100644 gcc/testsuite/c-c++-common/pr102281.c >>>> >>>> diff --git a/gcc/gimplify.c b/gcc/gimplify.c >>>> index d8e4b139349..b27dc0ed308 100644 >>>> --- a/gcc/gimplify.c >>>> +++ b/gcc/gimplify.c >>>> @@ -1784,8 +1784,8 @@ gimple_add_init_for_auto_var (tree decl, >>>> that padding is initialized to zero. So, we always initialize paddings >>>> to zeroes regardless INIT_TYPE. >>>> To do the padding initialization, we insert a call to >>>> - __BUILTIN_CLEAR_PADDING (&decl, 0, for_auto_init = true). >>>> - Note, we add an additional dummy argument for __BUILTIN_CLEAR_PADDING, >>>> + __builtin_clear_padding (&decl, 0, for_auto_init = true). >>>> + Note, we add an additional dummy argument for __builtin_clear_padding, >>>> 'for_auto_init' to distinguish whether this call is for automatic >>>> variable initialization or not. >>>> */ >>>> @@ -1954,8 +1954,14 @@ gimplify_decl_expr (tree *stmt_p, gimple_seq *seq_p) >>>> pattern initialization. >>>> In order to make the paddings as zeroes for pattern init, We >>>> should add a call to __builtin_clear_padding to clear the >>>> - paddings to zero in compatiple with CLANG. */ >>>> - if (flag_auto_var_init == AUTO_INIT_PATTERN) >>>> + paddings to zero in compatiple with CLANG. >>>> + We cannot insert this call if the variable is a gimple register >>>> + since __builtin_clear_padding will take the address of the >>>> + variable. As a result, if a long double/_Complex long double >>>> + variable will spilled into stack later, its padding is 0XFE. */ >>>> + if (flag_auto_var_init == AUTO_INIT_PATTERN >>>> + && !is_gimple_reg (decl) >>>> + && clear_padding_type_may_have_padding_p (TREE_TYPE (decl))) >>>> gimple_add_padding_init_for_auto_var (decl, is_vla, seq_p); >>>> } >>>> } >>>> @@ -5384,12 +5390,19 @@ gimplify_init_constructor (tree *expr_p, >>>> gimple_seq *pre_p, gimple_seq *post_p, >>>> >>>> /* If the user requests to initialize automatic variables, we >>>> should initialize paddings inside the variable. Add a call to >>>> - __BUILTIN_CLEAR_PADDING (&object, 0, for_auto_init = true) to >>>> + __builtin_clear_pading (&object, 0, for_auto_init = true) to >>>> initialize paddings of object always to zero regardless of >>>> INIT_TYPE. Note, we will not insert this call if the aggregate >>>> variable has be completely cleared already or it's initialized >>>> - with an empty constructor. */ >>>> + with an empty constructor. We cannot insert this call if the >>>> + variable is a gimple register since __builtin_clear_padding will take >>>> + the address of the variable. As a result, if a long double/_Complex >>>> long >>>> + double variable will be spilled into stack later, its padding cannot >>>> + be cleared with __builtin_clear_padding. We should clear its padding >>>> + when it is spilled into memory. */ >>>> if (is_init_expr >>>> + && !is_gimple_reg (object) >>>> + && clear_padding_type_may_have_padding_p (type) >>>> && ((AGGREGATE_TYPE_P (type) && !cleared && !is_empty_ctor) >>>> || !AGGREGATE_TYPE_P (type)) >>>> && is_var_need_auto_init (object)) >>>> diff --git a/gcc/testsuite/c-c++-common/pr102281.c >>>> b/gcc/testsuite/c-c++-common/pr102281.c >>>> new file mode 100644 >>>> index 00000000000..a961451b5a7 >>>> --- /dev/null >>>> +++ b/gcc/testsuite/c-c++-common/pr102281.c >>>> @@ -0,0 +1,17 @@ >>>> +/* PR102281 */ >>>> +/* { dg-do compile } */ >>>> +/* { dg-options "-ftrivial-auto-var-init=zero -Wno-psabi" } */ >>>> +long long var1; >>>> +float var2; >>>> +typedef long long V __attribute__((__vector_size__(2 * sizeof(long >>>> long)))); >>>> +typedef float W __attribute__((__vector_size__(4 * sizeof(float)))); >>>> + >>>> +V foo (void) >>>> +{ >>>> + return (V) {var1}; >>>> +} >>>> + >>>> +W bar (void) >>>> +{ >>>> + return (W) {var2}; >>>> +} >>>> diff --git a/gcc/testsuite/gcc.target/aarch64/auto-init-6.c >>>> b/gcc/testsuite/gcc.target/aarch64/auto-init-6.c >>>> index 27c16b33678..0456c66f496 100644 >>>> --- a/gcc/testsuite/gcc.target/aarch64/auto-init-6.c >>>> +++ b/gcc/testsuite/gcc.target/aarch64/auto-init-6.c >>>> @@ -1,6 +1,6 @@ >>>> /* Verify pattern initialization for complex type automatic variables. */ >>>> /* { dg-do compile } */ >>>> -/* { dg-options "-ftrivial-auto-var-init=pattern -fdump-rtl-expand" } */ >>>> +/* { dg-options "-ftrivial-auto-var-init=pattern" } */ >>>> >>>> >>>> _Complex long double result; >>>> @@ -15,4 +15,4 @@ _Complex long double foo() >>>> return result; >>>> } >>>> >>>> -/* { dg-final { scan-rtl-dump-times "0xfffffffffffffffe\\\]\\\) repeated >>>> x16" 3 "expand" } } */ >>>> +/* { dg-final { scan-assembler-times "word\t-16843010" 14 } } */ >>>> diff --git a/gcc/testsuite/gcc.target/i386/auto-init-2.c >>>> b/gcc/testsuite/gcc.target/i386/auto-init-2.c >>>> index e22930ae89b..0c59c62dacf 100644 >>>> --- a/gcc/testsuite/gcc.target/i386/auto-init-2.c >>>> +++ b/gcc/testsuite/gcc.target/i386/auto-init-2.c >>>> @@ -29,7 +29,7 @@ void foo() >>>> return; >>>> } >>>> >>>> -/* { dg-final { scan-rtl-dump-times "0xfffffffffffffffe" 2 "expand" } } */ >>>> +/* { dg-final { scan-rtl-dump-times "0xfffffffffffffffe" 1 "expand" } } */ >>>> /* { dg-final { scan-rtl-dump-times "0xfffffffffffffefe" 1 "expand" } } */ >>>> /* { dg-final { scan-rtl-dump-times "0xfffffffffefefefe" 2 "expand" { >>>> target lp64 } } } */ >>>> /* { dg-final { scan-rtl-dump-times "0xfefefefefefefefe" 3 "expand" { >>>> target lp64 } } } */ >>>> diff --git a/gcc/testsuite/gcc.target/i386/auto-init-4.c >>>> b/gcc/testsuite/gcc.target/i386/auto-init-4.c >>>> index 7b46c74a073..1803dd45842 100644 >>>> --- a/gcc/testsuite/gcc.target/i386/auto-init-4.c >>>> +++ b/gcc/testsuite/gcc.target/i386/auto-init-4.c >>>> @@ -1,6 +1,6 @@ >>>> /* Verify pattern initialization for floating point type automatic >>>> variables. */ >>>> /* { dg-do compile } */ >>>> -/* { dg-options "-ftrivial-auto-var-init=pattern -fdump-rtl-expand >>>> -march=x86-64 -mtune=generic -msse" } */ >>>> +/* { dg-options "-ftrivial-auto-var-init=pattern -march=x86-64 >>>> -mtune=generic -msse" } */ >>>> >>>> long double result; >>>> >>>> @@ -14,8 +14,6 @@ long double foo() >>>> return result; >>>> } >>>> >>>> -/* { dg-final { scan-rtl-dump-times "0xfffffffffefefefe" 1 "expand" { >>>> target { ! ia32 } } } } */ >>>> -/* { dg-final { scan-rtl-dump-times "\\\[0xfefefefefefefefe\\\]" 1 >>>> "expand" { target { ! ia32 } } } } */ >>>> -/* { dg-final { scan-rtl-dump-times "0xfffffffffffffffe\\\]\\\) repeated >>>> x16" 1 "expand" { target { ! ia32 } } } } */ >>>> -/* { dg-final { scan-rtl-dump-times "0xfffffffffefefefe" 2 "expand" { >>>> target ia32 } } } */ >>>> -/* { dg-final { scan-rtl-dump-times "\\\[0xfefefefefefefefe\\\]" 2 >>>> "expand" { target ia32 } } } */ >>>> + >>>> +/* { dg-final { scan-assembler-times "long\t-16843010" 5 { target { ! >>>> ia32 } } } } */ >>>> +/* { dg-final { scan-assembler-times "long\t-16843010" 3 { target { ia32 >>>> } } } } */ >>>> diff --git a/gcc/testsuite/gcc.target/i386/auto-init-6.c >>>> b/gcc/testsuite/gcc.target/i386/auto-init-6.c >>>> index f75081edce4..339f8bc2966 100644 >>>> --- a/gcc/testsuite/gcc.target/i386/auto-init-6.c >>>> +++ b/gcc/testsuite/gcc.target/i386/auto-init-6.c >>>> @@ -1,6 +1,6 @@ >>>> /* Verify pattern initialization for complex type automatic variables. */ >>>> /* { dg-do compile } */ >>>> -/* { dg-options "-ftrivial-auto-var-init=pattern -fdump-rtl-expand >>>> -march=x86-64 -mtune=generic -msse" } */ >>>> +/* { dg-options "-ftrivial-auto-var-init=pattern -march=x86-64 >>>> -mtune=generic -msse" } */ >>>> >>>> >>>> _Complex long double result; >>>> @@ -15,5 +15,6 @@ _Complex long double foo() >>>> return result; >>>> } >>>> >>>> -/* { dg-final { scan-rtl-dump-times "\\\[0xfefefefefefefefe\\\]" 1 >>>> "expand" } } */ >>>> -/* { dg-final { scan-rtl-dump-times "0xfffffffffffffffe\\\]\\\) repeated >>>> x16" 2 "expand" } } */ >>>> +/* { dg-final { scan-assembler-times "long\t-16843010" 10 { target { ! >>>> ia32 } } } } */ >>>> +/* { dg-final { scan-assembler-times "long\t-16843010" 6 { target { ia32 >>>> } } } } */ >>>> + >>>> -- >>>> 2.27.0 >>>> >>>> >>> >> >> > > -- > Richard Biener <rguent...@suse.de> > SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, > Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)