]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
omp-simd-clone: Allow fixed-lane vectors
authorAndrew Stubbs <ams@codesourcery.com>
Fri, 5 Aug 2022 12:28:50 +0000 (13:28 +0100)
committerAndrew Stubbs <ams@codesourcery.com>
Thu, 1 Sep 2022 10:45:58 +0000 (11:45 +0100)
The vecsize_int/vecsize_float has an assumption that all arguments will use
the same bitsize, and vary the number of lanes according to the element size,
but this is inappropriate on targets where the number of lanes is fixed and
the bitsize varies (i.e. amdgcn).

With this change the vecsize can be left zero and the vectorization factor will
be the same for all types.

gcc/ChangeLog:

* doc/tm.texi: Regenerate.
* omp-simd-clone.cc (simd_clone_adjust_return_type): Allow zero
vecsize.
(simd_clone_adjust_argument_types): Likewise.
* target.def (compute_vecsize_and_simdlen): Document the new
vecsize_int and vecsize_float semantics.

(cherry picked from commit f134a25ee8c29646f35f7e466109f6a7f5b9e824)

gcc/ChangeLog.omp
gcc/doc/tm.texi
gcc/omp-simd-clone.cc
gcc/target.def

index f796f73c6a289631080ba4b98a62b21fe55e5f1a..04fdec04baa61c498f9dedd1e703383042328533 100644 (file)
@@ -1,3 +1,13 @@
+2022-09-01  Andrew Stubbs  <ams@codesourcery.com>
+
+       Backport from mainline:
+       * doc/tm.texi: Regenerate.
+       * omp-simd-clone.cc (simd_clone_adjust_return_type): Allow zero
+       vecsize.
+       (simd_clone_adjust_argument_types): Likewise.
+       * target.def (compute_vecsize_and_simdlen): Document the new
+       vecsize_int and vecsize_float semantics.
+
 2022-09-01  Andrew Stubbs  <ams@codesourcery.com>
 
        Backport from mainline:
index 2b2f2e3470a799f90d2060cb0832362b674c7a6c..44ee8bbb17fa0017dc19310934886de364989205 100644 (file)
@@ -6254,6 +6254,9 @@ this target than a sequence of elementwise loads or stores.
 This hook should set @var{vecsize_mangle}, @var{vecsize_int}, @var{vecsize_float}
 fields in @var{simd_clone} structure pointed by @var{clone_info} argument and also
 @var{simdlen} field if it was previously 0.
+@var{vecsize_mangle} is a marker for the backend only. @var{vecsize_int} and
+@var{vecsize_float} should be left zero on targets where the number of lanes is
+not determined by the bitsize (in which case @var{simdlen} is always used).
 The hook should return 0 if SIMD clones shouldn't be emitted,
 or number of @var{vecsize_mangle} variants that should be emitted.
 @end deftypefn
index 6a9351c2102a444a85fbdf8bfea3eff8444922ba..c3ab1834167eec06723d62356194dd32fd5eba7c 100644 (file)
@@ -504,7 +504,10 @@ simd_clone_adjust_return_type (struct cgraph_node *node)
     veclen = node->simdclone->vecsize_int;
   else
     veclen = node->simdclone->vecsize_float;
-  veclen = exact_div (veclen, GET_MODE_BITSIZE (SCALAR_TYPE_MODE (t)));
+  if (known_eq (veclen, 0))
+    veclen = node->simdclone->simdlen;
+  else
+    veclen = exact_div (veclen, GET_MODE_BITSIZE (SCALAR_TYPE_MODE (t)));
   if (multiple_p (veclen, node->simdclone->simdlen))
     veclen = node->simdclone->simdlen;
   if (POINTER_TYPE_P (t))
@@ -618,8 +621,12 @@ simd_clone_adjust_argument_types (struct cgraph_node *node)
            veclen = sc->vecsize_int;
          else
            veclen = sc->vecsize_float;
-         veclen = exact_div (veclen,
-                             GET_MODE_BITSIZE (SCALAR_TYPE_MODE (parm_type)));
+         if (known_eq (veclen, 0))
+           veclen = sc->simdlen;
+         else
+           veclen
+             = exact_div (veclen,
+                          GET_MODE_BITSIZE (SCALAR_TYPE_MODE (parm_type)));
          if (multiple_p (veclen, sc->simdlen))
            veclen = sc->simdlen;
          adj.op = IPA_PARAM_OP_NEW;
@@ -669,8 +676,11 @@ simd_clone_adjust_argument_types (struct cgraph_node *node)
        veclen = sc->vecsize_int;
       else
        veclen = sc->vecsize_float;
-      veclen = exact_div (veclen,
-                         GET_MODE_BITSIZE (SCALAR_TYPE_MODE (base_type)));
+      if (known_eq (veclen, 0))
+       veclen = sc->simdlen;
+      else
+       veclen = exact_div (veclen,
+                           GET_MODE_BITSIZE (SCALAR_TYPE_MODE (base_type)));
       if (multiple_p (veclen, sc->simdlen))
        veclen = sc->simdlen;
       if (sc->mask_mode != VOIDmode)
index 23ffd3fc2c790a6e217480ce05ffb69ecda558ed..d3f3646ba2a6bb7f88088b1dc45ee562d89eea56 100644 (file)
@@ -1629,6 +1629,9 @@ DEFHOOK
 "This hook should set @var{vecsize_mangle}, @var{vecsize_int}, @var{vecsize_float}\n\
 fields in @var{simd_clone} structure pointed by @var{clone_info} argument and also\n\
 @var{simdlen} field if it was previously 0.\n\
+@var{vecsize_mangle} is a marker for the backend only. @var{vecsize_int} and\n\
+@var{vecsize_float} should be left zero on targets where the number of lanes is\n\
+not determined by the bitsize (in which case @var{simdlen} is always used).\n\
 The hook should return 0 if SIMD clones shouldn't be emitted,\n\
 or number of @var{vecsize_mangle} variants that should be emitted.",
 int, (struct cgraph_node *, struct cgraph_simd_clone *, tree, int), NULL)