diff mbox series

[committed,amdgcn] Wait for exit value to write before exiting.

Message ID b1032edf-0bd1-5404-8870-ebff62cd9178@mentor.com
State New
Headers show
Series [committed,amdgcn] Wait for exit value to write before exiting. | expand

Commit Message

Stubbs, Andrew May 24, 2019, 3:31 p.m. UTC
This patch fixes a bug in which GCN5 devices often fail to return an 
exit value because it's not yet been written to memory when the program 
exits. The fix is simply to wait for it properly. GCN3 devices did not 
demonstrate the problem, but it was technically wrong there also. The 
bug was introduced when we stopped waiting for all writes to complete.

I've also taken the opportunity to adjust gcn-run such that a similar 
issue can't go unnoticed for so long, in future.

Andrew Stubbs
Mentor Graphics / CodeSourcery

Comments

Andrew Stubbs June 25, 2019, 9:49 a.m. UTC | #1
On 24/05/2019 16:31, Andrew Stubbs wrote:
> This patch fixes a bug in which GCN5 devices often fail to return an 
> exit value because it's not yet been written to memory when the program 
> exits. The fix is simply to wait for it properly. GCN3 devices did not 
> demonstrate the problem, but it was technically wrong there also. The 
> bug was introduced when we stopped waiting for all writes to complete.
> 
> I've also taken the opportunity to adjust gcn-run such that a similar 
> issue can't go unnoticed for so long, in future.

Now backported to gcc-9-branch.

Andrew
diff mbox series

Patch

GCN: Wait for exit value to write before exiting.

2019-05-24  Andrew Stubbs  <ams@codesourcery.com>

	gcc/
	* config/gcn/gcn-run.c (main): Set a non-zero return value if the
	kernel does not exit cleanly.
	* config/gcn/gcn.md (gcn_return): Insert s_waitcnt before s_dcache_wb.

diff --git a/gcc/config/gcn/gcn-run.c b/gcc/config/gcn/gcn-run.c
index 84718f42846..21852d78bc5 100644
--- a/gcc/config/gcn/gcn-run.c
+++ b/gcc/config/gcn/gcn-run.c
@@ -853,7 +853,10 @@  main (int argc, char *argv[])
 
   unsigned int upper = (return_value & ~0xffff) >> 16;
   if (upper == 0xcafe)
-    printf ("Kernel exit value was never set\n");
+    {
+      printf ("Kernel exit value was never set\n");
+      return_value = 0xff;
+    }
   else if (upper == 0xffff)
     ; /* Set by exit.  */
   else if (upper == 0)
diff --git a/gcc/config/gcn/gcn.md b/gcc/config/gcn/gcn.md
index 2b805a73c56..1f06d0bd5cc 100644
--- a/gcc/config/gcn/gcn.md
+++ b/gcc/config/gcn/gcn.md
@@ -784,10 +784,10 @@ 
     if (cfun && cfun->machine && cfun->machine->normal_function)
       return "s_setpc_b64\ts[18:19]";
     else
-      return "s_dcache_wb\;s_endpgm";
+      return "s_waitcnt\tlgkmcnt(0)\;s_dcache_wb\;s_endpgm";
   }
   [(set_attr "type" "sop1")
-   (set_attr "length" "8")])
+   (set_attr "length" "12")])
 
 (define_expand "call"
   [(parallel [(call (match_operand 0 "")