[openacc, parloops] Fix SIGSEGV in oacc_entry_exit_ok_1
authorTom de Vries <tdevries@suse.de>
Sun, 16 Jun 2019 07:47:15 +0000 (07:47 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Sun, 16 Jun 2019 07:47:15 +0000 (07:47 +0000)
When compiling the test-case with r268755, we run into a SIGSEGV in
oacc_entry_exit_ok_1 when trying to dereference a NULL red:
...
                      struct reduction_info *red;
                      red = reduction_phi (reduction_list, use_stmt);
                      tree val = PHI_RESULT (red->keep_res);
...

Fix this by handling ref == NULL.

Bootstrapped and reg-tested on x86_64.
Build and reg-tested on x86_64 with nvptx accelerator.

2019-06-16  Tom de Vries  <tdevries@suse.de>

PR tree-optimization/89376
* tree-parloops.c (oacc_entry_exit_ok_1): Handle red == NULL.

* testsuite/libgomp.oacc-c-c++-common/pr89376.c: New test.

From-SVN: r272338

gcc/ChangeLog
gcc/tree-parloops.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.oacc-c-c++-common/pr89376.c [new file with mode: 0644]

index 516ef410ef029235e8862e941f1b3cba1eabb52b..c5b213e1ae80c5436196ec2c3073ae87e5acf9ea 100644 (file)
@@ -1,3 +1,8 @@
+2019-06-16  Tom de Vries  <tdevries@suse.de>
+
+       PR tree-optimization/89376
+       * tree-parloops.c (oacc_entry_exit_ok_1): Handle red == NULL.
+
 2019-06-15  Maya Rashish  <coypu@sdf.org>
 
        * doc/invoke.texi (Spec Files): Update location of the
index 9de154e722f9542ebbe5abaad6da0c63d706ceaf..6b8c8cd5b759cc38001da3f2f9ad3229221c4135 100644 (file)
@@ -3052,11 +3052,11 @@ oacc_entry_exit_ok_1 (bitmap in_loop_bbs, vec<basic_block> region_bbs,
                {
                  use_operand_p use_p;
                  gimple *use_stmt;
+                 struct reduction_info *red;
                  single_imm_use (lhs, &use_p, &use_stmt);
-                 if (gimple_code (use_stmt) == GIMPLE_PHI)
+                 if (gimple_code (use_stmt) == GIMPLE_PHI
+                     && (red = reduction_phi (reduction_list, use_stmt)))
                    {
-                     struct reduction_info *red;
-                     red = reduction_phi (reduction_list, use_stmt);
                      tree val = PHI_RESULT (red->keep_res);
                      if (has_single_use (val))
                        {
index 131a415cb48ee53165770db8993fa6fba1277814..827bab2d89618ffc2c6825060876b4920377dd08 100644 (file)
@@ -1,3 +1,8 @@
+2019-06-16  Tom de Vries  <tdevries@suse.de>
+
+       PR tree-optimization/89376
+       * testsuite/libgomp.oacc-c-c++-common/pr89376.c: New test.
+
 2019-06-15  Tom de Vries  <tdevries@suse.de>
 
        PR tree-optimization/89713
diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/pr89376.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/pr89376.c
new file mode 100644 (file)
index 0000000..7f6c832
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do run } */
+/* { dg-additional-options "-fno-tree-ch -fno-tree-dce -fno-tree-vrp" } */
+
+int
+main (void)
+{
+  int fa;
+
+  #pragma acc kernels
+  for (int rw = 0; rw < 1; ++rw)
+    fa = 0;
+
+  return 0;
+}
+