[PATCH 4/5] [amdgcn] Update lower limits requested by non-leaf kernels

Kwok Cheung Yeung kcy@codesourcery.com
Thu Nov 14 15:34:00 GMT 2019


The kernel attributes are changed to request at least 64 SGPRs and 24 
VGPRs (i.e. the non-kernel maximum, otherwise the callees may not have 
enough registers to run in) for non-leaf kernels to take advantage of 
the reduced number of registers used in non-kernel functions.

Okay for trunk?

Kwok


2019-11-14  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.
---
  gcc/config/gcn/gcn.c | 20 ++++++++++++++------
  1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/gcc/config/gcn/gcn.c b/gcc/config/gcn/gcn.c
index 8a2f7d7..976843b 100644
--- a/gcc/config/gcn/gcn.c
+++ b/gcc/config/gcn/gcn.c
@@ -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.  */

@@ -2049,10 +2055,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;
@@ -4905,10 +4913,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);
-- 
2.8.1



More information about the Gcc-patches mailing list