re PR debug/87039 (DW_OP_fbreg used without a frame base on a C++ code w/ -fopenmp)
authorJakub Jelinek <jakub@redhat.com>
Mon, 19 Nov 2018 13:44:13 +0000 (14:44 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 19 Nov 2018 13:44:13 +0000 (14:44 +0100)
PR debug/87039
* omp-expand.c: Don't include debug.h.
(adjust_context_and_scope): Add REGION argument.  Find DECL_CONTEXT
from innermost outer parallel, task, teams or target that has a
child_fn set, or, if there is no such outer region, use
current_function_decl.  Do the DECL_CONTEXT adjustment regardless of
whether a suitable BLOCK is found or not.
(expand_parallel_call, expand_teams_call): Don't call
adjust_context_and_scope here.
(grid_expand_target_grid_body): Revert 2017-01-25 changes.
(expand_omp_taskreg, expand_omp_target): Likewise.  Call
adjust_context_and_scope.
* dwarf2out.c (dwarf2out_early_global_decl): For
decl_function_context recurse instead of calling dwarf2out_decl.

* g++.dg/gomp/pr78363-4.C: New test.
* g++.dg/gomp/pr78363-5.C: New test.
* g++.dg/gomp/pr78363-6.C: New test.
* g++.dg/gomp/pr78363-7.C: New test.

From-SVN: r266272

gcc/ChangeLog
gcc/dwarf2out.c
gcc/omp-expand.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/gomp/pr78363-4.C [new file with mode: 0644]
gcc/testsuite/g++.dg/gomp/pr78363-5.C [new file with mode: 0644]
gcc/testsuite/g++.dg/gomp/pr78363-6.C [new file with mode: 0644]
gcc/testsuite/g++.dg/gomp/pr78363-7.C [new file with mode: 0644]

index 9cd89fb941be5a0f38fcf73cabbbf7381c8fa9bd..dab887463498ced51c269b08b4f8350d30d5ea7d 100644 (file)
@@ -1,3 +1,20 @@
+2018-11-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/87039
+       * omp-expand.c: Don't include debug.h.
+       (adjust_context_and_scope): Add REGION argument.  Find DECL_CONTEXT
+       from innermost outer parallel, task, teams or target that has a
+       child_fn set, or, if there is no such outer region, use
+       current_function_decl.  Do the DECL_CONTEXT adjustment regardless of
+       whether a suitable BLOCK is found or not.
+       (expand_parallel_call, expand_teams_call): Don't call
+       adjust_context_and_scope here.
+       (grid_expand_target_grid_body): Revert 2017-01-25 changes.
+       (expand_omp_taskreg, expand_omp_target): Likewise.  Call
+       adjust_context_and_scope.
+       * dwarf2out.c (dwarf2out_early_global_decl): For
+       decl_function_context recurse instead of calling dwarf2out_decl.
+
 2018-11-19  Richard Biener  <rguenther@suse.de>
 
        PR lto/87229
index d2bea2770fd50496ea1ebe22cefe8c1d0ee1d23b..9933650e33be2d12d18b58a2729603983570b5a3 100644 (file)
@@ -26403,7 +26403,7 @@ dwarf2out_early_global_decl (tree decl)
                 enough so that it lands in its own context.  This avoids type
                 pruning issues later on.  */
              if (context_die == NULL || is_declaration_die (context_die))
-               dwarf2out_decl (context);
+               dwarf2out_early_global_decl (context);
            }
 
          /* Emit an abstract origin of a function first.  This happens
index 2361520e60b73765c0c4ed0564b9159744d4750c..76c09c5883b758d0348a510a7c49feef9deca03d 100644 (file)
@@ -56,7 +56,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "gomp-constants.h"
 #include "gimple-pretty-print.h"
 #include "hsa-common.h"
-#include "debug.h"
 #include "stringpool.h"
 #include "attribs.h"
 
@@ -517,27 +516,44 @@ parallel_needs_hsa_kernel_p (struct omp_region *region)
    function will be emitted with the correct lexical scope.  */
 
 static void
-adjust_context_and_scope (tree entry_block, tree child_fndecl)
+adjust_context_and_scope (struct omp_region *region, tree entry_block,
+                         tree child_fndecl)
 {
+  tree parent_fndecl = NULL_TREE;
+  gimple *entry_stmt;
+  /* OMP expansion expands inner regions before outer ones, so if
+     we e.g. have explicit task region nested in parallel region, when
+     expanding the task region current_function_decl will be the original
+     source function, but we actually want to use as context the child
+     function of the parallel.  */
+  for (region = region->outer;
+       region && parent_fndecl == NULL_TREE; region = region->outer)
+    switch (region->type)
+      {
+      case GIMPLE_OMP_PARALLEL:
+      case GIMPLE_OMP_TASK:
+      case GIMPLE_OMP_TEAMS:
+       entry_stmt = last_stmt (region->entry);
+       parent_fndecl = gimple_omp_taskreg_child_fn (entry_stmt);
+       break;
+      case GIMPLE_OMP_TARGET:
+       entry_stmt = last_stmt (region->entry);
+       parent_fndecl
+         = gimple_omp_target_child_fn (as_a <gomp_target *> (entry_stmt));
+       break;
+      default:
+       break;
+      }
+
+  if (parent_fndecl == NULL_TREE)
+    parent_fndecl = current_function_decl;
+  DECL_CONTEXT (child_fndecl) = parent_fndecl;
+
   if (entry_block != NULL_TREE && TREE_CODE (entry_block) == BLOCK)
     {
       tree b = BLOCK_SUPERCONTEXT (entry_block);
-
       if (TREE_CODE (b) == BLOCK)
         {
-         tree parent_fndecl;
-
-         /* Follow supercontext chain until the parent fndecl
-            is found.  */
-         for (parent_fndecl = BLOCK_SUPERCONTEXT (b);
-              TREE_CODE (parent_fndecl) == BLOCK;
-              parent_fndecl = BLOCK_SUPERCONTEXT (parent_fndecl))
-           ;
-
-         gcc_assert (TREE_CODE (parent_fndecl) == FUNCTION_DECL);
-
-         DECL_CONTEXT (child_fndecl) = parent_fndecl;
-
          DECL_CHAIN (child_fndecl) = BLOCK_VARS (b);
          BLOCK_VARS (b) = child_fndecl;
        }
@@ -723,8 +739,6 @@ expand_parallel_call (struct omp_region *region, basic_block bb,
   tree child_fndecl = gimple_omp_parallel_child_fn (entry_stmt);
   t2 = build_fold_addr_expr (child_fndecl);
 
-  adjust_context_and_scope (gimple_block (entry_stmt), child_fndecl);
-
   vec_alloc (args, 4 + vec_safe_length (ws_args));
   args->quick_push (t2);
   args->quick_push (t1);
@@ -952,8 +966,6 @@ expand_teams_call (basic_block bb, gomp_teams *entry_stmt)
   tree child_fndecl = gimple_omp_teams_child_fn (entry_stmt);
   tree t2 = build_fold_addr_expr (child_fndecl);
 
-  adjust_context_and_scope (gimple_block (entry_stmt), child_fndecl);
-
   vec<tree, va_gc> *args;
   vec_alloc (args, 5);
   args->quick_push (t2);
@@ -1412,11 +1424,6 @@ expand_omp_taskreg (struct omp_region *region)
       else
        block = gimple_block (entry_stmt);
 
-      /* Make sure to generate early debug for the function before
-         outlining anything.  */
-      if (! gimple_in_ssa_p (cfun))
-       (*debug_hooks->early_global_decl) (cfun->decl);
-
       new_bb = move_sese_region_to_fn (child_cfun, entry_bb, exit_bb, block);
       if (exit_bb)
        single_succ_edge (new_bb)->flags = EDGE_FALLTHRU;
@@ -1497,6 +1504,8 @@ expand_omp_taskreg (struct omp_region *region)
        }
     }
 
+  adjust_context_and_scope (region, gimple_block (entry_stmt), child_fn);
+
   if (gimple_code (entry_stmt) == GIMPLE_OMP_PARALLEL)
     expand_parallel_call (region, new_bb,
                          as_a <gomp_parallel *> (entry_stmt), ws_args);
@@ -7399,11 +7408,6 @@ expand_omp_target (struct omp_region *region)
          gsi_remove (&gsi, true);
        }
 
-      /* Make sure to generate early debug for the function before
-         outlining anything.  */
-      if (! gimple_in_ssa_p (cfun))
-       (*debug_hooks->early_global_decl) (cfun->decl);
-
       /* Move the offloading region into CHILD_CFUN.  */
 
       block = gimple_block (entry_stmt);
@@ -7480,6 +7484,8 @@ expand_omp_target (struct omp_region *region)
          dump_function_header (dump_file, child_fn, dump_flags);
          dump_function_to_file (child_fn, dump_file, dump_flags);
        }
+
+      adjust_context_and_scope (region, gimple_block (entry_stmt), child_fn);
     }
 
   /* Emit a library call to launch the offloading region, or do data
@@ -7977,11 +7983,6 @@ grid_expand_target_grid_body (struct omp_region *target)
   init_tree_ssa (cfun);
   pop_cfun ();
 
-  /* Make sure to generate early debug for the function before
-     outlining anything.  */
-  if (! gimple_in_ssa_p (cfun))
-    (*debug_hooks->early_global_decl) (cfun->decl);
-
   tree old_parm_decl = DECL_ARGUMENTS (kern_fndecl);
   gcc_assert (!DECL_CHAIN (old_parm_decl));
   tree new_parm_decl = copy_node (DECL_ARGUMENTS (kern_fndecl));
index 5fce6a848182dfe50d21c1b52e8a049ecf9a9b85..30fbd325f4963b36b218f35ac6453de9096c4d90 100644 (file)
@@ -1,3 +1,11 @@
+2018-11-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/87039
+       * g++.dg/gomp/pr78363-4.C: New test.
+       * g++.dg/gomp/pr78363-5.C: New test.
+       * g++.dg/gomp/pr78363-6.C: New test.
+       * g++.dg/gomp/pr78363-7.C: New test.
+
 2018-11-19  Richard Biener  <rguenther@suse.de>
 
        PR lto/87229
diff --git a/gcc/testsuite/g++.dg/gomp/pr78363-4.C b/gcc/testsuite/g++.dg/gomp/pr78363-4.C
new file mode 100644 (file)
index 0000000..54d0078
--- /dev/null
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// { dg-require-effective-target c++11 }
+// { dg-additional-options "-g" }
+
+int main()
+{
+  int n = 0;
+
+#pragma omp parallel
+#pragma omp master
+#pragma omp parallel
+#pragma omp master
+#pragma omp parallel for reduction (+: n)
+  for (int i = [](){ return 3; }(); i < 10; ++i)
+    n++;
+
+  return n;
+}
diff --git a/gcc/testsuite/g++.dg/gomp/pr78363-5.C b/gcc/testsuite/g++.dg/gomp/pr78363-5.C
new file mode 100644 (file)
index 0000000..760cc4d
--- /dev/null
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// { dg-require-effective-target c++11 }
+// { dg-additional-options "-g" }
+
+int main()
+{
+  int n = 0;
+#pragma omp task shared(n)
+#pragma omp target map(tofrom:n)
+#pragma omp for reduction (+: n)
+  for (int i = [](){ return 3; }(); i < 10; ++i)
+    n++;
+  if (n != 7)
+    __builtin_abort ();
+#pragma omp taskwait
+  return 0;
+}
diff --git a/gcc/testsuite/g++.dg/gomp/pr78363-6.C b/gcc/testsuite/g++.dg/gomp/pr78363-6.C
new file mode 100644 (file)
index 0000000..e49ef06
--- /dev/null
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// { dg-require-effective-target c++11 }
+// { dg-additional-options "-g" }
+
+int main()
+{
+  int n = 0;
+#pragma omp parallel
+#pragma omp master
+#pragma omp task shared (n)
+  for (int i = [](){ return 3; }(); i < 10; ++i)
+    n = i;
+#pragma omp taskwait
+  if (n != 7)
+    __builtin_abort ();
+}
diff --git a/gcc/testsuite/g++.dg/gomp/pr78363-7.C b/gcc/testsuite/g++.dg/gomp/pr78363-7.C
new file mode 100644 (file)
index 0000000..4a0caee
--- /dev/null
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// { dg-require-effective-target c++11 }
+// { dg-additional-options "-g" }
+
+int main()
+{
+  int n = 0;
+
+#pragma omp target map(tofrom: n)
+#pragma omp parallel for reduction (+: n)
+  for (int i = [](){ return 3; }(); i < 10; ++i)
+    n++;
+
+  return n;
+}