From 86b3a7532d56f74fcd1c362f2da7f95e8cc4e4a6 Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <tschwinge@baylibre.com>
Date: Fri, 27 Sep 2024 17:44:16 +0200
Subject: [PATCH] nvptx: Support '--with-multilib-list'
No change in behavior unless specifying it.
gcc/
* config.gcc: nvptx: Support '--with-multilib-list'.
* config/nvptx/gen-multilib-matches.sh: Adjust.
* configure.ac: Likewise.
* configure: Regenerate.
* doc/install.texi: Update.
* doc/invoke.texi: Align.
* config/nvptx/gen-multilib-matches-tests: Extend.
---
gcc/config.gcc | 69 +++++++++--
gcc/config/nvptx/gen-multilib-matches-tests | 121 +++++++++++++++++++-
gcc/config/nvptx/gen-multilib-matches.sh | 29 ++++-
gcc/configure | 4 +-
gcc/configure.ac | 2 +-
gcc/doc/install.texi | 42 ++++++-
gcc/doc/invoke.texi | 10 +-
7 files changed, 242 insertions(+), 35 deletions(-)
@@ -5595,21 +5595,70 @@ case "${target}" in
;;
nvptx-*)
supported_defaults=arch
- TM_MULTILIB_CONFIG=$with_arch
- #TODO 'sm_[...]' list per 'nvptx-sm.def'.
- case $with_arch in
- sm_30 )
- # OK; default.
+
+ nvptx_multilibs_default=sm_30
+
+ case "x${with_multilib_list}" in
+ x | xno)
+ nvptx_multilibs=
+ ;;
+ xdefault | xyes)
+ nvptx_multilibs=default
+ ;;
+ *)
+ nvptx_multilibs=$with_multilib_list
+ ;;
+ esac
+ nvptx_multilibs=`echo $nvptx_multilibs | sed -e 's/,/ /g'`
+ # Expand 'default'.
+ nvptx_multilibs_expanded=
+ for nvptx_multilib in $nvptx_multilibs; do
+ case $nvptx_multilib in
+ default )
+ nvptx_multilibs_expanded="$nvptx_multilibs_expanded $nvptx_multilibs_default"
+ ;;
+ * )
+ nvptx_multilibs_expanded="$nvptx_multilibs_expanded $nvptx_multilib"
;;
- sm_35 | sm_53 | sm_70 | sm_75 | sm_80 )
- # OK, but we'd like 'sm_30', too.
- TM_MULTILIB_CONFIG="$TM_MULTILIB_CONFIG sm_30"
+ esac
+ done
+ # The '--with-arch=[...]' one comes first.
+ nvptx_multilibs=$with_arch$nvptx_multilibs_expanded
+ # Filter out any duplicates.
+ nvptx_multilibs_filtered=
+ for nvptx_multilib in $nvptx_multilibs; do
+ case " $nvptx_multilibs_filtered " in
+ *" $nvptx_multilib "* )
+ :
+ ;;
+ * )
+ nvptx_multilibs_filtered="$nvptx_multilibs_filtered $nvptx_multilib"
+ ;;
+ esac
+ done
+ nvptx_multilibs=$nvptx_multilibs_filtered
+ # Verify, and build 'TM_MULTILIB_CONFIG'.
+ TM_MULTILIB_CONFIG=
+ for nvptx_multilib in $nvptx_multilibs; do
+ case $nvptx_multilib in
+ #TODO 'sm_[...]' list per 'nvptx-sm.def'.
+ sm_30 | sm_35 \
+ | sm_53 \
+ | sm_70 | sm_75 \
+ | sm_80 )
+ TM_MULTILIB_CONFIG="$TM_MULTILIB_CONFIG $nvptx_multilib"
+ ;;
+ $with_arch )
+ echo "Unknown arch used in --with-arch=$nvptx_multilib" 1>&2
+ exit 1
;;
* )
- echo "Unknown arch used in --with-arch=$with_arch" 1>&2
+ echo "Unknown arch used in --with-multilib-list: $nvptx_multilib" 1>&2
exit 1
;;
- esac
+ esac
+ done
+ TM_MULTILIB_CONFIG=`echo $TM_MULTILIB_CONFIG | sed 's/^ //'`
;;
powerpc*-*-* | rs6000-*-*)
@@ -10,7 +10,7 @@
# 'CMMC': compute "multilib matches" per the current settings, and compare to the expected.
-BEGIN '--with-arch=sm_30'
+BEGIN '--with-arch=sm_30', '--with-multilib-list=sm_30'
SMOID sm_30
SMOIL sm_30
AEMM .=misa?sm_30
@@ -21,8 +21,35 @@ AEMM .=misa?sm_75
AEMM .=misa?sm_80
CMMC
+BEGIN '--with-arch=sm_30', '--with-multilib-list=sm_30,sm_80'
+SMOID sm_30
+SMOIL sm_30 sm_80
+AEMM .=misa?sm_30
+AEMM .=misa?sm_35
+AEMM .=misa?sm_53
+AEMM .=misa?sm_70
+AEMM .=misa?sm_75
+CMMC
+
+BEGIN '--with-arch=sm_30', '--with-multilib-list=sm_30,sm_35,sm_53,sm_70,sm_75,sm_80'
+SMOID sm_30
+SMOIL sm_30 sm_35 sm_53 sm_70 sm_75 sm_80
+AEMM .=misa?sm_30
+CMMC
+
+
+BEGIN '--with-arch=sm_35', '--with-multilib-list=sm_35'
+SMOID sm_35
+SMOIL sm_35
+AEMM .=misa?sm_30
+AEMM .=misa?sm_35
+AEMM .=misa?sm_53
+AEMM .=misa?sm_70
+AEMM .=misa?sm_75
+AEMM .=misa?sm_80
+CMMC
-BEGIN '--with-arch=sm_35'
+BEGIN '--with-arch=sm_35', '--with-multilib-list=sm_35,sm_30'
SMOID sm_35
SMOIL sm_35 sm_30
AEMM .=misa?sm_35
@@ -33,7 +60,7 @@ AEMM .=misa?sm_80
CMMC
-BEGIN '--with-arch=sm_53'
+BEGIN '--with-arch=sm_53', '--with-multilib-list=sm_53,sm_30'
SMOID sm_53
SMOIL sm_53 sm_30
AEMM misa?sm_30=misa?sm_35
@@ -43,8 +70,25 @@ AEMM .=misa?sm_75
AEMM .=misa?sm_80
CMMC
+BEGIN '--with-arch=sm_53', '--with-multilib-list=sm_53,sm_30,sm_35,sm_70,sm_75,sm_80'
+SMOID sm_53
+SMOIL sm_53 sm_30 sm_35 sm_70 sm_75 sm_80
+AEMM .=misa?sm_53
+CMMC
+
-BEGIN '--with-arch=sm_70'
+BEGIN '--with-arch=sm_70', '--with-multilib-list=sm_70'
+SMOID sm_70
+SMOIL sm_70
+AEMM .=misa?sm_30
+AEMM .=misa?sm_35
+AEMM .=misa?sm_53
+AEMM .=misa?sm_70
+AEMM .=misa?sm_75
+AEMM .=misa?sm_80
+CMMC
+
+BEGIN '--with-arch=sm_70', '--with-multilib-list=sm_70,sm_30'
SMOID sm_70
SMOIL sm_70 sm_30
AEMM misa?sm_30=misa?sm_35
@@ -54,8 +98,27 @@ AEMM .=misa?sm_75
AEMM .=misa?sm_80
CMMC
+BEGIN '--with-arch=sm_70', '--with-multilib-list=sm_70,sm_53'
+SMOID sm_70
+SMOIL sm_70 sm_53
+AEMM misa?sm_53=misa?sm_30
+AEMM misa?sm_53=misa?sm_35
+AEMM .=misa?sm_70
+AEMM .=misa?sm_75
+AEMM .=misa?sm_80
+CMMC
+
+BEGIN '--with-arch=sm_70', '--with-multilib-list=sm_70,sm_53,sm_30'
+SMOID sm_70
+SMOIL sm_70 sm_53 sm_30
+AEMM misa?sm_30=misa?sm_35
+AEMM .=misa?sm_70
+AEMM .=misa?sm_75
+AEMM .=misa?sm_80
+CMMC
-BEGIN '--with-arch=sm_75'
+
+BEGIN '--with-arch=sm_75', '--with-multilib-list=sm_75,sm_30'
SMOID sm_75
SMOIL sm_75 sm_30
AEMM misa?sm_30=misa?sm_35
@@ -65,8 +128,38 @@ AEMM .=misa?sm_75
AEMM .=misa?sm_80
CMMC
+BEGIN '--with-arch=sm_75', '--with-multilib-list=sm_75,sm_53'
+SMOID sm_75
+SMOIL sm_75 sm_53
+AEMM misa?sm_53=misa?sm_30
+AEMM misa?sm_53=misa?sm_35
+AEMM misa?sm_53=misa?sm_70
+AEMM .=misa?sm_75
+AEMM .=misa?sm_80
+CMMC
+
+BEGIN '--with-arch=sm_75', '--with-multilib-list=sm_75,sm_30,sm_53'
+SMOID sm_75
+SMOIL sm_75 sm_30 sm_53
+AEMM misa?sm_30=misa?sm_35
+AEMM misa?sm_53=misa?sm_70
+AEMM .=misa?sm_75
+AEMM .=misa?sm_80
+CMMC
-BEGIN '--with-arch=sm_80'
+
+BEGIN '--with-arch=sm_80', '--with-multilib-list=sm_80'
+SMOID sm_80
+SMOIL sm_80
+AEMM .=misa?sm_30
+AEMM .=misa?sm_35
+AEMM .=misa?sm_53
+AEMM .=misa?sm_70
+AEMM .=misa?sm_75
+AEMM .=misa?sm_80
+CMMC
+
+BEGIN '--with-arch=sm_80', '--with-multilib-list=sm_80,sm_30'
SMOID sm_80
SMOIL sm_80 sm_30
AEMM misa?sm_30=misa?sm_35
@@ -75,3 +168,19 @@ AEMM misa?sm_30=misa?sm_70
AEMM misa?sm_30=misa?sm_75
AEMM .=misa?sm_80
CMMC
+
+BEGIN '--with-arch=sm_80', '--with-multilib-list=sm_80,sm_75'
+SMOID sm_80
+SMOIL sm_80 sm_75
+AEMM misa?sm_75=misa?sm_30
+AEMM misa?sm_75=misa?sm_35
+AEMM misa?sm_75=misa?sm_53
+AEMM misa?sm_75=misa?sm_70
+AEMM .=misa?sm_80
+CMMC
+
+BEGIN '--with-arch=sm_80', '--with-multilib-list=sm_80,sm_30,sm_35,sm_53,sm_70,sm_75'
+SMOID sm_80
+SMOIL sm_80 sm_30 sm_35 sm_53 sm_70 sm_75
+AEMM .=misa?sm_80
+CMMC
@@ -34,8 +34,17 @@ sms=$(grep ^NVPTX_SM $nvptx_sm_def | sed 's/.*(//;s/,.*//')
# Every variant in 'sms' has to either be remapped to the default variant
# ('.', which is always built), or does get built as non-default variant
-# ('misa=sm_SM'; thus not remapped), or has to be remapped to the "next lower"
-# variant that does get built.
+# ('misa=sm_SM'; thus not remapped), or gets remapped to a suitable variant,
+# typically the "next lower" one that does get built. If no "next lower" one
+# does get built, then remap to the "lowest" one that does get built. This
+# increases chances that the linked code is compatible with more GPU hardware
+# (backward compatibility). For example, for GCC built '--with-arch=sm_80',
+# '--with-multilib-list=sm_53', only 'sm_53' and 'sm_80' target libraries get
+# built. If now requesting a '-march=[...]' where no corresponding or "next
+# lower" variant of the target libraries have been built, GCC's default
+# behavior is to link in the default variant, 'sm_80'. However, if compiling
+# user code with '-march=sm_35', for example, linking in the 'sm_53' variant is
+# supposedly more useful in terms of compatibility with GPU hardware.
print_multilib_matches() {
local sms
@@ -52,8 +61,18 @@ print_multilib_matches() {
local multilib_matches
multilib_matches=
+ # Determine the "lowest" variant that does get built.
local sm_next_lower
- unset sm_next_lower
+ sm_next_lower=.
+ local sm
+ for sm in $sms; do
+ if [ x"sm_$sm" = x"$multilib_options_isa_default" ]; then
+ continue
+ elif expr " $multilib_options_isa_list " : ".* sm_$sm " > /dev/null; then
+ sm_next_lower=$sm
+ break
+ fi
+ done
local sm
for sm in $sms; do
@@ -64,9 +83,7 @@ print_multilib_matches() {
elif expr " $multilib_options_isa_list " : ".* sm_$sm " > /dev/null; then
sm_map=
else
- # Assert here that a "next lower" variant is available; the
- # "lowest" variant always does get built.
- sm_map=${sm_next_lower?}
+ sm_map=$sm_next_lower
fi
if [ x"${sm_map?}" = x ]; then
@@ -1883,8 +1883,8 @@ Optional Packages:
Root for documentation URLs
--with-changes-root-url=URL
Root for GCC changes URLs
- --with-multilib-list select multilibs (AArch64, ARM, AVR, OR1K, RISC-V,
- SH and x86-64 only)
+ --with-multilib-list select multilibs (AArch64, ARM, AVR, nvptx, OR1K,
+ RISC-V, SH and x86-64 only)
--with-multilib-generator
Multi-libs configuration string (RISC-V only)
--with-zstd=PATH specify prefix directory for installed zstd library.
@@ -1218,7 +1218,7 @@ if test "x$enable_offload_defaulted" = xyes; then
fi
AC_ARG_WITH(multilib-list,
-[AS_HELP_STRING([--with-multilib-list], [select multilibs (AArch64, ARM, AVR, OR1K, RISC-V, SH and x86-64 only)])],
+[AS_HELP_STRING([--with-multilib-list], [select multilibs (AArch64, ARM, AVR, nvptx, OR1K, RISC-V, SH and x86-64 only)])],
:,
with_multilib_list=default)
@@ -1275,13 +1275,13 @@ sysv, aix.
@end table
-@item --with-multilib-list=@var{list}
+@item @anchor{with-multilib-list}--with-multilib-list=@var{list}
@itemx --without-multilib-list
Specify what multilibs to build. @var{list} is a comma separated list of
values, possibly consisting of a single value. Currently only implemented
-for aarch64*-*-*, amdgcn*-*-*, arm*-*-*, loongarch*-*-*, riscv*-*-*, sh*-*-*
-and x86-64-*-linux*. The accepted values and meaning for each target is given
-below.
+for aarch64*-*-*, amdgcn*-*-*, arm*-*-*, loongarch*-*-*, nvptx-*, riscv*-*-*,
+sh*-*-* and x86-64-*-linux*.
+The accepted values and meaning for each target is given below.
@table @code
@item aarch64*-*-*
@@ -1407,6 +1407,28 @@ If @var{list} is empty or @code{default}, or if @option{--with-multilib-list}
is not specified, then only the default variant of the libraries are built,
where the default ABI is implied by the configured target triplet.
+@item nvptx-*
+The target libraries corresponding to the default value of the
+@option{-march} option are always built,
+@ifnothtml
+@pxref{nvptx-x-none,,host/target specific installation notes}.
+@end ifnothtml
+@ifhtml
+see
+@uref{specific.html#nvptx-x-none,,host/target specific installation notes}.
+@end ifhtml
+If @var{list} is empty, @samp{no}, or @option{--without-multilib-list}
+is specified, then no additional multilibs are built.
+Otherwise, @var{list} is a comma separated list specifying which
+multilibs to build.
+List items are either @samp{sm_SM}, or @samp{default}, which is a
+placeholder specifying a default set of multilibs: @samp{sm_30}.
+Any duplicates are filtered out.
+If @option{--with-multilib-list} is not specified, then
+@option{--with-multilib-list=default} is assumed.
+For @samp{sm_30}, @samp{sm_35} target libraries, @option{-mptx-3.1}
+sub-variants are additionally built.
+
@item riscv*-*-*
@var{list} is a single ABI name. The target architecture must be either
@code{rv32gc} or @code{rv64gc}. This will build a single multilib for the
@@ -4609,8 +4631,16 @@ corresponding target libraries.
The default is @option{--with-arch=sm_30}.
For example, if @option{--with-arch=sm_70} is specified,
-@option{-march=sm_30} and @option{-march=sm_70} target libraries are
-built, and code generation defaults to @option{-march=sm_70}.
+code generation defaults to @option{-march=sm_70} and
+corresponding target libraries are built, in addition to those
+mandated by @option{--with-multilib-list}, if any,
+@ifnothtml
+@pxref{with-multilib-list,,@option{--with-multilib-list}}.
+@end ifnothtml
+@ifhtml
+see
+@uref{configure.html#with-multilib-list,,@option{--with-multilib-list}}.
+@end ifhtml
@html
<hr />
@@ -30044,10 +30044,12 @@ supported.
@opindex march
@item -march=@var{architecture-string}
-Generate code for the specified PTX ISA target architecture
-(e.g.@: @samp{sm_35}). Valid architecture strings are @samp{sm_30},
-@samp{sm_35}, @samp{sm_53}, @samp{sm_70}, @samp{sm_75} and
-@samp{sm_80}.
+Generate code for the specified PTX ISA target architecture.
+Valid architecture strings are
+@samp{sm_30}, @samp{sm_35},
+@samp{sm_53},
+@samp{sm_70}, @samp{sm_75},
+and @samp{sm_80}.
The default depends on how the compiler has been configured, see
@option{--with-arch}.
--
2.34.1