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 > >