[amdgcn] Update lower bounds for the number of registers in non-leaf kernels
authorKwok Cheung Yeung <kcy@codesourcery.com>
Fri, 15 Nov 2019 16:32:29 +0000 (16:32 +0000)
committerKwok Cheung Yeung <kcy@gcc.gnu.org>
Fri, 15 Nov 2019 16:32:29 +0000 (16:32 +0000)
Reduce the lower limits on the number of registers requested by non-leaf
kernels to help improve CU occupancy.

2019-11-15  Kwok Cheung Yeung  <kcy@codesourcery.com>

gcc/
* config/gcn/gcn.c (MAX_NORMAL_SGPR_COUNT, MAX_NORMAL_VGPR_COUNT): New.
(gcn_conditional_register_usage): Use constants in place of hard-coded
values.
(gcn_hsa_declare_function_name): Set lower bound for number of
SGPRs/VGPRs in non-leaf kernels to MAX_NORMAL_SGPR_COUNT and
MAX_NORMAL_VGPR_COUNT.

From-SVN: r278305

gcc/ChangeLog
gcc/config/gcn/gcn.c

index ef4f77ee010d5aba361efb3c391e578070832686..8c06b824d62ffe20ed4045b9a175936992138017 100644 (file)
@@ -1,3 +1,12 @@
+2019-11-15  Kwok Cheung Yeung  <kcy@codesourcery.com>
+
+       * config/gcn/gcn.c (MAX_NORMAL_SGPR_COUNT, MAX_NORMAL_VGPR_COUNT): New.
+       (gcn_conditional_register_usage): Use constants in place of hard-coded
+       values.
+       (gcn_hsa_declare_function_name): Set lower bound for number of
+       SGPRs/VGPRs in non-leaf kernels to MAX_NORMAL_SGPR_COUNT and
+       MAX_NORMAL_VGPR_COUNT.
+
 2019-11-15  Martin Jambor  <mjambor@suse.cz>
 
        * ipa-utils.h (ipa_remove_useless_jump_functions): Remove stray
index 383e0aa2c5489b7c7cf3c092faaf977b59d253dd..4401896d4411e0b6ebad6a869ffbea1ede695511 100644 (file)
@@ -75,6 +75,12 @@ int gcn_isa = 3;             /* Default to GCN3.  */
 
 #define LDS_SIZE 65536
 
+/* The number of registers usable by normal non-kernel functions.
+   The SGPR count includes any special extra registers such as VCC.  */
+
+#define MAX_NORMAL_SGPR_COUNT  64
+#define MAX_NORMAL_VGPR_COUNT  24
+
 /* }}}  */
 /* {{{ Initialization and options.  */
 
@@ -2053,10 +2059,12 @@ gcn_conditional_register_usage (void)
   if (cfun->machine->normal_function)
     {
       /* Restrict the set of SGPRs and VGPRs used by non-kernel functions.  */
-      for (int i = SGPR_REGNO (62); i <= LAST_SGPR_REG; i++)
+      for (int i = SGPR_REGNO (MAX_NORMAL_SGPR_COUNT - 2);
+          i <= LAST_SGPR_REG; i++)
        fixed_regs[i] = 1, call_used_regs[i] = 1;
 
-      for (int i = VGPR_REGNO (24); i <= LAST_VGPR_REG; i++)
+      for (int i = VGPR_REGNO (MAX_NORMAL_VGPR_COUNT);
+          i <= LAST_VGPR_REG; i++)
        fixed_regs[i] = 1, call_used_regs[i] = 1;
 
       return;
@@ -4908,10 +4916,10 @@ gcn_hsa_declare_function_name (FILE *file, const char *name, tree)
   if (!leaf_function_p ())
     {
       /* We can't know how many registers function calls might use.  */
-      if (vgpr < 64)
-       vgpr = 64;
-      if (sgpr + extra_regs < 102)
-       sgpr = 102 - extra_regs;
+      if (vgpr < MAX_NORMAL_VGPR_COUNT)
+       vgpr = MAX_NORMAL_VGPR_COUNT;
+      if (sgpr + extra_regs < MAX_NORMAL_SGPR_COUNT)
+       sgpr = MAX_NORMAL_SGPR_COUNT - extra_regs;
     }
 
   fputs ("\t.align\t256\n", file);