[og7] Backport PR74048 and PR81352 nvptx fixes

Message ID e10f6340-ea56-f897-b16f-03c81500c4b3@codesourcery.com
State New
Headers show
Series
  • [og7] Backport PR74048 and PR81352 nvptx fixes
Related show

Commit Message

Cesar Philippidis March 12, 2018, 9:14 p.m.
I've applied this patch to openacc-gcc-7-branch which backports Tom's
nvptx bug fixes for PR74048 and PR81352. For some reason, I thought the
test case for pr84028 was triggering a new PTX JIT bug. But it turned
out to be failing because og7 is more verbose than trunk when it detects
unused parallelism (in this case, num_workers was being set but there
was no worker partitioned loop). That problem went away with an extra
dg-warning line.

Cesar

Patch

2018-03-12  Cesar Philippidis  <cesar@codesourcery.com>

	Backport from trunk:
	2018-01-25  Tom de Vries  <tom@codesourcery.com>

	PR target/84028
	gcc/
	* config/nvptx/nvptx.c (nvptx_single): Add exit insn after noreturn call
	for neutered workers.
        * testsuite/libgomp.oacc-fortran/pr84028.f90: New test.

	2018-01-24  Tom de Vries  <tom@codesourcery.com>

	PR target/81352
	gcc/
        * config/nvptx/nvptx.c (nvptx_single): Add exit insn after noreturn call
	for neutered threads in warp.
	* config/nvptx/nvptx.md (define_insn "exit"): New insn.
	* testsuite/libgomp.oacc-fortran/pr81352.f90: New test.


diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c
index efc6161a6b0..070d236fa87 100644
--- a/gcc/config/nvptx/nvptx.c
+++ b/gcc/config/nvptx/nvptx.c
@@ -4128,7 +4128,12 @@  nvptx_single (unsigned mask, basic_block from, basic_block to)
 	if (tail_branch)
 	  before = emit_label_before (label, before);
 	else
-	  emit_label_after (label, tail);
+	  {
+	    rtx_insn *label_insn = emit_label_after (label, tail);
+	    if ((mode == GOMP_DIM_VECTOR || mode == GOMP_DIM_WORKER)
+		&& CALL_P (tail) && find_reg_note (tail, REG_NORETURN, NULL))
+	      emit_insn_after (gen_exit (), label_insn);
+	  }
       }
 
   /* Now deal with propagating the branch condition.  */
diff --git a/gcc/config/nvptx/nvptx.md b/gcc/config/nvptx/nvptx.md
index ac7b7cc8440..2b4bcb3a45b 100644
--- a/gcc/config/nvptx/nvptx.md
+++ b/gcc/config/nvptx/nvptx.md
@@ -972,6 +972,11 @@ 
   ""
   "")
 
+(define_insn "exit"
+  [(const_int 1)]
+  ""
+  "exit;")
+
 (define_insn "return"
   [(return)]
   ""
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/pr81352.f90 b/libgomp/testsuite/libgomp.oacc-fortran/pr81352.f90
new file mode 100644
index 00000000000..f6969c8595d
--- /dev/null
+++ b/libgomp/testsuite/libgomp.oacc-fortran/pr81352.f90
@@ -0,0 +1,20 @@ 
+! { dg-do run }
+
+program foo
+  integer :: a(3,3), l, ll
+  a = 0
+
+  !$acc parallel num_gangs (1) num_workers(1)
+
+  do l=1,3
+     !$acc loop vector
+     do ll=1,3
+        a(l,ll) = 2
+     enddo
+  enddo
+
+  if (any(a(1:3,1:3).ne.2)) call abort
+
+  !$acc end parallel
+
+end program foo
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/pr84028.f90 b/libgomp/testsuite/libgomp.oacc-fortran/pr84028.f90
new file mode 100644
index 00000000000..693faa2214f
--- /dev/null
+++ b/libgomp/testsuite/libgomp.oacc-fortran/pr84028.f90
@@ -0,0 +1,25 @@ 
+! { dg-do run }
+
+program foo
+  integer :: a(3,3,3), ll, lll
+
+  a = 1
+
+  !$acc parallel num_gangs(1) num_workers(2) ! { dg-warning "region is worker partitioned" }
+
+  if (any(a(1:3,1:3,1:3).ne.1)) call abort
+
+  do ll=1,3
+
+     !$acc loop vector
+     do lll=1,3
+        a(1,ll,lll) = 2
+     enddo
+
+  enddo
+
+  if (a(1,1,1).ne.2) call abort
+
+  !$acc end parallel
+
+end program foo