From aa84ec8415bd413b693e5ea0610e98f3b6216ad5 Mon Sep 17 00:00:00 2001 From: Andrew Stubbs Date: Fri, 22 Nov 2019 14:42:49 +0000 Subject: [PATCH] Use GFX9 granulated sgprs count correctly. 2019-11-22 Andrew Stubbs gcc/ * config/gcn/gcn.c (gcn_hsa_declare_function_name): Calculate granulated_sgprs according to architecture. From-SVN: r278617 --- gcc/ChangeLog | 5 +++++ gcc/config/gcn/gcn.c | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 62ddef2dd31..2512838bc3e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2019-11-22 Andrew Stubbs + + * config/gcn/gcn.c (gcn_hsa_declare_function_name): Calculate + granulated_sgprs according to architecture. + 2019-11-22 Jan Hubicka * ggc-page.c (ggc_collect): Call memory_block_pool::trim. diff --git a/gcc/config/gcn/gcn.c b/gcc/config/gcn/gcn.c index 26c1067e52a..3a8c10ed8b4 100644 --- a/gcc/config/gcn/gcn.c +++ b/gcc/config/gcn/gcn.c @@ -4922,6 +4922,14 @@ gcn_hsa_declare_function_name (FILE *file, const char *name, tree) sgpr = MAX_NORMAL_SGPR_COUNT - extra_regs; } + /* GFX8 allocates SGPRs in blocks of 8. + GFX9 uses blocks of 16. */ + int granulated_sgprs; + if (TARGET_GCN3) + granulated_sgprs = (sgpr + extra_regs + 7) / 8 - 1; + else if (TARGET_GCN5) + granulated_sgprs = 2 * ((sgpr + extra_regs + 15) / 16 - 1); + fputs ("\t.align\t256\n", file); fputs ("\t.type\t", file); assemble_name (file, name); @@ -4960,7 +4968,7 @@ gcn_hsa_declare_function_name (FILE *file, const char *name, tree) "\t\tcompute_pgm_rsrc2_excp_en = 0\n", (vgpr - 1) / 4, /* Must match wavefront_sgpr_count */ - (sgpr + extra_regs + 7) / 8 - 1, + granulated_sgprs, /* The total number of SGPR user data registers requested. This number must match the number of user data registers enabled. */ cfun->machine->args.nsgprs); -- 2.30.2