public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Thomas Schwinge <thomas@codesourcery.com>
To: Tom de Vries <tdevries@suse.de>
Cc: <gcc-patches@gcc.gnu.org>
Subject: Re: [committed][nvptx] Use .alias directive for mptx >= 6.3
Date: Fri, 2 Dec 2022 12:24:58 +0100	[thread overview]
Message-ID: <87iliurqt1.fsf@euler.schwinge.homeip.net> (raw)
In-Reply-To: <20220322134144.GA32400@delia.home>

[-- Attachment #1: Type: text/plain, Size: 15507 bytes --]

Hi Tom!

(My following analysis and WIP patch is from a few months ago, but I
thought I'd send it now, in case you've got any comments, and to avoid
potential duplicate work.)


On 2022-03-22T14:41:46+0100, Tom de Vries via Gcc-patches <gcc-patches@gcc.gnu.org> wrote:
> Starting with ptx isa version 6.3, a ptx directive .alias is available.
> Use this directive to support symbol aliases, as far as possible.
>
> The alias support is off by default.  It can be turned on using a switch
> -malias.
>
> Furthermore, for pre-sm_75, it's not effective unless the ptx version is
> bumped to 6.3 or higher using -mptx (given that the default for pre-sm_75 is
> 6.0).
>
> The alias support has the following limitations.
> [...]

> This patch causes a regression:
> ...
> -PASS: gcc.dg/pr60797.c  (test for errors, line 4)
> +FAIL: gcc.dg/pr60797.c  (test for errors, line 4)
> ...
> The test-case is skipped for effective target alias, and both without and with
> this patch the nvptx target is considered to not support it, so the test-case is
> executed.  The test-case expects an error message along the lines of "alias
> definitions not supported in this configuration", but instead we run into:
> ...
> gcc.dg/pr60797.c:4:12: error: foo aliased to undefined symbol
> ...
> This is probably due to the fact that the nvptx backend now defines macros
> ASM_OUTPUT_DEF and ASM_OUTPUT_DEF_FROM_DECLS, so from the point of view of the
> common part of the compiler, aliases are supported.

Testing this with the new '-malias' flag not active (default), I'm seeing
a number of more regressions:

    [...]: error: alias definitions not supported in this configuration

    [-PASS:-]{+FAIL:+} gcc.dg/pr56727-1.c (test for excess errors)

    PASS: gcc.dg/pr84739.c  (test for warnings, line 6)
    PASS: gcc.dg/pr84739.c  (test for warnings, line 21)
    [-PASS:-]{+FAIL:+} gcc.dg/pr84739.c (test for excess errors)

    [-PASS:-]{+FAIL:+} gcc.dg/ipa/pr81520.c (test for excess errors)

..., and then, in particular, a ton of regressions in GCC/C++ testing
('check-gcc-c++') due to approximately 40000 new
"error: alias definitions not supported in this configuration"
diagnostics.  Whoops...  (I suppose you've not tested that at all?)

If the new '-malias' flag is not active, we have to maintain (restore)
the previous state of other macros, as I'm demonstrating in the attached
"[WIP] nvptx 'TARGET_USE_LOCAL_THUNK_ALIAS_P', 'TARGET_SUPPORTS_ALIASES'".
This completely addresses in particular the 'check-gcc-c++' regressions,
and does not cause any changes if the new '-malias' flag in fact is
active (as when testing with '-mptx=6.3 -malias', for example).

However, this further regresses the 'gcc.dg/pr56727-1.c' and
'gcc.dg/ipa/pr81520.c' test cases mentioned above:

    during IPA pass: whole-program
    [...]: internal compiler error: in function_and_variable_visibility, at ipa-visibility.cc:647

    {+FAIL: gcc.dg/pr56727-1.c (internal compiler error: in function_and_variable_visibility, at ipa-visibility.cc:647)+}
    FAIL: gcc.dg/pr56727-1.c (test for excess errors)

    {+FAIL: gcc.dg/ipa/pr81520.c (internal compiler error: in function_and_variable_visibility, at ipa-visibility.cc:647)+}
    FAIL: gcc.dg/ipa/pr81520.c (test for excess errors)

Such ICEs we're not yet currently seeing elsewhere; this remains to be
analyzed -- after all, these test cases PASSed originally.

And, obviously, the patch needs some "copy editing".


Grüße
 Thomas


> [nvptx] Use .alias directive for mptx >= 6.3
>
> gcc/ChangeLog:
>
> 2022-03-18  Tom de Vries  <tdevries@suse.de>
>
>       PR target/104957
>       * config/nvptx/nvptx-protos.h (nvptx_asm_output_def_from_decls): Declare.
>       * config/nvptx/nvptx.cc (write_fn_proto_1): Don't add function marker
>       for alias.
>       (SET_ASM_OP, NVPTX_ASM_OUTPUT_DEF): New macro def.
>       (nvptx_asm_output_def_from_decls): New function.
>       * config/nvptx/nvptx.h (ASM_OUTPUT_DEF): New macro def, define to
>       gcc_unreachable ().
>       (ASM_OUTPUT_DEF_FROM_DECLS): New macro def, define to
>       nvptx_asm_output_def_from_decls.
>       * config/nvptx/nvptx.opt (malias): New opt.
>
> gcc/testsuite/ChangeLog:
>
> 2022-03-18  Tom de Vries  <tdevries@suse.de>
>
>       PR target/104957
>       * gcc.target/nvptx/alias-1.c: New test.
>       * gcc.target/nvptx/alias-2.c: New test.
>       * gcc.target/nvptx/alias-3.c: New test.
>       * gcc.target/nvptx/alias-4.c: New test.
>       * gcc.target/nvptx/nvptx.exp
>       (check_effective_target_runtime_ptx_isa_version_6_3): New proc.
>
> ---
>  gcc/config/nvptx/nvptx-protos.h          |  1 +
>  gcc/config/nvptx/nvptx.cc                | 74 +++++++++++++++++++++++++++++++-
>  gcc/config/nvptx/nvptx.h                 | 17 ++++++++
>  gcc/config/nvptx/nvptx.opt               |  3 ++
>  gcc/testsuite/gcc.target/nvptx/alias-1.c | 27 ++++++++++++
>  gcc/testsuite/gcc.target/nvptx/alias-2.c | 13 ++++++
>  gcc/testsuite/gcc.target/nvptx/alias-3.c | 29 +++++++++++++
>  gcc/testsuite/gcc.target/nvptx/alias-4.c | 12 ++++++
>  gcc/testsuite/gcc.target/nvptx/nvptx.exp |  7 +++
>  9 files changed, 182 insertions(+), 1 deletion(-)
>
> diff --git a/gcc/config/nvptx/nvptx-protos.h b/gcc/config/nvptx/nvptx-protos.h
> index 0bf9af406a2..ca0a87ee4bd 100644
> --- a/gcc/config/nvptx/nvptx-protos.h
> +++ b/gcc/config/nvptx/nvptx-protos.h
> @@ -43,6 +43,7 @@ extern void nvptx_output_ascii (FILE *, const char *, unsigned HOST_WIDE_INT);
>  extern void nvptx_cpu_cpp_builtins (void);
>  extern void nvptx_register_pragmas (void);
>  extern unsigned int nvptx_data_alignment (const_tree, unsigned int);
> +extern void nvptx_asm_output_def_from_decls (FILE *, tree, tree);
>
>  #ifdef RTX_CODE
>  extern void nvptx_expand_oacc_fork (unsigned);
> diff --git a/gcc/config/nvptx/nvptx.cc b/gcc/config/nvptx/nvptx.cc
> index f83f98c3ab5..b2f7b4af392 100644
> --- a/gcc/config/nvptx/nvptx.cc
> +++ b/gcc/config/nvptx/nvptx.cc
> @@ -77,6 +77,7 @@
>  #include "opts.h"
>  #include "tree-pretty-print.h"
>  #include "rtl-iter.h"
> +#include "cgraph.h"
>
>  /* This file should be included last.  */
>  #include "target-def.h"
> @@ -968,7 +969,8 @@ static void
>  write_fn_proto_1 (std::stringstream &s, bool is_defn,
>                 const char *name, const_tree decl)
>  {
> -  write_fn_marker (s, is_defn, TREE_PUBLIC (decl), name);
> +  if (lookup_attribute ("alias", DECL_ATTRIBUTES (decl)) == NULL)
> +    write_fn_marker (s, is_defn, TREE_PUBLIC (decl), name);
>
>    /* PTX declaration.  */
>    if (DECL_EXTERNAL (decl))
> @@ -7393,6 +7395,76 @@ nvptx_mem_local_p (rtx mem)
>    return false;
>  }
>
> +/* Define locally, for use in NVPTX_ASM_OUTPUT_DEF.  */
> +#define SET_ASM_OP ".alias "
> +
> +/* Define locally, for use in nvptx_asm_output_def_from_decls.  Add NVPTX_
> +   prefix to avoid clash with ASM_OUTPUT_DEF from nvptx.h.
> +   Copy of ASM_OUTPUT_DEF from defaults.h, with added terminating
> +   semicolon.  */
> +#define NVPTX_ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2)     \
> +  do                                                 \
> +    {                                                        \
> +      fprintf ((FILE), "%s", SET_ASM_OP);            \
> +      assemble_name (FILE, LABEL1);                  \
> +      fprintf (FILE, ",");                           \
> +      assemble_name (FILE, LABEL2);                  \
> +      fprintf (FILE, ";\n");                         \
> +    }                                                        \
> +  while (0)
> +
> +void
> +nvptx_asm_output_def_from_decls (FILE *stream, tree name, tree value)
> +{
> +  if (nvptx_alias == 0 || !TARGET_PTX_6_3)
> +    {
> +      /* Copied from assemble_alias.  */
> +      error_at (DECL_SOURCE_LOCATION (name),
> +             "alias definitions not supported in this configuration");
> +      TREE_ASM_WRITTEN (name) = 1;
> +      return;
> +    }
> +
> +  if (lookup_attribute ("weak", DECL_ATTRIBUTES (name)))
> +    {
> +      /* Prevent execution FAILs for gcc.dg/globalalias.c and
> +      gcc.dg/pr77587.c.  */
> +      error_at (DECL_SOURCE_LOCATION (name),
> +             "weak alias definitions not supported in this configuration");
> +      TREE_ASM_WRITTEN (name) = 1;
> +      return;
> +    }
> +
> +  /* Ptx also doesn't support value having weak linkage, but we can't detect
> +     that here, so we'll end up with:
> +     "error: Function test with .weak scope cannot be aliased".
> +     See gcc.dg/localalias.c.  */
> +
> +  if (TREE_CODE (name) != FUNCTION_DECL)
> +    {
> +      error_at (DECL_SOURCE_LOCATION (name),
> +             "non-function alias definitions not supported"
> +             " in this configuration");
> +      TREE_ASM_WRITTEN (name) = 1;
> +      return;
> +    }
> +
> +  if (!cgraph_node::get (name)->referred_to_p ())
> +    /* Prevent "Internal error: reference to deleted section".  */
> +    return;
> +
> +  std::stringstream s;
> +  write_fn_proto (s, false, get_fnname_from_decl (name), name);
> +  fputs (s.str ().c_str (), stream);
> +
> +  tree id = DECL_ASSEMBLER_NAME (name);
> +  NVPTX_ASM_OUTPUT_DEF (stream, IDENTIFIER_POINTER (id),
> +                     IDENTIFIER_POINTER (value));
> +}
> +
> +#undef NVPTX_ASM_OUTPUT_DEF
> +#undef SET_ASM_OP
> +
>  #undef TARGET_OPTION_OVERRIDE
>  #define TARGET_OPTION_OVERRIDE nvptx_option_override
>
> diff --git a/gcc/config/nvptx/nvptx.h b/gcc/config/nvptx/nvptx.h
> index b55ade65cc5..75ac7a666b1 100644
> --- a/gcc/config/nvptx/nvptx.h
> +++ b/gcc/config/nvptx/nvptx.h
> @@ -315,6 +315,23 @@ struct GTY(()) machine_function
>    ((VALUE) = GET_MODE_BITSIZE ((MODE)), 2)
>
>  #define SUPPORTS_WEAK 1
> +
> +/* The documentation states that ASM_OUTPUT_DEF_FROM_DECLS is used in
> +   preference to ASM_OUTPUT_DEF if the tree nodes are available.  However, we
> +   need the tree nodes to emit the prototype, so at this point it's not clear
> +   how we can support ASM_OUTPUT_DEF.  Still, we need to define it, or
> +   ASM_OUTPUT_DEF_FROM_DECLS is ignored.  For now, assert, and once we run
> +   into it possibly improve by somehow emitting the prototype elsewhere, or
> +   emitting a reasonable error message.  */
> +#define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2)   \
> +  do                                         \
> +    {                                                \
> +      gcc_unreachable ();                    \
> +    }                                                \
> +  while (0)
> +#define ASM_OUTPUT_DEF_FROM_DECLS(STREAM, NAME, VALUE)       \
> +  nvptx_asm_output_def_from_decls (STREAM, NAME, VALUE)
> +
>  #define NO_DOT_IN_LABEL
>  #define ASM_COMMENT_START "//"
>
> diff --git a/gcc/config/nvptx/nvptx.opt b/gcc/config/nvptx/nvptx.opt
> index fea99c5d406..980428b58cc 100644
> --- a/gcc/config/nvptx/nvptx.opt
> +++ b/gcc/config/nvptx/nvptx.opt
> @@ -85,3 +85,6 @@ Initialize ptx registers.
>
>  mptx-comment
>  Target Var(nvptx_comment) Init(1) Undocumented
> +
> +malias
> +Target Var(nvptx_alias) Init(0) Undocumented
> diff --git a/gcc/testsuite/gcc.target/nvptx/alias-1.c b/gcc/testsuite/gcc.target/nvptx/alias-1.c
> new file mode 100644
> index 00000000000..f68716e77dd
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/nvptx/alias-1.c
> @@ -0,0 +1,27 @@
> +/* { dg-do link } */
> +/* { dg-do run { target runtime_ptx_isa_version_6_3 } } */
> +/* { dg-options "-save-temps -malias -mptx=6.3" } */
> +
> +int v;
> +
> +void __f ()
> +{
> +  v = 1;
> +}
> +
> +void f () __attribute__ ((alias ("__f")));
> +
> +int
> +main (void)
> +{
> +  if (v != 0)
> +    __builtin_abort ();
> +  f ();
> +  if (v != 1)
> +    __builtin_abort ();
> +  return 0;
> +}
> +
> +/* { dg-final { scan-assembler-times "\\.alias f,__f;" 1 } } */
> +/* { dg-final { scan-assembler-times "\\.visible \\.func __f;" 1 } } */
> +/* { dg-final { scan-assembler-times "\\.visible \\.func f;" 1 } } */
> diff --git a/gcc/testsuite/gcc.target/nvptx/alias-2.c b/gcc/testsuite/gcc.target/nvptx/alias-2.c
> new file mode 100644
> index 00000000000..e2dc9b1f5ac
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/nvptx/alias-2.c
> @@ -0,0 +1,13 @@
> +/* { dg-do link } */
> +/* { dg-do run { target runtime_ptx_isa_version_6_3 } } */
> +/* { dg-options "-save-temps -malias -mptx=6.3 -O2" } */
> +
> +#include "alias-1.c"
> +
> +/* Inlined, so no alias.  */
> +/* { dg-final { scan-assembler-not "\\.alias.*;" } } */
> +/* { dg-final { scan-assembler-not "\\.visible \\.func f;" } } */
> +
> +/* Note static and inlined, so still there.  */
> +/* { dg-final { scan-assembler-times "\\.visible \\.func __f;" 1 } } */
> +
> diff --git a/gcc/testsuite/gcc.target/nvptx/alias-3.c b/gcc/testsuite/gcc.target/nvptx/alias-3.c
> new file mode 100644
> index 00000000000..60486e50826
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/nvptx/alias-3.c
> @@ -0,0 +1,29 @@
> +/* { dg-do link } */
> +/* { dg-do run { target runtime_ptx_isa_version_6_3 } } */
> +/* { dg-options "-save-temps -malias -mptx=6.3" } */
> +
> +/* Copy of alias-1.c, with static __f and f.  */
> +
> +int v;
> +
> +static void __f ()
> +{
> +  v = 1;
> +}
> +
> +static void f () __attribute__ ((alias ("__f")));
> +
> +int
> +main (void)
> +{
> +  if (v != 0)
> +    __builtin_abort ();
> +  f ();
> +  if (v != 1)
> +    __builtin_abort ();
> +  return 0;
> +}
> +
> +/* { dg-final { scan-assembler-times "\\.alias f,__f;" 1 } } */
> +/* { dg-final { scan-assembler-times "\\.func __f;" 1 } } */
> +/* { dg-final { scan-assembler-times "\\.func f;" 1 } } */
> diff --git a/gcc/testsuite/gcc.target/nvptx/alias-4.c b/gcc/testsuite/gcc.target/nvptx/alias-4.c
> new file mode 100644
> index 00000000000..956150a6b3f
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/nvptx/alias-4.c
> @@ -0,0 +1,12 @@
> +/* { dg-do link } */
> +/* { dg-do run { target runtime_ptx_isa_version_6_3 } } */
> +/* { dg-options "-save-temps -malias -mptx=6.3 -O2" } */
> +
> +#include "alias-3.c"
> +
> +/* Inlined, so no alias.  */
> +/* { dg-final { scan-assembler-not "\\.alias.*;" } } */
> +/* { dg-final { scan-assembler-not "\\.func f;" } } */
> +
> +/* Static and inlined, so it's deleted.  */
> +/* { dg-final { scan-assembler-not "\\.func __f;" } } */
> diff --git a/gcc/testsuite/gcc.target/nvptx/nvptx.exp b/gcc/testsuite/gcc.target/nvptx/nvptx.exp
> index 284ba41908e..e69b6d35fed 100644
> --- a/gcc/testsuite/gcc.target/nvptx/nvptx.exp
> +++ b/gcc/testsuite/gcc.target/nvptx/nvptx.exp
> @@ -25,6 +25,13 @@ if ![istarget nvptx*-*-*] then {
>  # Load support procs.
>  load_lib gcc-dg.exp
>
> +# Return 1 if code with -mptx=6.3 can be run.
> +proc check_effective_target_runtime_ptx_isa_version_6_3 { args } {
> +    return [check_runtime run_ptx_isa_6_3 {
> +     int main (void) { return 0; }
> +    } "-mptx=6.3"]
> +}
> +
>  # If a testcase doesn't have special options, use these.
>  global DEFAULT_CFLAGS
>  if ![info exists DEFAULT_CFLAGS] then {


-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-WIP-nvptx-TARGET_USE_LOCAL_THUNK_ALIAS_P-TARGET_SUPP.patch --]
[-- Type: text/x-diff, Size: 998 bytes --]

From 76342a36accfe2c140a707cef9b055fe726f681a Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <thomas@codesourcery.com>
Date: Thu, 14 Jul 2022 22:05:17 +0200
Subject: [PATCH] [WIP] nvptx 'TARGET_USE_LOCAL_THUNK_ALIAS_P',
 'TARGET_SUPPORTS_ALIASES'

---
 gcc/config/nvptx/nvptx.h | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/gcc/config/nvptx/nvptx.h b/gcc/config/nvptx/nvptx.h
index dc676dcb5fc5..b1cbe5d417ba 100644
--- a/gcc/config/nvptx/nvptx.h
+++ b/gcc/config/nvptx/nvptx.h
@@ -338,6 +338,12 @@ struct GTY(()) machine_function
 #define ASM_OUTPUT_DEF_FROM_DECLS(STREAM, NAME, VALUE)	\
   nvptx_asm_output_def_from_decls (STREAM, NAME, VALUE)
 
+//TODO
+/* ..., but don't let that dummy ASM_OUTPUT_DEF definition influence other
+   macros.  */
+#define TARGET_USE_LOCAL_THUNK_ALIAS_P(DECL) (!((nvptx_alias == 0 || !TARGET_PTX_6_3)))
+#define TARGET_SUPPORTS_ALIASES (!((nvptx_alias == 0 || !TARGET_PTX_6_3)))
+
 #define NO_DOT_IN_LABEL
 #define ASM_COMMENT_START "//"
 
-- 
2.35.1


  reply	other threads:[~2022-12-02 11:25 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-22 13:41 Tom de Vries
2022-12-02 11:24 ` Thomas Schwinge [this message]
2023-09-12  9:02   ` nvptx 'TARGET_USE_LOCAL_THUNK_ALIAS_P', 'TARGET_SUPPORTS_ALIASES' (was: [committed][nvptx] Use .alias directive for mptx >= 6.3) Thomas Schwinge

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87iliurqt1.fsf@euler.schwinge.homeip.net \
    --to=thomas@codesourcery.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=tdevries@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).