Fix switch conversion in offloading functions
authorTom de Vries <tom@codesourcery.com>
Mon, 26 Mar 2018 09:45:49 +0000 (09:45 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Mon, 26 Mar 2018 09:45:49 +0000 (09:45 +0000)
2018-03-26  Tom de Vries  <tom@codesourcery.com>

PR tree-optimization/85063
* omp-general.c (offloading_function_p): New function.  Factor out
of ...
* omp-offload.c (pass_omp_target_link::gate): ... here.
* omp-general.h (offloading_function_p): Declare.
* tree-switch-conversion.c (build_one_array): Mark CSWTCH.x variable
with attribute omp declare target for offloading functions.

* testsuite/libgomp.c/switch-conversion-2.c: New test.
* testsuite/libgomp.c/switch-conversion.c: New test.
* testsuite/libgomp.oacc-c-c++-common/switch-conversion-2.c: New test.
* testsuite/libgomp.oacc-c-c++-common/switch-conversion.c: New test.

From-SVN: r258852

gcc/ChangeLog
gcc/omp-general.c
gcc/omp-general.h
gcc/omp-offload.c
gcc/tree-switch-conversion.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c/switch-conversion-2.c [new file with mode: 0644]
libgomp/testsuite/libgomp.c/switch-conversion.c [new file with mode: 0644]
libgomp/testsuite/libgomp.oacc-c-c++-common/switch-conversion-2.c [new file with mode: 0644]
libgomp/testsuite/libgomp.oacc-c-c++-common/switch-conversion.c [new file with mode: 0644]

index 9526547b4d8c29a184ab327f58a55fbffaa6f405..a8d9e76b8f54cc9f03570063357771709971a977 100644 (file)
@@ -1,3 +1,13 @@
+2018-03-26  Tom de Vries  <tom@codesourcery.com>
+
+       PR tree-optimization/85063
+       * omp-general.c (offloading_function_p): New function.  Factor out
+       of ...
+       * omp-offload.c (pass_omp_target_link::gate): ... here.
+       * omp-general.h (offloading_function_p): Declare.
+       * tree-switch-conversion.c (build_one_array): Mark CSWTCH.x variable
+       with attribute omp declare target for offloading functions.
+
 2018-03-24  Richard Sandiford  <richard.sandiford@linaro.org>
 
        PR tree-optimization/84005
index 3ef6ce76eb8c997ada59e335eebc440f4099c6a1..cabbbbc6de2cd74a17d8e37cafb2470218d399bc 100644 (file)
@@ -612,6 +612,16 @@ oacc_get_fn_attrib (tree fn)
   return lookup_attribute (OACC_FN_ATTRIB, DECL_ATTRIBUTES (fn));
 }
 
+/* Return true if FN is an OpenMP or OpenACC offloading function.  */
+
+bool
+offloading_function_p (tree fn)
+{
+  tree attrs = DECL_ATTRIBUTES (fn);
+  return (lookup_attribute ("omp declare target", attrs)
+         || lookup_attribute ("omp target entrypoint", attrs));
+}
+
 /* Extract an oacc execution dimension from FN.  FN must be an
    offloaded function or routine that has already had its execution
    dimensions lowered to the target-specific values.  */
index 481a8859cc5f0255a027adda64fa9c705f66dc28..66f0a33c2e2fb75e8e5dab1753101c9ba7747275 100644 (file)
@@ -85,6 +85,7 @@ extern void oacc_replace_fn_attrib (tree fn, tree dims);
 extern void oacc_set_fn_attrib (tree fn, tree clauses, vec<tree> *args);
 extern tree oacc_build_routine_dims (tree clauses);
 extern tree oacc_get_fn_attrib (tree fn);
+extern bool offloading_function_p (tree fn);
 extern int oacc_get_fn_dim_size (tree fn, int axis);
 extern int oacc_get_ifn_dim_arg (const gimple *stmt);
 
index 9cbc51db55efda02fdcb1e23d8c1af7b6f0c541e..0abf0283c9e2db828dd98473e495eb93837cefbf 100644 (file)
@@ -1967,9 +1967,7 @@ public:
   virtual bool gate (function *fun)
     {
 #ifdef ACCEL_COMPILER
-      tree attrs = DECL_ATTRIBUTES (fun->decl);
-      return lookup_attribute ("omp declare target", attrs)
-            || lookup_attribute ("omp target entrypoint", attrs);
+      return offloading_function_p (fun->decl);
 #else
       (void) fun;
       return false;
index 2da7068345cd1bddee0d632d6ef727a384685987..b0470ef1b5e6a46afd89b57fad4547ea8e103b48 100644 (file)
@@ -49,6 +49,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
 #include "alloc-pool.h"
 #include "target.h"
 #include "tree-into-ssa.h"
+#include "omp-general.h"
 
 /* ??? For lang_hooks.types.type_for_mode, but is there a word_mode
    type in the GIMPLE type system that is language-independent?  */
@@ -1162,6 +1163,10 @@ build_one_array (gswitch *swtch, int num, tree arr_index_type,
       TREE_CONSTANT (decl) = 1;
       TREE_READONLY (decl) = 1;
       DECL_IGNORED_P (decl) = 1;
+      if (offloading_function_p (cfun->decl))
+       DECL_ATTRIBUTES (decl)
+         = tree_cons (get_identifier ("omp declare target"), NULL_TREE,
+                      NULL_TREE);
       varpool_node::finalize_decl (decl);
 
       fetch = build4 (ARRAY_REF, value_type, decl, tidx, NULL_TREE,
index 008b93535fb26f28bc42325fec34c6d425e1c5ac..a5a5e0631b223aff1f55dd33fc5fed2cf649c844 100644 (file)
@@ -1,3 +1,11 @@
+2018-03-26  Tom de Vries  <tom@codesourcery.com>
+
+       PR tree-optimization/85063
+       * testsuite/libgomp.c/switch-conversion-2.c: New test.
+       * testsuite/libgomp.c/switch-conversion.c: New test.
+       * testsuite/libgomp.oacc-c-c++-common/switch-conversion-2.c: New test.
+       * testsuite/libgomp.oacc-c-c++-common/switch-conversion.c: New test.
+
 2018-03-25  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/84381
diff --git a/libgomp/testsuite/libgomp.c/switch-conversion-2.c b/libgomp/testsuite/libgomp.c/switch-conversion-2.c
new file mode 100644 (file)
index 0000000..97601dc
--- /dev/null
@@ -0,0 +1,31 @@
+/* PR tree-optimization/85063 */
+/* { dg-additional-options "-ftree-switch-conversion" } */
+
+#include <stdlib.h>
+
+int
+main (void)
+{
+  int n[1];
+
+  n[0] = 3;
+
+#pragma omp target
+  {
+    int m = n[0];
+    switch (m & 3)
+    {
+    case 0: m = 4; break;
+    case 1: m = 3; break;
+    case 2: m = 2; break;
+    default:
+      m = 1; break;
+    }
+    n[0] = m;
+  }
+
+  if (n[0] != 1)
+    abort ();
+
+  return 0;
+}
diff --git a/libgomp/testsuite/libgomp.c/switch-conversion.c b/libgomp/testsuite/libgomp.c/switch-conversion.c
new file mode 100644 (file)
index 0000000..835f54e
--- /dev/null
@@ -0,0 +1,36 @@
+/* PR tree-optimization/85063 */
+/* { dg-additional-options "-ftree-switch-conversion" } */
+
+#include <stdlib.h>
+
+#pragma omp declare target
+static int __attribute__((noinline)) foo (int n)
+{
+  switch (n & 3)
+    {
+    case 0: return 4;
+    case 1: return 3;
+    case 2: return 2;
+    default:
+      return 1;
+    }
+}
+#pragma omp end declare target
+
+int
+main (void)
+{
+  int n[1];
+
+  n[0] = 4;
+
+#pragma omp target
+  {
+    n[0] = foo (n[0]);
+  }
+
+  if (n[0] != 4)
+    abort ();
+
+  return 0;
+}
diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/switch-conversion-2.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/switch-conversion-2.c
new file mode 100644 (file)
index 0000000..8c018b8
--- /dev/null
@@ -0,0 +1,31 @@
+/* PR tree-optimization/85063 */
+/* { dg-additional-options "-ftree-switch-conversion" } */
+
+#include <stdlib.h>
+
+int
+main (void)
+{
+  int n[1];
+
+  n[0] = 3;
+
+#pragma acc parallel copy(n)
+  {
+    int m = n[0];
+    switch (m & 3)
+    {
+    case 0: m = 4; break;
+    case 1: m = 3; break;
+    case 2: m = 2; break;
+    default:
+      m = 1; break;
+    }
+    n[0] = m;
+  }
+
+  if (n[0] != 1)
+    abort ();
+
+  return 0;
+}
diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/switch-conversion.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/switch-conversion.c
new file mode 100644 (file)
index 0000000..0540678
--- /dev/null
@@ -0,0 +1,35 @@
+/* PR tree-optimization/85063 */
+/* { dg-additional-options "-ftree-switch-conversion" } */
+
+#include <stdlib.h>
+
+#pragma acc routine seq
+static int __attribute__((noinline)) foo (int n)
+{
+  switch (n & 3)
+    {
+    case 0: return 4;
+    case 1: return 3;
+    case 2: return 2;
+    default:
+      return 1;
+    }
+}
+
+int
+main (void)
+{
+  int n[1];
+
+  n[0] = 4;
+
+#pragma acc parallel copy(n)
+  {
+    n[0] = foo (n[0]);
+  }
+
+  if (n[0] != 4)
+    abort ();
+
+  return 0;
+}