]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix GOMP/GOACC_parallel optimization in ipa-pta
authorvries <vries@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Feb 2016 08:52:26 +0000 (08:52 +0000)
committervries <vries@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Feb 2016 08:52:26 +0000 (08:52 +0000)
2016-02-09  Tom de Vries  <tom@codesourcery.com>

PR tree-optimization/69599
* tree-ssa-structalias.c (fndecl_maybe_in_other_partition): New
function.
(find_func_aliases_for_builtin_call, find_func_clobbers)
(ipa_pta_execute):  Handle case that foo and foo._0 are not in same lto
partition.

* testsuite/libgomp.c/omp-nested-3.c: New test.
* testsuite/libgomp.c/pr46032-2.c: New test.
* testsuite/libgomp.oacc-c-c++-common/kernels-2.c: New test.
* testsuite/libgomp.oacc-c-c++-common/parallel-2.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233240 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tree-ssa-structalias.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c/omp-nested-3.c [new file with mode: 0644]
libgomp/testsuite/libgomp.c/pr46032-2.c [new file with mode: 0644]
libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-2.c [new file with mode: 0644]
libgomp/testsuite/libgomp.oacc-c-c++-common/parallel-2.c [new file with mode: 0644]

index 27272446b68465ed18a76a88a78246cefee0a651..c4ee0a04f9d8b16808d326f3572d75e2dbb42eaa 100644 (file)
@@ -1,3 +1,12 @@
+2016-02-09  Tom de Vries  <tom@codesourcery.com>
+
+       PR tree-optimization/69599
+       * tree-ssa-structalias.c (fndecl_maybe_in_other_partition): New
+       function.
+       (find_func_aliases_for_builtin_call, find_func_clobbers)
+       (ipa_pta_execute):  Handle case that foo and foo._0 are not in same lto
+       partition.
+
 2016-02-09  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/69715
index e7d07975638fc5472fe4b2ad989e16fcf1e76120..d7a7dc554e4d70862f384651ee4b1da3cc8c279f 100644 (file)
@@ -4162,6 +4162,18 @@ find_func_aliases_for_call_arg (varinfo_t fi, unsigned index, tree arg)
     process_constraint (new_constraint (lhs, *rhsp));
 }
 
+/* Return true if FNDECL may be part of another lto partition.  */
+
+static bool
+fndecl_maybe_in_other_partition (tree fndecl)
+{
+  cgraph_node *fn_node = cgraph_node::get (fndecl);
+  if (fn_node == NULL)
+    return true;
+
+  return fn_node->in_other_partition;
+}
+
 /* Create constraints for the builtin call T.  Return true if the call
    was handled, otherwise false.  */
 
@@ -4537,6 +4549,10 @@ find_func_aliases_for_builtin_call (struct function *fn, gcall *t)
              tree fnarg = gimple_call_arg (t, fnpos);
              gcc_assert (TREE_CODE (fnarg) == ADDR_EXPR);
              tree fndecl = TREE_OPERAND (fnarg, 0);
+             if (fndecl_maybe_in_other_partition (fndecl))
+               /* Fallthru to general call handling.  */
+               break;
+
              tree arg = gimple_call_arg (t, argpos);
 
              varinfo_t fi = get_vi_for_tree (fndecl);
@@ -5113,6 +5129,10 @@ find_func_clobbers (struct function *fn, gimple *origt)
              tree fnarg = gimple_call_arg (t, fnpos);
              gcc_assert (TREE_CODE (fnarg) == ADDR_EXPR);
              tree fndecl = TREE_OPERAND (fnarg, 0);
+             if (fndecl_maybe_in_other_partition (fndecl))
+               /* Fallthru to general call handling.  */
+               break;
+
              varinfo_t cfi = get_vi_for_tree (fndecl);
 
              tree arg = gimple_call_arg (t, argpos);
@@ -7505,9 +7525,13 @@ ipa_pta_execute (void)
         address_taken bit for function foo._0, which would make it non-local.
         But for the purpose of ipa-pta, we can regard the run_on_threads call
         as a local call foo._0 (data),  so we ignore address_taken on nodes
-        with parallelized_function set.  */
-      bool node_address_taken = (node->address_taken
-                                && !node->parallelized_function);
+        with parallelized_function set.
+        Note: this is only safe, if foo and foo._0 are in the same lto
+        partition.  */
+      bool node_address_taken = ((node->parallelized_function
+                                 && !node->used_from_other_partition)
+                                ? false
+                                : node->address_taken);
 
       /* For externally visible or attribute used annotated functions use
         local constraints for their arguments.
@@ -7676,12 +7700,19 @@ ipa_pta_execute (void)
                continue;
 
              /* Handle direct calls to functions with body.  */
-             if (gimple_call_builtin_p (stmt, BUILT_IN_GOMP_PARALLEL))
-               decl = TREE_OPERAND (gimple_call_arg (stmt, 0), 0);
-             else if (gimple_call_builtin_p (stmt, BUILT_IN_GOACC_PARALLEL))
-               decl = TREE_OPERAND (gimple_call_arg (stmt, 1), 0);
-             else
-               decl = gimple_call_fndecl (stmt);
+             decl = gimple_call_fndecl (stmt);
+
+             {
+               tree called_decl = NULL_TREE;
+               if (gimple_call_builtin_p (stmt, BUILT_IN_GOMP_PARALLEL))
+                 called_decl = TREE_OPERAND (gimple_call_arg (stmt, 0), 0);
+               else if (gimple_call_builtin_p (stmt, BUILT_IN_GOACC_PARALLEL))
+                 called_decl = TREE_OPERAND (gimple_call_arg (stmt, 1), 0);
+
+               if (called_decl != NULL_TREE
+                   && !fndecl_maybe_in_other_partition (called_decl))
+                 decl = called_decl;
+             }
 
              if (decl
                  && (fi = lookup_vi_for_tree (decl))
index 9de67f22b5c39144b635736d11f9ce3954bd7cd6..8f2018d1c615539ebfdf75fa79ec2285d0590bb2 100644 (file)
@@ -1,3 +1,11 @@
+2016-02-09  Tom de Vries  <tom@codesourcery.com>
+
+       PR tree-optimization/69599
+       * testsuite/libgomp.c/omp-nested-3.c: New test.
+       * testsuite/libgomp.c/pr46032-2.c: New test.
+       * testsuite/libgomp.oacc-c-c++-common/kernels-2.c: New test.
+       * testsuite/libgomp.oacc-c-c++-common/parallel-2.c: New test.
+
 2016-02-09  Tom de Vries  <tom@codesourcery.com>
 
        PR lto/69707
diff --git a/libgomp/testsuite/libgomp.c/omp-nested-3.c b/libgomp/testsuite/libgomp.c/omp-nested-3.c
new file mode 100644 (file)
index 0000000..7790c58
--- /dev/null
@@ -0,0 +1,4 @@
+// { dg-do run { target lto } }
+// { dg-additional-options "-fipa-pta -flto -flto-partition=max" }
+
+#include "omp-nested-1.c"
diff --git a/libgomp/testsuite/libgomp.c/pr46032-2.c b/libgomp/testsuite/libgomp.c/pr46032-2.c
new file mode 100644 (file)
index 0000000..1125f6e
--- /dev/null
@@ -0,0 +1,4 @@
+/* { dg-do run { target lto } } */
+/* { dg-options "-O2 -ftree-vectorize -std=c99 -fipa-pta -flto -flto-partition=max" } */
+
+#include "pr46032.c"
diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-2.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-2.c
new file mode 100644 (file)
index 0000000..f76c926
--- /dev/null
@@ -0,0 +1,4 @@
+/* { dg-do run { target lto } } */
+/* { dg-additional-options "-fipa-pta -flto -flto-partition=max" } */
+
+#include "kernels-1.c"
diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/parallel-2.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/parallel-2.c
new file mode 100644 (file)
index 0000000..d9fff6f
--- /dev/null
@@ -0,0 +1,4 @@
+/* { dg-do run { target lto } } */
+/* { dg-additional-options "-fipa-pta -flto -flto-partition=max" } */
+
+#include "parallel-1.c"