[nvptx, PR81352] Add exit insn after noreturn call for neutered threads in warp
authorTom de Vries <tom@codesourcery.com>
Wed, 24 Jan 2018 11:27:10 +0000 (11:27 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Wed, 24 Jan 2018 11:27:10 +0000 (11:27 +0000)
2018-01-24  Tom de Vries  <tom@codesourcery.com>

PR target/81352
* 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.

From-SVN: r257014

gcc/ChangeLog
gcc/config/nvptx/nvptx.c
gcc/config/nvptx/nvptx.md
libgomp/ChangeLog
libgomp/testsuite/libgomp.oacc-fortran/pr81352.f90 [new file with mode: 0644]

index 0e48b861c4fd785ae525aedf2bea6f215e29c177..e4eba86378efe2ac4e2b478a3d9d4efc68363172 100644 (file)
@@ -1,3 +1,10 @@
+2018-01-24  Tom de Vries  <tom@codesourcery.com>
+
+       PR target/81352
+       * 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.
+
 2018-01-24  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/83176
index f5bb438786573f09426b0f3d1b733a737bd3141f..3516740bb194dcea192707621ae324b5f6468eb2 100644 (file)
@@ -4062,7 +4062,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 && CALL_P (tail)
+               && find_reg_note (tail, REG_NORETURN, NULL))
+             emit_insn_after (gen_exit (), label_insn);
+         }
       }
 
   /* Now deal with propagating the branch condition.  */
index f9c087b6d2203168ed59ca020b1b7e3950b25558..135479be1295157285ac98e8d130991f19f0d200 100644 (file)
   ""
   "")
 
+(define_insn "exit"
+  [(const_int 1)]
+  ""
+  "exit;")
+
 (define_insn "return"
   [(return)]
   ""
index c308227951b948161b03f2474a7ee205533ea71a..11cda22e1c34696339a4933a81013933d2d882ae 100644 (file)
@@ -1,3 +1,8 @@
+2018-01-24  Tom de Vries  <tom@codesourcery.com>
+
+       PR target/81352
+       * testsuite/libgomp.oacc-fortran/pr81352.f90: New test.
+
 2018-01-19  Tom de Vries  <tom@codesourcery.com>
            Cesar Philippidis  <cesar@codesourcery.com>
 
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/pr81352.f90 b/libgomp/testsuite/libgomp.oacc-fortran/pr81352.f90
new file mode 100644 (file)
index 0000000..f6969c8
--- /dev/null
@@ -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