Hi,

I'd like to ping this patch on behalf of Artem.

Alexander

On Sun, 17 Apr 2022, Artem Klimov wrote:

> Fix issue PR99619, which asks to optimize TLS access based on
> visibility. The fix is implemented as an IPA optimization, which allows
> to take optimized visibility status into account (as well as avoid
> modifying all language frontends).
> 
> 2022-04-17  Artem Klimov  <jakmob...@gmail.com>
> 
> gcc/ChangeLog:
>       PR middle-end/99619
>       * ipa-visibility.cc (function_and_variable_visibility): Add an
>       explicit TLS model update after visibility optimisation loops.
> 
> gcc/testsuite/ChangeLog:
>       PR middle-end/99619
>       * gcc.dg/tls/vis-attr-gd.c: New test.
>       * gcc.dg/tls/vis-attr-hidden-gd.c: New test.
>       * gcc.dg/tls/vis-attr-hidden.c: New test.
>       * gcc.dg/tls/vis-flag-hidden-gd.c: New test.
>       * gcc.dg/tls/vis-flag-hidden.c: New test.
>       * gcc.dg/tls/vis-pragma-hidden-gd.c: New test.
>       * gcc.dg/tls/vis-pragma-hidden.c: New test.
> 
> Co-Authored-By:  Alexander Monakov  <amona...@gcc.gnu.org>
> Signed-off-by: Artem Klimov <jakmob...@gmail.com>
> ---
>  gcc/ipa-visibility.cc                           | 16 ++++++++++++++++
>  gcc/testsuite/gcc.dg/tls/vis-attr-gd.c          | 10 ++++++++++
>  gcc/testsuite/gcc.dg/tls/vis-attr-hidden-gd.c   | 11 +++++++++++
>  gcc/testsuite/gcc.dg/tls/vis-attr-hidden.c      | 10 ++++++++++
>  gcc/testsuite/gcc.dg/tls/vis-flag-hidden-gd.c   | 11 +++++++++++
>  gcc/testsuite/gcc.dg/tls/vis-flag-hidden.c      | 10 ++++++++++
>  gcc/testsuite/gcc.dg/tls/vis-pragma-hidden-gd.c | 15 +++++++++++++++
>  gcc/testsuite/gcc.dg/tls/vis-pragma-hidden.c    | 14 ++++++++++++++
>  8 files changed, 97 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.dg/tls/vis-attr-gd.c
>  create mode 100644 gcc/testsuite/gcc.dg/tls/vis-attr-hidden-gd.c
>  create mode 100644 gcc/testsuite/gcc.dg/tls/vis-attr-hidden.c
>  create mode 100644 gcc/testsuite/gcc.dg/tls/vis-flag-hidden-gd.c
>  create mode 100644 gcc/testsuite/gcc.dg/tls/vis-flag-hidden.c
>  create mode 100644 gcc/testsuite/gcc.dg/tls/vis-pragma-hidden-gd.c
>  create mode 100644 gcc/testsuite/gcc.dg/tls/vis-pragma-hidden.c
> 
> diff --git a/gcc/ipa-visibility.cc b/gcc/ipa-visibility.cc
> index e95a0dd252f..ca5b9a95f5e 100644
> --- a/gcc/ipa-visibility.cc
> +++ b/gcc/ipa-visibility.cc
> @@ -872,6 +872,22 @@ function_and_variable_visibility (bool whole_program)
>           }
>       }
>      }
> +  FOR_EACH_VARIABLE (vnode)
> +    {
> +      tree decl = vnode->decl;
> +      
> +      /* Optimize TLS model based on visibility (taking into account
> +         optimizations done in the preceding loop), unless it was
> +         specified explicitly.  */
> +      
> +      if (DECL_THREAD_LOCAL_P (decl)
> +          && !lookup_attribute ("tls_model", DECL_ATTRIBUTES (decl)))
> +        {
> +          enum tls_model new_model = decl_default_tls_model (decl);
> +          gcc_checking_assert (new_model >= decl_tls_model (decl));
> +          set_decl_tls_model (decl, new_model);
> +        }
> +    }
>  
>    if (dump_file)
>      {
> diff --git a/gcc/testsuite/gcc.dg/tls/vis-attr-gd.c 
> b/gcc/testsuite/gcc.dg/tls/vis-attr-gd.c
> new file mode 100644
> index 00000000000..473c7846f74
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tls/vis-attr-gd.c
> @@ -0,0 +1,10 @@
> +/* { dg-do compile } */
> +/* { dg-require-effective-target fpic } */
> +/* { dg-require-effective-target tls } */
> +/* { dg-options "-O2 -fPIC -fdump-ipa-visibility" } */
> +
> +// tls_model should be global-dynamic due to explicitly specified attribute
> +__attribute__((tls_model("global-dynamic")))
> +__thread int x;
> +
> +/* { dg-final { scan-ipa-dump "Varpool flags: tls-global-dynamic" 
> "visibility" } } */
> diff --git a/gcc/testsuite/gcc.dg/tls/vis-attr-hidden-gd.c 
> b/gcc/testsuite/gcc.dg/tls/vis-attr-hidden-gd.c
> new file mode 100644
> index 00000000000..8f592052361
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tls/vis-attr-hidden-gd.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-require-effective-target fpic } */
> +/* { dg-require-effective-target tls } */
> +/* { dg-options "-O2 -fPIC -fdump-ipa-visibility" } */
> +
> +// tls_model should be global-dynamic due to explicitly specified attribute
> +__attribute__((visibility("hidden")))
> +__attribute__((tls_model("global-dynamic")))
> +__thread int x;
> +
> +/* { dg-final { scan-ipa-dump "Varpool flags: tls-global-dynamic" 
> "visibility" } } */
> diff --git a/gcc/testsuite/gcc.dg/tls/vis-attr-hidden.c 
> b/gcc/testsuite/gcc.dg/tls/vis-attr-hidden.c
> new file mode 100644
> index 00000000000..2da1bc3fa42
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tls/vis-attr-hidden.c
> @@ -0,0 +1,10 @@
> +/* { dg-do compile } */
> +/* { dg-require-effective-target fpic } */
> +/* { dg-require-effective-target tls } */
> +/* { dg-options "-O2 -fPIC -fdump-ipa-visibility" } */
> +
> +//tls_model should be local-dynamic due to visibility("hidden")
> +__attribute__((visibility("hidden")))
> +__thread int x;
> +
> +/* { dg-final { scan-ipa-dump "Varpool flags: tls-local-dynamic" 
> "visibility" } } */
> diff --git a/gcc/testsuite/gcc.dg/tls/vis-flag-hidden-gd.c 
> b/gcc/testsuite/gcc.dg/tls/vis-flag-hidden-gd.c
> new file mode 100644
> index 00000000000..de01ef31776
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tls/vis-flag-hidden-gd.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-require-effective-target fpic } */
> +/* { dg-require-effective-target tls } */
> +/* { dg-options "-O2 -fPIC -fdump-ipa-visibility -fvisibility=hidden" } */
> +
> +
> +// tls_model should be global-dynamic due to explicitly specified attribute
> +__attribute__((tls_model("global-dynamic")))
> +__thread int x;
> +
> +/* { dg-final { scan-ipa-dump "Varpool flags: tls-global-dynamic" 
> "visibility" } } */
> diff --git a/gcc/testsuite/gcc.dg/tls/vis-flag-hidden.c 
> b/gcc/testsuite/gcc.dg/tls/vis-flag-hidden.c
> new file mode 100644
> index 00000000000..3701eaafd62
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tls/vis-flag-hidden.c
> @@ -0,0 +1,10 @@
> +/* { dg-do compile } */
> +/* { dg-require-effective-target fpic } */
> +/* { dg-require-effective-target tls } */
> +/* { dg-options "-O2 -fPIC -fdump-ipa-visibility -fvisibility=hidden" } */
> +
> +
> +// tls_model should be local-dynamic due to -fvisibility=hidden
> +__thread int x;
> +
> +/* { dg-final { scan-ipa-dump "Varpool flags: tls-local-dynamic" 
> "visibility" } } */
> diff --git a/gcc/testsuite/gcc.dg/tls/vis-pragma-hidden-gd.c 
> b/gcc/testsuite/gcc.dg/tls/vis-pragma-hidden-gd.c
> new file mode 100644
> index 00000000000..39cc4bed17d
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tls/vis-pragma-hidden-gd.c
> @@ -0,0 +1,15 @@
> +/* { dg-do compile } */
> +/* { dg-require-effective-target fpic } */
> +/* { dg-require-effective-target tls } */
> +/* { dg-options "-O2 -fPIC -fdump-ipa-visibility" } */
> +
> +
> +#pragma GCC visibility push(hidden)
> +
> +// tls_model should be global-dynamic due to explicitly specified attribute
> +__attribute__((tls_model("global-dynamic")))
> +__thread int x;
> +
> +#pragma GCC visibility pop
> +
> +/* { dg-final { scan-ipa-dump "Varpool flags: tls-global-dynamic" 
> "visibility" } } */
> diff --git a/gcc/testsuite/gcc.dg/tls/vis-pragma-hidden.c 
> b/gcc/testsuite/gcc.dg/tls/vis-pragma-hidden.c
> new file mode 100644
> index 00000000000..1d6b9b144b5
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tls/vis-pragma-hidden.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile } */
> +/* { dg-require-effective-target fpic } */
> +/* { dg-require-effective-target tls } */
> +/* { dg-options "-O2 -fPIC -fdump-ipa-visibility" } */
> +
> +
> +#pragma GCC visibility push(hidden)
> +
> +// tls_model should be local-dynamic due to a pragma
> +__thread int x;
> +
> +#pragma GCC visibility pop
> +
> +/* { dg-final { scan-ipa-dump "Varpool flags: tls-local-dynamic" 
> "visibility" } } */
> 

Reply via email to