amdgcn: Remove LLVM 9 assembler/linker support
authorAndrew Stubbs <ams@codesourcery.com>
Tue, 15 Feb 2022 15:33:53 +0000 (15:33 +0000)
committerAndrew Stubbs <ams@codesourcery.com>
Tue, 24 May 2022 15:18:13 +0000 (16:18 +0100)
The minimum required LLVM version is now 13.0.1, and is enforced by configure.

gcc/ChangeLog:

* config.in: Regenerate.
* config/gcn/gcn-hsa.h (X_FIJI): Delete.
(X_900): Delete.
(X_906): Delete.
(X_908): Delete.
(S_FIJI): Delete.
(S_900): Delete.
(S_906): Delete.
(S_908): Delete.
(NO_XNACK): New macro.
(NO_SRAM_ECC): New macro.
(SRAMOPT): Keep only v4 variant.
(HSACO3_SELECT_OPT): Delete.
(DRIVER_SELF_SPECS): Delete.
(ASM_SPEC): Remove LLVM 9 support.
* config/gcn/gcn-valu.md
(gather<mode>_insn_2offsets<exec>): Remove assembler bug workaround.
(scatter<mode>_insn_2offsets<exec_scatter>): Likewise.
* config/gcn/gcn.cc (output_file_start): Remove LLVM 9 support.
(print_operand_address): Remove assembler bug workaround.
* config/gcn/mkoffload.cc (EF_AMDGPU_XNACK_V3): Delete.
(EF_AMDGPU_SRAM_ECC_V3): Delete.
(SET_XNACK_ON): Delete v3 variants.
(SET_XNACK_OFF): Delete v3 variants.
(TEST_XNACK): Delete v3 variants.
(SET_SRAM_ECC_ON): Delete v3 variants.
(SET_SRAM_ECC_ANY): Delete v3 variants.
(SET_SRAM_ECC_OFF): Delete v3 variants.
(SET_SRAM_ECC_UNSUPPORTED): Delete v3 variants.
(TEST_SRAM_ECC_ANY): Delete v3 variants.
(TEST_SRAM_ECC_ON): Delete v3 variants.
(copy_early_debug_info): Remove v3 support.
(main): Remove v3 support.
* configure: Regenerate.
* configure.ac: Replace all GCN feature checks with a version check.

gcc/config.in
gcc/config/gcn/gcn-hsa.h
gcc/config/gcn/gcn-valu.md
gcc/config/gcn/gcn.cc
gcc/config/gcn/mkoffload.cc
gcc/configure
gcc/configure.ac

index 64c27c9..6a4f885 100644 (file)
 #endif
 
 
-/* Define if your Arm assembler permits context-specific feature extensions.
-   */
-#ifndef USED_FOR_TARGET
-#undef HAVE_GAS_ARM_EXTENDED_ARCH
-#endif
-
-
 /* Define if your assembler supports .balign and .p2align. */
 #ifndef USED_FOR_TARGET
 #undef HAVE_GAS_BALIGN_AND_P2ALIGN
 #endif
 
 
-/* Define if your assembler has fixed global_load functions. */
-#ifndef USED_FOR_TARGET
-#undef HAVE_GCN_ASM_GLOBAL_LOAD_FIXED
-#endif
-
-
-/* Define if your assembler expects amdgcn_target gfx908+xnack syntax. */
-#ifndef USED_FOR_TARGET
-#undef HAVE_GCN_ASM_V3_SYNTAX
-#endif
-
-
-/* Define if your assembler expects amdgcn_target gfx908:xnack+ syntax. */
-#ifndef USED_FOR_TARGET
-#undef HAVE_GCN_ASM_V4_SYNTAX
-#endif
-
-
-/* Define if your assembler allows -mattr=+sramecc for fiji. */
-#ifndef USED_FOR_TARGET
-#undef HAVE_GCN_SRAM_ECC_FIJI
-#endif
-
-
-/* Define if your assembler allows -mattr=+sramecc for gfx900. */
-#ifndef USED_FOR_TARGET
-#undef HAVE_GCN_SRAM_ECC_GFX900
-#endif
-
-
-/* Define if your assembler allows -mattr=+sramecc for gfx906. */
-#ifndef USED_FOR_TARGET
-#undef HAVE_GCN_SRAM_ECC_GFX906
-#endif
-
-
-/* Define if your assembler allows -mattr=+sramecc for gfx908. */
-#ifndef USED_FOR_TARGET
-#undef HAVE_GCN_SRAM_ECC_GFX908
-#endif
-
-
-/* Define if your assembler allows -mattr=+xnack for fiji. */
-#ifndef USED_FOR_TARGET
-#undef HAVE_GCN_XNACK_FIJI
-#endif
-
-
-/* Define if your assembler allows -mattr=+xnack for gfx900. */
-#ifndef USED_FOR_TARGET
-#undef HAVE_GCN_XNACK_GFX900
-#endif
-
-
-/* Define if your assembler allows -mattr=+xnack for gfx906. */
-#ifndef USED_FOR_TARGET
-#undef HAVE_GCN_XNACK_GFX906
-#endif
-
-
-/* Define if your assembler allows -mattr=+xnack for gfx908. */
-#ifndef USED_FOR_TARGET
-#undef HAVE_GCN_XNACK_GFX908
-#endif
-
-
 /* Define to 1 if you have the `getchar_unlocked' function. */
 #ifndef USED_FOR_TARGET
 #undef HAVE_GETCHAR_UNLOCKED
 #endif
 
 
+/* Define which stat syscall is able to handle 64bit indodes. */
+#ifndef USED_FOR_TARGET
+#undef HOST_STAT_FOR_64BIT_INODES
+#endif
+
+
 /* Define as const if the declaration of iconv() needs const. */
 #ifndef USED_FOR_TARGET
 #undef ICONV_CONST
index 9b5fee9..b3079ce 100644 (file)
@@ -75,68 +75,19 @@ extern unsigned int gcn_local_sym_hash (const char *name);
    supported for gcn.  */
 #define GOMP_SELF_SPECS ""
 
-#ifdef HAVE_GCN_XNACK_FIJI
-#define X_FIJI
-#else
-#define X_FIJI "!march=*:;march=fiji:;"
-#endif
-#ifdef HAVE_GCN_XNACK_GFX900
-#define X_900
-#else
-#define X_900 "march=gfx900:;"
-#endif
-#ifdef HAVE_GCN_XNACK_GFX906
-#define X_906
-#else
-#define X_906 "march=gfx906:;"
-#endif
-#ifdef HAVE_GCN_XNACK_GFX908
-#define X_908
-#else
-#define X_908 "march=gfx908:;"
-#endif
-
-/* These targets can't have SRAM-ECC, even if a broken assembler allows it.  */
-#define S_FIJI "!march=*:;march=fiji:;"
-#define S_900 "march=gfx900:;"
-#define S_906 "march=gfx906:;"
-#ifdef HAVE_GCN_SRAM_ECC_GFX908
-#define S_908
-#else
-#define S_908 "march=gfx908:;"
-#endif
+#define NO_XNACK "!march=*:;march=fiji:;"
+#define NO_SRAM_ECC "!march=*:;march=fiji:;march=gfx900:;march=gfx906:;"
 
-#ifdef HAVE_GCN_ASM_V3_SYNTAX
-#define SRAMOPT "!msram-ecc=off:-mattr=+sram-ecc;:-mattr=-sram-ecc"
-#endif
-#ifdef HAVE_GCN_ASM_V4_SYNTAX
 /* In HSACOv4 no attribute setting means the binary supports "any" hardware
    configuration.  The name of the attribute also changed.  */
 #define SRAMOPT "msram-ecc=on:-mattr=+sramecc;msram-ecc=off:-mattr=-sramecc"
-#endif
-#if !defined(SRAMOPT) && !defined(IN_LIBGCC2)
-#error "No assembler syntax configured"
-#endif
-
-#ifdef HAVE_GCN_ASM_V4_SYNTAX
-/* FIJI cards don't seem to support drivers new enough to allow HSACOv4.  */
-#define HSACO3_SELECT_OPT \
-    "%{!march=*|march=fiji:--amdhsa-code-object-version=3} "
-#else
-#define HSACO3_SELECT_OPT
-#endif
-
-/* These targets can't have SRAM-ECC, even if a broken assembler allows it.  */
-#define DRIVER_SELF_SPECS \
-  "%{march=fiji|march=gfx900|march=gfx906:%{!msram-ecc=*:-msram-ecc=off}}"
 
 /* Use LLVM assembler and linker options.  */
 #define ASM_SPEC  "-triple=amdgcn--amdhsa "  \
                  "%:last_arg(%{march=*:-mcpu=%*}) " \
-                 HSACO3_SELECT_OPT \
-                 "%{" X_FIJI X_900 X_906 X_908 \
-                    "mxnack:-mattr=+xnack;:-mattr=-xnack} " \
-                 "%{" S_FIJI S_900 S_906 S_908 SRAMOPT "} " \
+                 "%{!march=*|march=fiji:--amdhsa-code-object-version=3} " \
+                 "%{" NO_XNACK "mxnack:-mattr=+xnack;:-mattr=-xnack} " \
+                 "%{" NO_SRAM_ECC SRAMOPT "} " \
                  "-filetype=obj"
 #define LINK_SPEC "--pie --export-dynamic"
 #define LIB_SPEC  "-lc"
index 9f868a1..abe4620 100644 (file)
 
     static char buf[200];
     if (AS_GLOBAL_P (as))
-      {
-       /* Work around assembler bug in which a 64-bit register is expected,
-       but a 32-bit value would be correct.  */
-       int reg = REGNO (operands[2]) - FIRST_VGPR_REG;
-       if (HAVE_GCN_ASM_GLOBAL_LOAD_FIXED)
-         sprintf (buf, "global_load%%o0\t%%0, v%d, %%1 offset:%%3%s\;"
-                       "s_waitcnt\tvmcnt(0)", reg, glc);
-       else
-         sprintf (buf, "global_load%%o0\t%%0, v[%d:%d], %%1 offset:%%3%s\;"
-                       "s_waitcnt\tvmcnt(0)", reg, reg + 1, glc);
-      }
+      sprintf (buf, "global_load%%o0\t%%0, %%2, %%1 offset:%%3%s\;"
+              "s_waitcnt\tvmcnt(0)", glc);
     else
       gcc_unreachable ();
       
 
     static char buf[200];
     if (AS_GLOBAL_P (as))
-      {
-       /* Work around assembler bug in which a 64-bit register is expected,
-       but a 32-bit value would be correct.  */
-       int reg = REGNO (operands[1]) - FIRST_VGPR_REG;
-       if (HAVE_GCN_ASM_GLOBAL_LOAD_FIXED)
-         sprintf (buf, "global_store%%s3\tv%d, %%3, %%0 offset:%%2%s",
-                  reg, glc);
-       else
-         sprintf (buf, "global_store%%s3\tv[%d:%d], %%3, %%0 offset:%%2%s",
-                  reg, reg + 1, glc);
-      }
+      sprintf (buf, "global_store%%s3\t%%1, %%3, %%0 offset:%%2%s", glc);
     else
       gcc_unreachable ();
 
index 76b27c4..39a7a96 100644 (file)
@@ -5216,71 +5216,38 @@ gcn_shared_mem_layout (unsigned HOST_WIDE_INT *lo,
 static void
 output_file_start (void)
 {
+  /* In HSACOv4 no attribute setting means the binary supports "any" hardware
+     configuration.  In GCC binaries, this is true for SRAM ECC, but not
+     XNACK.  */
+  const char *xnack = (flag_xnack ? ":xnack+" : ":xnack-");
+  const char *sram_ecc = (flag_sram_ecc == SRAM_ECC_ON ? ":sramecc+"
+                         : flag_sram_ecc == SRAM_ECC_OFF ? ":sramecc-"
+                         : "");
+
   const char *cpu;
-  bool use_xnack_attr = true;
-  bool use_sram_attr = true;
   switch (gcn_arch)
     {
     case PROCESSOR_FIJI:
       cpu = "gfx803";
-#ifndef HAVE_GCN_XNACK_FIJI
-      use_xnack_attr = false;
-#endif
-      use_sram_attr = false;
+      xnack = "";
+      sram_ecc = "";
       break;
     case PROCESSOR_VEGA10:
       cpu = "gfx900";
-#ifndef HAVE_GCN_XNACK_GFX900
-      use_xnack_attr = false;
-#endif
-      use_sram_attr = false;
+      sram_ecc = "";
       break;
     case PROCESSOR_VEGA20:
       cpu = "gfx906";
-#ifndef HAVE_GCN_XNACK_GFX906
-      use_xnack_attr = false;
-#endif
-      use_sram_attr = false;
+      sram_ecc = "";
       break;
     case PROCESSOR_GFX908:
       cpu = "gfx908";
-#ifndef HAVE_GCN_XNACK_GFX908
-      use_xnack_attr = false;
-#endif
-#ifndef HAVE_GCN_SRAM_ECC_GFX908
-      use_sram_attr = false;
-#endif
       break;
     default: gcc_unreachable ();
     }
 
-#if HAVE_GCN_ASM_V3_SYNTAX
-  const char *xnack = (flag_xnack ? "+xnack" : "");
-  const char *sram_ecc = (flag_sram_ecc ? "+sram-ecc" : "");
-#endif
-#if HAVE_GCN_ASM_V4_SYNTAX
-  /* In HSACOv4 no attribute setting means the binary supports "any" hardware
-     configuration.  In GCC binaries, this is true for SRAM ECC, but not
-     XNACK.  */
-  const char *xnack = (flag_xnack ? ":xnack+" : ":xnack-");
-  const char *sram_ecc = (flag_sram_ecc == SRAM_ECC_ON ? ":sramecc+"
-                         : flag_sram_ecc == SRAM_ECC_OFF ? ":sramecc-"
-                         : "");
-#endif
-  if (!use_xnack_attr)
-    xnack = "";
-  if (!use_sram_attr)
-    sram_ecc = "";
-
   fprintf(asm_out_file, "\t.amdgcn_target \"amdgcn-unknown-amdhsa--%s%s%s\"\n",
-         cpu,
-#if HAVE_GCN_ASM_V3_SYNTAX
-         xnack, sram_ecc
-#endif
-#ifdef HAVE_GCN_ASM_V4_SYNTAX
-         sram_ecc, xnack
-#endif
-         );
+         cpu, sram_ecc, xnack);
 }
 
 /* Implement ASM_DECLARE_FUNCTION_NAME via gcn-hsa.h.
@@ -5724,23 +5691,10 @@ print_operand_address (FILE *file, rtx mem)
              if (vgpr_offset == NULL_RTX)
                /* In this case, the vector offset is zero, so we use the first
                   lane of v1, which is initialized to zero.  */
-               {
-                 if (HAVE_GCN_ASM_GLOBAL_LOAD_FIXED)
-                   fprintf (file, "v1");
-                 else
-                   fprintf (file, "v[1:2]");
-               }
+               fprintf (file, "v1");
              else if (REG_P (vgpr_offset)
                       && VGPR_REGNO_P (REGNO (vgpr_offset)))
-               {
-                 if (HAVE_GCN_ASM_GLOBAL_LOAD_FIXED)
-                   fprintf (file, "v%d",
-                            REGNO (vgpr_offset) - FIRST_VGPR_REG);
-                 else
-                   fprintf (file, "v[%d:%d]",
-                            REGNO (vgpr_offset) - FIRST_VGPR_REG,
-                            REGNO (vgpr_offset) - FIRST_VGPR_REG + 1);
-               }
+               fprintf (file, "v%d", REGNO (vgpr_offset) - FIRST_VGPR_REG);
              else
                output_operand_lossage ("bad ADDR_SPACE_GLOBAL address");
            }
index 94ba7ff..e98277c 100644 (file)
@@ -56,9 +56,6 @@
 #undef  EF_AMDGPU_MACH_AMDGCN_GFX908
 #define EF_AMDGPU_MACH_AMDGCN_GFX908 0x30
 
-#define EF_AMDGPU_XNACK_V3    0x100
-#define EF_AMDGPU_SRAM_ECC_V3 0x200
-
 #define EF_AMDGPU_FEATURE_XNACK_V4     0x300  /* Mask.  */
 #define EF_AMDGPU_FEATURE_XNACK_UNSUPPORTED_V4 0x000
 #define EF_AMDGPU_FEATURE_XNACK_ANY_V4 0x100
 #define EF_AMDGPU_FEATURE_SRAMECC_OFF_V4       0x800
 #define EF_AMDGPU_FEATURE_SRAMECC_ON_V4                0xc00
 
-#ifdef HAVE_GCN_ASM_V3_SYNTAX
-#define SET_XNACK_ON(VAR) VAR |= EF_AMDGPU_XNACK_V3
-#define SET_XNACK_OFF(VAR) VAR &= ~EF_AMDGPU_XNACK_V3
-#define TEST_XNACK(VAR) (VAR & EF_AMDGPU_XNACK_V3)
-
-#define SET_SRAM_ECC_ON(VAR) VAR |= EF_AMDGPU_SRAM_ECC_V3
-#define SET_SRAM_ECC_ANY(VAR) SET_SRAM_ECC_ON (VAR)
-#define SET_SRAM_ECC_OFF(VAR) VAR &= ~EF_AMDGPU_SRAM_ECC_V3
-#define SET_SRAM_ECC_UNSUPPORTED(VAR) SET_SRAM_ECC_OFF (VAR)
-#define TEST_SRAM_ECC_ANY(VAR) 0 /* Not supported.  */
-#define TEST_SRAM_ECC_ON(VAR) (VAR & EF_AMDGPU_SRAM_ECC_V3)
-#endif
-#ifdef HAVE_GCN_ASM_V4_SYNTAX
 #define SET_XNACK_ON(VAR) VAR = ((VAR & ~EF_AMDGPU_FEATURE_XNACK_V4) \
                                 | EF_AMDGPU_FEATURE_XNACK_ON_V4)
 #define SET_XNACK_OFF(VAR) VAR = ((VAR & ~EF_AMDGPU_FEATURE_XNACK_V4) \
                                == EF_AMDGPU_FEATURE_SRAMECC_ANY_V4)
 #define TEST_SRAM_ECC_ON(VAR) ((VAR & EF_AMDGPU_FEATURE_SRAMECC_V4) \
                               == EF_AMDGPU_FEATURE_SRAMECC_ON_V4)
-#endif
 
 #ifndef R_AMDGPU_NONE
 #define R_AMDGPU_NONE          0
@@ -130,12 +113,7 @@ static struct obstack files_to_cleanup;
 enum offload_abi offload_abi = OFFLOAD_ABI_UNSET;
 uint32_t elf_arch = EF_AMDGPU_MACH_AMDGCN_GFX803;  // Default GPU architecture.
 uint32_t elf_flags =
-#ifdef HAVE_GCN_ASM_V3_SYNTAX
-    0;
-#endif
-#ifdef HAVE_GCN_ASM_V4_SYNTAX
     (EF_AMDGPU_FEATURE_XNACK_ANY_V4 | EF_AMDGPU_FEATURE_SRAMECC_ANY_V4);
-#endif
 
 /* Delete tempfiles.  */
 
@@ -362,14 +340,9 @@ copy_early_debug_info (const char *infile, const char *outfile)
 
   /* Patch the correct elf architecture flag into the file.  */
   ehdr.e_ident[7] = ELFOSABI_AMDGPU_HSA;
-#ifdef HAVE_GCN_ASM_V3_SYNTAX
-  ehdr.e_ident[8] = ELFABIVERSION_AMDGPU_HSA_V3;
-#endif
-#ifdef HAVE_GCN_ASM_V4_SYNTAX
   ehdr.e_ident[8] = (elf_arch == EF_AMDGPU_MACH_AMDGCN_GFX803
                     ? ELFABIVERSION_AMDGPU_HSA_V3
                     : ELFABIVERSION_AMDGPU_HSA_V4);
-#endif
   ehdr.e_type = ET_REL;
   ehdr.e_machine = EM_AMDGPU;
   ehdr.e_flags = elf_arch | elf_flags_actual;
@@ -884,7 +857,6 @@ main (int argc, char **argv)
   bool fopenacc = false;
   bool fPIC = false;
   bool fpic = false;
-  bool sram_seen = false;
   for (int i = 1; i < argc; i++)
     {
 #define STR "-foffload-abi="
@@ -912,20 +884,11 @@ main (int argc, char **argv)
       else if (strcmp (argv[i], "-mno-xnack") == 0)
        SET_XNACK_OFF (elf_flags);
       else if (strcmp (argv[i], "-msram-ecc=on") == 0)
-       {
-         SET_SRAM_ECC_ON (elf_flags);
-         sram_seen = true;
-       }
+       SET_SRAM_ECC_ON (elf_flags);
       else if (strcmp (argv[i], "-msram-ecc=any") == 0)
-       {
-         SET_SRAM_ECC_ANY (elf_flags);
-         sram_seen = true;
-       }
+       SET_SRAM_ECC_ANY (elf_flags);
       else if (strcmp (argv[i], "-msram-ecc=off") == 0)
-       {
-         SET_SRAM_ECC_OFF (elf_flags);
-         sram_seen = true;
-       }
+       SET_SRAM_ECC_OFF (elf_flags);
       else if (strcmp (argv[i], "-save-temps") == 0)
        save_temps = true;
       else if (strcmp (argv[i], "-v") == 0)
@@ -946,28 +909,6 @@ main (int argc, char **argv)
   if (!(fopenacc ^ fopenmp))
     fatal_error (input_location, "either -fopenacc or -fopenmp must be set");
 
-  if (!sram_seen)
-    {
-#ifdef HAVE_GCN_ASM_V3_SYNTAX
-      /* For HSACOv3, the SRAM-ECC feature defaults to "on" on GPUs where the
-        feature is available.
-        (HSACOv4 has elf_flags initialsed to "any" in all cases.)  */
-      switch (elf_arch)
-       {
-       case EF_AMDGPU_MACH_AMDGCN_GFX803:
-       case EF_AMDGPU_MACH_AMDGCN_GFX900:
-       case EF_AMDGPU_MACH_AMDGCN_GFX906:
-#ifndef HAVE_GCN_SRAM_ECC_GFX908
-       case EF_AMDGPU_MACH_AMDGCN_GFX908:
-#endif
-         break;
-       default:
-         SET_SRAM_ECC_ON (elf_flags);
-         break;
-       }
-#endif
-    }
-
   const char *abi;
   switch (offload_abi)
     {
index 37e0dd5..ba3a998 100755 (executable)
@@ -29015,421 +29015,28 @@ case "$target" in
     ;;
 esac
 
-# This tests if the assembler supports two registers for global_load functions
-# (like in LLVM versions <12) or one register (like in LLVM 12).
+# AMD GCN needs the LLVM assembler and linker.
+# Test that LLVM is at least 13.0.1.
 case "$target" in
   amdgcn-* | gcn-*)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler fix for global_load functions" >&5
-$as_echo_n "checking assembler fix for global_load functions... " >&6; }
-    gcc_cv_as_gcn_global_load_fixed=yes
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking llvm assembler version" >&5
+$as_echo_n "checking llvm assembler version... " >&6; }
+    gcc_cv_as_version="unknown"
     if test x$gcc_cv_as != x; then
-      cat > conftest.s <<EOF
-       global_store_dwordx2    v[1:2], v[4:5], s[14:15]
-EOF
-      if $gcc_cv_as -triple=amdgcn--amdhsa -filetype=obj -mcpu=gfx900 -o conftest.o conftest.s > /dev/null 2>&1; then
-        gcc_cv_as_gcn_global_load_fixed=no
-      fi
-      rm -f conftest.s conftest.o conftest
-    fi
-    global_load_fixed=`if test x$gcc_cv_as_gcn_global_load_fixed = xyes; then echo 1; else echo 0; fi`
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_GCN_ASM_GLOBAL_LOAD_FIXED $global_load_fixed
-_ACEOF
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_gcn_global_load_fixed" >&5
-$as_echo "$gcc_cv_as_gcn_global_load_fixed" >&6; }
-    ;;
-esac
-
-case "$target" in
-  amdgcn-* | gcn-*)
-    # Test the LLVM assembler syntax dialect; they have made a number of
-    # changes between LLVM 12 & 13 without any backward compatibility.
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for assembler amdgcn_target v2/3 syntax" >&5
-$as_echo_n "checking assembler for assembler amdgcn_target v2/3 syntax... " >&6; }
-if ${gcc_cv_as_gcn_asm_v3_syntax+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gcc_cv_as_gcn_asm_v3_syntax=no
-  if test x$gcc_cv_as != x; then
-    $as_echo '.amdgcn_target "amdgcn-unknown-amdhsa--gfx906+xnack"' > conftest.s
-    if { ac_try='$gcc_cv_as $gcc_cv_as_flags -triple=amdgcn--amdhsa -mcpu=gfx906 -mattr=+xnack -o conftest.o conftest.s >&5'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }
-    then
-       gcc_cv_as_gcn_asm_v3_syntax=yes
-    else
-      echo "configure: failed program was" >&5
-      cat conftest.s >&5
-    fi
-    rm -f conftest.o conftest.s
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_gcn_asm_v3_syntax" >&5
-$as_echo "$gcc_cv_as_gcn_asm_v3_syntax" >&6; }
-if test $gcc_cv_as_gcn_asm_v3_syntax = yes; then
-
-$as_echo "#define HAVE_GCN_ASM_V3_SYNTAX 1" >>confdefs.h
-
-fi
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for assembler amdgcn_target v4 syntax" >&5
-$as_echo_n "checking assembler for assembler amdgcn_target v4 syntax... " >&6; }
-if ${gcc_cv_as_gcn_asm_v4_syntax+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gcc_cv_as_gcn_asm_v4_syntax=no
-  if test x$gcc_cv_as != x; then
-    $as_echo '.amdgcn_target "amdgcn-unknown-amdhsa--gfx908:xnack+"' > conftest.s
-    if { ac_try='$gcc_cv_as $gcc_cv_as_flags -triple=amdgcn--amdhsa -mcpu=gfx908 -mattr=+xnack -o conftest.o conftest.s >&5'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }
-    then
-       gcc_cv_as_gcn_asm_v4_syntax=yes
-    else
-      echo "configure: failed program was" >&5
-      cat conftest.s >&5
-    fi
-    rm -f conftest.o conftest.s
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_gcn_asm_v4_syntax" >&5
-$as_echo "$gcc_cv_as_gcn_asm_v4_syntax" >&6; }
-if test $gcc_cv_as_gcn_asm_v4_syntax = yes; then
-
-$as_echo "#define HAVE_GCN_ASM_V4_SYNTAX 1" >>confdefs.h
-
-fi
-
-
-    # Some attribute names changed in the move to v4 ...
-    if test $gcc_cv_as_gcn_asm_v3_syntax = yes; then
-       sramopt="+sram-ecc"
-       sramattr="+sram-ecc"
-       xnackattr="+xnack"
-    elif test $gcc_cv_as_gcn_asm_v4_syntax = yes; then
-       sramopt="+sramecc"
-       sramattr=":sramecc+"
-       xnackattr=":xnack+"
-    else
-       as_fn_error $? "Unrecognised assembler version" "$LINENO" 5
-    fi
-
-    # Test whether the LLVM assembler accepts -mattr=+xnack without any
-    # diagnostic. LLVM 9 & 10 accept the option whether it makes sense or not,
-    # LLVM 12+ throws a warning for GPUs without support.
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for assembler accepts -mattr=+xnack for fiji" >&5
-$as_echo_n "checking assembler for assembler accepts -mattr=+xnack for fiji... " >&6; }
-if ${gcc_cv_as_gcn_xnack_ecc_fiji+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gcc_cv_as_gcn_xnack_ecc_fiji=no
-  if test x$gcc_cv_as != x; then
-    $as_echo '' > conftest.s
-    if { ac_try='$gcc_cv_as $gcc_cv_as_flags -triple=amdgcn--amdhsa -mcpu=fiji -mattr=+xnack 2>conftest.err -o conftest.o conftest.s >&5'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }
-    then
-       grep "." conftest.err >&5 \
-       || gcc_cv_as_gcn_xnack_ecc_fiji=yes
-    else
-      echo "configure: failed program was" >&5
-      cat conftest.s >&5
-    fi
-    rm -f conftest.o conftest.s
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_gcn_xnack_ecc_fiji" >&5
-$as_echo "$gcc_cv_as_gcn_xnack_ecc_fiji" >&6; }
-if test $gcc_cv_as_gcn_xnack_ecc_fiji = yes; then
-
-$as_echo "#define HAVE_GCN_XNACK_FIJI 1" >>confdefs.h
-
-fi
-
-    rm -f conftest.err
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for assembler accepts -mattr=+xnack for gfx900" >&5
-$as_echo_n "checking assembler for assembler accepts -mattr=+xnack for gfx900... " >&6; }
-if ${gcc_cv_as_gcn_xnack_ecc_gfx900+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gcc_cv_as_gcn_xnack_ecc_gfx900=no
-  if test x$gcc_cv_as != x; then
-    $as_echo '' > conftest.s
-    if { ac_try='$gcc_cv_as $gcc_cv_as_flags -triple=amdgcn--amdhsa -mcpu=gfx900 -mattr=+xnack 2>conftest.err -o conftest.o conftest.s >&5'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }
-    then
-       grep "." conftest.err >&5 \
-       || gcc_cv_as_gcn_xnack_ecc_gfx900=yes
-    else
-      echo "configure: failed program was" >&5
-      cat conftest.s >&5
-    fi
-    rm -f conftest.o conftest.s
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_gcn_xnack_ecc_gfx900" >&5
-$as_echo "$gcc_cv_as_gcn_xnack_ecc_gfx900" >&6; }
-if test $gcc_cv_as_gcn_xnack_ecc_gfx900 = yes; then
-
-$as_echo "#define HAVE_GCN_XNACK_GFX900 1" >>confdefs.h
-
-fi
-
-    rm -f conftest.err
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for assembler accepts -mattr=+xnack for gfx906" >&5
-$as_echo_n "checking assembler for assembler accepts -mattr=+xnack for gfx906... " >&6; }
-if ${gcc_cv_as_gcn_xnack_ecc_gfx906+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gcc_cv_as_gcn_xnack_ecc_gfx906=no
-  if test x$gcc_cv_as != x; then
-    $as_echo '' > conftest.s
-    if { ac_try='$gcc_cv_as $gcc_cv_as_flags -triple=amdgcn--amdhsa -mcpu=gfx906 -mattr=+xnack 2>conftest.err -o conftest.o conftest.s >&5'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }
-    then
-       grep "." conftest.err >&5 \
-       || gcc_cv_as_gcn_xnack_ecc_gfx906=yes
-    else
-      echo "configure: failed program was" >&5
-      cat conftest.s >&5
-    fi
-    rm -f conftest.o conftest.s
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_gcn_xnack_ecc_gfx906" >&5
-$as_echo "$gcc_cv_as_gcn_xnack_ecc_gfx906" >&6; }
-if test $gcc_cv_as_gcn_xnack_ecc_gfx906 = yes; then
-
-$as_echo "#define HAVE_GCN_XNACK_GFX906 1" >>confdefs.h
-
-fi
-
-    rm -f conftest.err
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for assembler accepts -mattr=+xnack for gfx908" >&5
-$as_echo_n "checking assembler for assembler accepts -mattr=+xnack for gfx908... " >&6; }
-if ${gcc_cv_as_gcn_xnack_ecc_gfx908+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gcc_cv_as_gcn_xnack_ecc_gfx908=no
-  if test x$gcc_cv_as != x; then
-    $as_echo '' > conftest.s
-    if { ac_try='$gcc_cv_as $gcc_cv_as_flags -triple=amdgcn--amdhsa -mcpu=gfx908 -mattr=+xnack 2>conftest.err -o conftest.o conftest.s >&5'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }
-    then
-       grep "." conftest.err >&5 \
-       || gcc_cv_as_gcn_xnack_ecc_gfx908=yes
-    else
-      echo "configure: failed program was" >&5
-      cat conftest.s >&5
-    fi
-    rm -f conftest.o conftest.s
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_gcn_xnack_ecc_gfx908" >&5
-$as_echo "$gcc_cv_as_gcn_xnack_ecc_gfx908" >&6; }
-if test $gcc_cv_as_gcn_xnack_ecc_gfx908 = yes; then
-
-$as_echo "#define HAVE_GCN_XNACK_GFX908 1" >>confdefs.h
-
-fi
-
-    rm -f conftest.err
-
-    # Test whether the LLVM assembler accepts -mattr=+sramecc without any
-    # diagnostic. LLVM 9 & 10 accept the option whether it makes sense or not,
-    # (some?) LLVM 12 rejects it for all GPUs, and LLVM13 throws a warning
-    # for GPUs without support.
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for assembler accepts -mattr=$sramopt for fiji" >&5
-$as_echo_n "checking assembler for assembler accepts -mattr=$sramopt for fiji... " >&6; }
-if ${gcc_cv_as_gcn_sram_ecc_fiji+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gcc_cv_as_gcn_sram_ecc_fiji=no
-  if test x$gcc_cv_as != x; then
-    $as_echo '' > conftest.s
-    if { ac_try='$gcc_cv_as $gcc_cv_as_flags -triple=amdgcn--amdhsa -mcpu=fiji -mattr=$sramopt 2>conftest.err -o conftest.o conftest.s >&5'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }
-    then
-       grep "." conftest.err >&5 \
-       || gcc_cv_as_gcn_sram_ecc_fiji=yes
-    else
-      echo "configure: failed program was" >&5
-      cat conftest.s >&5
-    fi
-    rm -f conftest.o conftest.s
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_gcn_sram_ecc_fiji" >&5
-$as_echo "$gcc_cv_as_gcn_sram_ecc_fiji" >&6; }
-if test $gcc_cv_as_gcn_sram_ecc_fiji = yes; then
-
-$as_echo "#define HAVE_GCN_SRAM_ECC_FIJI 1" >>confdefs.h
-
-fi
-
-    rm -f conftest.err
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for assembler accepts -mattr=$sramopt for gfx900" >&5
-$as_echo_n "checking assembler for assembler accepts -mattr=$sramopt for gfx900... " >&6; }
-if ${gcc_cv_as_gcn_sram_ecc_gfx900+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gcc_cv_as_gcn_sram_ecc_gfx900=no
-  if test x$gcc_cv_as != x; then
-    $as_echo '' > conftest.s
-    if { ac_try='$gcc_cv_as $gcc_cv_as_flags -triple=amdgcn--amdhsa -mcpu=gfx900 -mattr=$sramopt 2>conftest.err -o conftest.o conftest.s >&5'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }
-    then
-       grep "." conftest.err >&5 \
-       || gcc_cv_as_gcn_sram_ecc_gfx900=yes
-    else
-      echo "configure: failed program was" >&5
-      cat conftest.s >&5
-    fi
-    rm -f conftest.o conftest.s
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_gcn_sram_ecc_gfx900" >&5
-$as_echo "$gcc_cv_as_gcn_sram_ecc_gfx900" >&6; }
-if test $gcc_cv_as_gcn_sram_ecc_gfx900 = yes; then
-
-$as_echo "#define HAVE_GCN_SRAM_ECC_GFX900 1" >>confdefs.h
-
-fi
-
-    rm -f conftest.err
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for assembler accepts -mattr=$sramopt for gfx906" >&5
-$as_echo_n "checking assembler for assembler accepts -mattr=$sramopt for gfx906... " >&6; }
-if ${gcc_cv_as_gcn_sram_ecc_gfx906+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gcc_cv_as_gcn_sram_ecc_gfx906=no
-  if test x$gcc_cv_as != x; then
-    $as_echo '' > conftest.s
-    if { ac_try='$gcc_cv_as $gcc_cv_as_flags -triple=amdgcn--amdhsa -mcpu=gfx906 -mattr=$sramopt 2>conftest.err -o conftest.o conftest.s >&5'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }
-    then
-       grep "." conftest.err >&5 \
-       || gcc_cv_as_gcn_sram_ecc_gfx906=yes
-    else
-      echo "configure: failed program was" >&5
-      cat conftest.s >&5
-    fi
-    rm -f conftest.o conftest.s
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_gcn_sram_ecc_gfx906" >&5
-$as_echo "$gcc_cv_as_gcn_sram_ecc_gfx906" >&6; }
-if test $gcc_cv_as_gcn_sram_ecc_gfx906 = yes; then
-
-$as_echo "#define HAVE_GCN_SRAM_ECC_GFX906 1" >>confdefs.h
-
-fi
-
-    rm -f conftest.err
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for assembler accepts -mattr=$sramopt for gfx908" >&5
-$as_echo_n "checking assembler for assembler accepts -mattr=$sramopt for gfx908... " >&6; }
-if ${gcc_cv_as_gcn_sram_ecc_gfx908+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gcc_cv_as_gcn_sram_ecc_gfx908=no
-  if test x$gcc_cv_as != x; then
-    $as_echo '' > conftest.s
-    if { ac_try='$gcc_cv_as $gcc_cv_as_flags -triple=amdgcn--amdhsa -mcpu=gfx908 -mattr=$sramopt 2>conftest.err -o conftest.o conftest.s >&5'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }
-    then
-       grep "." conftest.err >&5 \
-       || gcc_cv_as_gcn_sram_ecc_gfx908=yes
-    else
-      echo "configure: failed program was" >&5
-      cat conftest.s >&5
+      gcc_cv_as_version=`$gcc_cv_as --version 2>&1 | sed -ne '/version/s/.* \([0-9]\)/\1/p' || echo error`
+      case "$gcc_cv_as_version" in
+       13.0.[1-9]*) ;;          # 13.0.1+
+       13.[1-9]*) ;;            # 13.1+
+       1[4-9]*) ;;              # 14..19
+       [2-9][0-9]*) ;;        # 20..99
+       [1-9][0-9][0-9]*) ;; # 100+
+       error) as_fn_error $? "cannot determine LLVM version" "$LINENO" 5 ;;
+       *) as_fn_error $? "LLVM 13.0.1 or later is required (found LLVM $gcc_cv_as_version)" "$LINENO" 5 ;;
+      esac
     fi
-    rm -f conftest.o conftest.s
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_gcn_sram_ecc_gfx908" >&5
-$as_echo "$gcc_cv_as_gcn_sram_ecc_gfx908" >&6; }
-if test $gcc_cv_as_gcn_sram_ecc_gfx908 = yes; then
-
-$as_echo "#define HAVE_GCN_SRAM_ECC_GFX908 1" >>confdefs.h
-
-fi
-
-    rm -f conftest.err
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_version, ok" >&5
+$as_echo "$gcc_cv_as_version, ok" >&6; }
     ;;
-  arm*)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for assembler for arm accepts context-specific architecture extensions" >&5
-$as_echo_n "checking assembler for assembler for arm accepts context-specific architecture extensions... " >&6; }
-if ${gcc_cv_as_arm_option_extensions+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gcc_cv_as_arm_option_extensions=no
-  if test x$gcc_cv_as != x; then
-    $as_echo '.text
-       .thumb
-       .syntax unified
-       vmov.f32 s0, s1' > conftest.s
-    if { ac_try='$gcc_cv_as $gcc_cv_as_flags -march=armv8.1-m.main+mve -o conftest.o conftest.s >&5'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }
-    then
-       gcc_cv_as_arm_option_extensions=yes
-    else
-      echo "configure: failed program was" >&5
-      cat conftest.s >&5
-    fi
-    rm -f conftest.o conftest.s
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_arm_option_extensions" >&5
-$as_echo "$gcc_cv_as_arm_option_extensions" >&6; }
-if test $gcc_cv_as_arm_option_extensions = yes; then
-
-$as_echo "#define HAVE_GAS_ARM_EXTENDED_ARCH 1" >>confdefs.h
-
-fi
-
 esac
 
 # ??? Not all targets support dwarf2 debug_line, even within a version
index 23bee70..4cd48b4 100644 (file)
@@ -5375,141 +5375,26 @@ case "$target" in
     ;;
 esac
 
-# This tests if the assembler supports two registers for global_load functions
-# (like in LLVM versions <12) or one register (like in LLVM 12).
+# AMD GCN needs the LLVM assembler and linker.
+# Test that LLVM is at least 13.0.1.
 case "$target" in
   amdgcn-* | gcn-*)
-    AC_MSG_CHECKING(assembler fix for global_load functions)
-    gcc_cv_as_gcn_global_load_fixed=yes
+    AC_MSG_CHECKING(llvm assembler version)
+    gcc_cv_as_version="unknown"
     if test x$gcc_cv_as != x; then
-      cat > conftest.s <<EOF
-       global_store_dwordx2    v[[1:2]], v[[4:5]], s[[14:15]]
-EOF
-      if $gcc_cv_as -triple=amdgcn--amdhsa -filetype=obj -mcpu=gfx900 -o conftest.o conftest.s > /dev/null 2>&1; then
-        gcc_cv_as_gcn_global_load_fixed=no
-      fi
-      rm -f conftest.s conftest.o conftest
-    fi
-    global_load_fixed=`if test x$gcc_cv_as_gcn_global_load_fixed = xyes; then echo 1; else echo 0; fi`
-    AC_DEFINE_UNQUOTED(HAVE_GCN_ASM_GLOBAL_LOAD_FIXED, $global_load_fixed,
-      [Define if your assembler has fixed global_load functions.])
-    AC_MSG_RESULT($gcc_cv_as_gcn_global_load_fixed)
-    ;;
-esac
-
-case "$target" in
-  amdgcn-* | gcn-*)
-    # Test the LLVM assembler syntax dialect; they have made a number of
-    # changes between LLVM 12 & 13 without any backward compatibility.
-    gcc_GAS_CHECK_FEATURE([assembler amdgcn_target v2/3 syntax],
-      gcc_cv_as_gcn_asm_v3_syntax,
-      [-triple=amdgcn--amdhsa -mcpu=gfx906 -mattr=+xnack],
-      [.amdgcn_target "amdgcn-unknown-amdhsa--gfx906+xnack"],,
-      [AC_DEFINE(HAVE_GCN_ASM_V3_SYNTAX, 1,
-       [Define if your assembler expects amdgcn_target gfx908+xnack syntax.])])
-    gcc_GAS_CHECK_FEATURE([assembler amdgcn_target v4 syntax],
-      gcc_cv_as_gcn_asm_v4_syntax,
-      [-triple=amdgcn--amdhsa -mcpu=gfx908 -mattr=+xnack],
-      [.amdgcn_target "amdgcn-unknown-amdhsa--gfx908:xnack+"],,
-      [AC_DEFINE(HAVE_GCN_ASM_V4_SYNTAX, 1,
-       [Define if your assembler expects amdgcn_target gfx908:xnack+ syntax.])])
-
-    # Some attribute names changed in the move to v4 ...
-    if test $gcc_cv_as_gcn_asm_v3_syntax = yes; then
-       sramopt="+sram-ecc"
-       sramattr="+sram-ecc"
-       xnackattr="+xnack"
-    elif test $gcc_cv_as_gcn_asm_v4_syntax = yes; then
-       sramopt="+sramecc"
-       sramattr=":sramecc+"
-       xnackattr=":xnack+"
-    else
-       AC_MSG_ERROR([Unrecognised assembler version])
+      gcc_cv_as_version=`$gcc_cv_as --version 2>&1 | sed -ne '/version/s/.* \([[0-9]]\)/\1/p' || echo error`
+      case "$gcc_cv_as_version" in
+       13.0.[[1-9]]*) ;;          # 13.0.1+
+       13.[[1-9]]*) ;;            # 13.1+
+       1[[4-9]]*) ;;              # 14..19
+       [[2-9]][[0-9]]*) ;;        # 20..99
+       [[1-9]][[0-9]][[0-9]]*) ;; # 100+
+       error) AC_MSG_ERROR([cannot determine LLVM version]) ;;
+       *) AC_MSG_ERROR([LLVM 13.0.1 or later is required (found LLVM $gcc_cv_as_version)]) ;;
+      esac
     fi
-
-    # Test whether the LLVM assembler accepts -mattr=+xnack without any
-    # diagnostic. LLVM 9 & 10 accept the option whether it makes sense or not,
-    # LLVM 12+ throws a warning for GPUs without support.
-    gcc_GAS_CHECK_FEATURE([assembler accepts -mattr=+xnack for fiji],
-      gcc_cv_as_gcn_xnack_ecc_fiji,
-      [-triple=amdgcn--amdhsa -mcpu=fiji -mattr=+xnack 2>conftest.err], [],
-      [grep "." conftest.err >&AS_MESSAGE_LOG_FD \
-       || gcc_cv_as_gcn_xnack_ecc_fiji=yes],
-      [AC_DEFINE(HAVE_GCN_XNACK_FIJI, 1,
-       [Define if your assembler allows -mattr=+xnack for fiji.])])
-    rm -f conftest.err
-    gcc_GAS_CHECK_FEATURE([assembler accepts -mattr=+xnack for gfx900],
-      gcc_cv_as_gcn_xnack_ecc_gfx900,
-      [-triple=amdgcn--amdhsa -mcpu=gfx900 -mattr=+xnack 2>conftest.err], [],
-      [grep "." conftest.err >&AS_MESSAGE_LOG_FD \
-       || gcc_cv_as_gcn_xnack_ecc_gfx900=yes],
-      [AC_DEFINE(HAVE_GCN_XNACK_GFX900, 1,
-       [Define if your assembler allows -mattr=+xnack for gfx900.])])
-    rm -f conftest.err
-    gcc_GAS_CHECK_FEATURE([assembler accepts -mattr=+xnack for gfx906],
-      gcc_cv_as_gcn_xnack_ecc_gfx906,
-      [-triple=amdgcn--amdhsa -mcpu=gfx906 -mattr=+xnack 2>conftest.err], [],
-      [grep "." conftest.err >&AS_MESSAGE_LOG_FD \
-       || gcc_cv_as_gcn_xnack_ecc_gfx906=yes],
-      [AC_DEFINE(HAVE_GCN_XNACK_GFX906, 1,
-       [Define if your assembler allows -mattr=+xnack for gfx906.])])
-    rm -f conftest.err
-    gcc_GAS_CHECK_FEATURE([assembler accepts -mattr=+xnack for gfx908],
-      gcc_cv_as_gcn_xnack_ecc_gfx908,
-      [-triple=amdgcn--amdhsa -mcpu=gfx908 -mattr=+xnack 2>conftest.err], [],
-      [grep "." conftest.err >&AS_MESSAGE_LOG_FD \
-       || gcc_cv_as_gcn_xnack_ecc_gfx908=yes],
-      [AC_DEFINE(HAVE_GCN_XNACK_GFX908, 1,
-       [Define if your assembler allows -mattr=+xnack for gfx908.])])
-    rm -f conftest.err
-
-    # Test whether the LLVM assembler accepts -mattr=+sramecc without any
-    # diagnostic. LLVM 9 & 10 accept the option whether it makes sense or not,
-    # (some?) LLVM 12 rejects it for all GPUs, and LLVM13 throws a warning
-    # for GPUs without support.
-    gcc_GAS_CHECK_FEATURE([assembler accepts -mattr=$sramopt for fiji],
-      gcc_cv_as_gcn_sram_ecc_fiji,
-      [-triple=amdgcn--amdhsa -mcpu=fiji -mattr=$sramopt 2>conftest.err], [],
-      [grep "." conftest.err >&AS_MESSAGE_LOG_FD \
-       || gcc_cv_as_gcn_sram_ecc_fiji=yes],
-      [AC_DEFINE(HAVE_GCN_SRAM_ECC_FIJI, 1,
-       [Define if your assembler allows -mattr=+sramecc for fiji.])])
-    rm -f conftest.err
-    gcc_GAS_CHECK_FEATURE([assembler accepts -mattr=$sramopt for gfx900],
-      gcc_cv_as_gcn_sram_ecc_gfx900,
-      [-triple=amdgcn--amdhsa -mcpu=gfx900 -mattr=$sramopt 2>conftest.err], [],
-      [grep "." conftest.err >&AS_MESSAGE_LOG_FD \
-       || gcc_cv_as_gcn_sram_ecc_gfx900=yes],
-      [AC_DEFINE(HAVE_GCN_SRAM_ECC_GFX900, 1,
-       [Define if your assembler allows -mattr=+sramecc for gfx900.])])
-    rm -f conftest.err
-    gcc_GAS_CHECK_FEATURE([assembler accepts -mattr=$sramopt for gfx906],
-      gcc_cv_as_gcn_sram_ecc_gfx906,
-      [-triple=amdgcn--amdhsa -mcpu=gfx906 -mattr=$sramopt 2>conftest.err], [],
-      [grep "." conftest.err >&AS_MESSAGE_LOG_FD \
-       || gcc_cv_as_gcn_sram_ecc_gfx906=yes],
-      [AC_DEFINE(HAVE_GCN_SRAM_ECC_GFX906, 1,
-       [Define if your assembler allows -mattr=+sramecc for gfx906.])])
-    rm -f conftest.err
-    gcc_GAS_CHECK_FEATURE([assembler accepts -mattr=$sramopt for gfx908],
-      gcc_cv_as_gcn_sram_ecc_gfx908,
-      [-triple=amdgcn--amdhsa -mcpu=gfx908 -mattr=$sramopt 2>conftest.err], [],
-      [grep "." conftest.err >&AS_MESSAGE_LOG_FD \
-       || gcc_cv_as_gcn_sram_ecc_gfx908=yes],
-      [AC_DEFINE(HAVE_GCN_SRAM_ECC_GFX908, 1,
-       [Define if your assembler allows -mattr=+sramecc for gfx908.])])
-    rm -f conftest.err
+    AC_MSG_RESULT([$gcc_cv_as_version, ok])
     ;;
-  arm*)
-    gcc_GAS_CHECK_FEATURE([assembler for arm accepts context-specific architecture extensions],
-      gcc_cv_as_arm_option_extensions,
-      [-march=armv8.1-m.main+mve],
-      [.text
-       .thumb
-       .syntax unified
-       vmov.f32 s0, s1],,
-      [AC_DEFINE(HAVE_GAS_ARM_EXTENDED_ARCH, 1,
-       [Define if your Arm assembler permits context-specific feature extensions.])])
 esac
 
 # ??? Not all targets support dwarf2 debug_line, even within a version