From e06f9964af04d213dcde35ee63ecff12676ece44 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 29 Nov 2013 11:41:12 +0100 Subject: [PATCH] re PR lto/59326 (FAIL: gcc.dg/vect/vect-simd-clone-*.c) PR lto/59326 * omp-low.c (simd_clone_create): Return NULL if for definition !cgraph_function_with_gimple_body_p (old_node). Call cgraph_get_body before calling cgraph_function_versioning. (expand_simd_clones): Look for "omp declare simd" attribute first. Don't check targetm.simd_clone.compute_vecsize_and_simdlen here. Punt if node->global.inlined_to. (pass_omp_simd_clone::gate): Also enable if in_lto_p && !flag_wpa. Disable pass if targetm.simd_clone.compute_vecsize_and_simdlen is NULL. * lto-streamer-out.c (hash_tree): Handle OMP_CLAUSE. lto/ * lto.c (compare_tree_sccs_1): Handle OMP_CLAUSE. testsuite/ * gcc.dg/vect/vect-simd-clone-12.c: New test. * gcc.dg/vect/vect-simd-clone-12a.c: New test. * gcc.dg/vect/vect-simd-clone-10a.c: Remove extern keywords. Co-Authored-By: Richard Biener From-SVN: r205514 --- gcc/ChangeLog | 14 +++++++ gcc/lto-streamer-out.c | 33 +++++++++++++++ gcc/lto/ChangeLog | 6 +++ gcc/lto/lto.c | 40 +++++++++++++++++++ gcc/omp-low.c | 23 +++++++---- gcc/testsuite/ChangeLog | 5 +++ .../gcc.dg/vect/vect-simd-clone-10a.c | 4 +- .../gcc.dg/vect/vect-simd-clone-12.c | 7 ++++ .../gcc.dg/vect/vect-simd-clone-12a.c | 17 ++++++++ 9 files changed, 139 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/vect/vect-simd-clone-12.c create mode 100644 gcc/testsuite/gcc.dg/vect/vect-simd-clone-12a.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 791eaef3164..035ab85fef4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2013-11-29 Jakub Jelinek + Richard Biener + + PR lto/59326 + * omp-low.c (simd_clone_create): Return NULL if for definition + !cgraph_function_with_gimple_body_p (old_node). Call cgraph_get_body + before calling cgraph_function_versioning. + (expand_simd_clones): Look for "omp declare simd" attribute first. + Don't check targetm.simd_clone.compute_vecsize_and_simdlen here. + Punt if node->global.inlined_to. + (pass_omp_simd_clone::gate): Also enable if in_lto_p && !flag_wpa. + Disable pass if targetm.simd_clone.compute_vecsize_and_simdlen is NULL. + * lto-streamer-out.c (hash_tree): Handle OMP_CLAUSE. + 2013-11-29 Jakub Jelinek PR lto/59326 diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c index 2821001aa0e..3135f008a22 100644 --- a/gcc/lto-streamer-out.c +++ b/gcc/lto-streamer-out.c @@ -1060,6 +1060,39 @@ hash_tree (struct streamer_tree_cache_d *cache, tree t) } } + if (code == OMP_CLAUSE) + { + int i; + + v = iterative_hash_host_wide_int (OMP_CLAUSE_CODE (t), v); + switch (OMP_CLAUSE_CODE (t)) + { + case OMP_CLAUSE_DEFAULT: + v = iterative_hash_host_wide_int (OMP_CLAUSE_DEFAULT_KIND (t), v); + break; + case OMP_CLAUSE_SCHEDULE: + v = iterative_hash_host_wide_int (OMP_CLAUSE_SCHEDULE_KIND (t), v); + break; + case OMP_CLAUSE_DEPEND: + v = iterative_hash_host_wide_int (OMP_CLAUSE_DEPEND_KIND (t), v); + break; + case OMP_CLAUSE_MAP: + v = iterative_hash_host_wide_int (OMP_CLAUSE_MAP_KIND (t), v); + break; + case OMP_CLAUSE_PROC_BIND: + v = iterative_hash_host_wide_int (OMP_CLAUSE_PROC_BIND_KIND (t), v); + break; + case OMP_CLAUSE_REDUCTION: + v = iterative_hash_host_wide_int (OMP_CLAUSE_REDUCTION_CODE (t), v); + break; + default: + break; + } + for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (t)]; i++) + visit (OMP_CLAUSE_OPERAND (t, i)); + visit (OMP_CLAUSE_CHAIN (t)); + } + return v; #undef visit diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 3ce3a32c164..6d6ebf6717d 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,9 @@ +2013-11-29 Jakub Jelinek + Richard Biener + + PR lto/59326 + * lto.c (compare_tree_sccs_1): Handle OMP_CLAUSE. + 2013-11-29 Jakub Jelinek PR lto/59326 diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c index 26084bf7d41..1f46238d5bf 100644 --- a/gcc/lto/lto.c +++ b/gcc/lto/lto.c @@ -1410,6 +1410,36 @@ compare_tree_sccs_1 (tree t1, tree t2, tree **map) TREE_STRING_LENGTH (t1)) != 0) return false; + if (code == OMP_CLAUSE) + { + compare_values (OMP_CLAUSE_CODE); + switch (OMP_CLAUSE_CODE (t1)) + { + case OMP_CLAUSE_DEFAULT: + compare_values (OMP_CLAUSE_DEFAULT_KIND); + break; + case OMP_CLAUSE_SCHEDULE: + compare_values (OMP_CLAUSE_SCHEDULE_KIND); + break; + case OMP_CLAUSE_DEPEND: + compare_values (OMP_CLAUSE_DEPEND_KIND); + break; + case OMP_CLAUSE_MAP: + compare_values (OMP_CLAUSE_MAP_KIND); + break; + case OMP_CLAUSE_PROC_BIND: + compare_values (OMP_CLAUSE_PROC_BIND_KIND); + break; + case OMP_CLAUSE_REDUCTION: + compare_values (OMP_CLAUSE_REDUCTION_CODE); + compare_values (OMP_CLAUSE_REDUCTION_GIMPLE_INIT); + compare_values (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE); + break; + default: + break; + } + } + #undef compare_values @@ -1633,6 +1663,16 @@ compare_tree_sccs_1 (tree t1, tree t2, tree **map) } } + if (code == OMP_CLAUSE) + { + int i; + + for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (t1)]; i++) + compare_tree_edges (OMP_CLAUSE_OPERAND (t1, i), + OMP_CLAUSE_OPERAND (t2, i)); + compare_tree_edges (OMP_CLAUSE_CHAIN (t1), OMP_CLAUSE_CHAIN (t2)); + } + #undef compare_tree_edges return true; diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 71dc8118734..c9291574d7c 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -10912,8 +10912,13 @@ simd_clone_create (struct cgraph_node *old_node) { struct cgraph_node *new_node; if (old_node->definition) - new_node = cgraph_function_versioning (old_node, vNULL, NULL, NULL, false, - NULL, NULL, "simdclone"); + { + if (!cgraph_function_with_gimple_body_p (old_node)) + return NULL; + cgraph_get_body (old_node); + new_node = cgraph_function_versioning (old_node, vNULL, NULL, NULL, + false, NULL, NULL, "simdclone"); + } else { tree old_decl = old_node->decl; @@ -11622,13 +11627,13 @@ simd_clone_adjust (struct cgraph_node *node) static void expand_simd_clones (struct cgraph_node *node) { - if (lookup_attribute ("noclone", DECL_ATTRIBUTES (node->decl))) - return; - tree attr = lookup_attribute ("omp declare simd", DECL_ATTRIBUTES (node->decl)); - if (!attr || targetm.simd_clone.compute_vecsize_and_simdlen == NULL) + if (attr == NULL_TREE + || node->global.inlined_to + || lookup_attribute ("noclone", DECL_ATTRIBUTES (node->decl))) return; + /* Ignore #pragma omp declare simd extern int foo (); @@ -11764,8 +11769,10 @@ public: {} /* opt_pass methods: */ - bool gate () { return flag_openmp || flag_openmp_simd - || flag_enable_cilkplus; } + bool gate () { return ((flag_openmp || flag_openmp_simd + || flag_enable_cilkplus || (in_lto_p && !flag_wpa)) + && (targetm.simd_clone.compute_vecsize_and_simdlen + != NULL)); } unsigned int execute () { return ipa_omp_simd_clone (); } }; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 82916752314..4580ec5fa52 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2013-11-29 Jakub Jelinek + PR lto/59326 + * gcc.dg/vect/vect-simd-clone-12.c: New test. + * gcc.dg/vect/vect-simd-clone-12a.c: New test. + * gcc.dg/vect/vect-simd-clone-10a.c: Remove extern keywords. + PR c/59280 * c-c++-common/pr59280.c: New test. diff --git a/gcc/testsuite/gcc.dg/vect/vect-simd-clone-10a.c b/gcc/testsuite/gcc.dg/vect/vect-simd-clone-10a.c index cd42e7c8bc8..1314039643f 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-simd-clone-10a.c +++ b/gcc/testsuite/gcc.dg/vect/vect-simd-clone-10a.c @@ -3,14 +3,14 @@ #include "vect-simd-clone-10.h" #pragma omp declare simd notinbranch -extern int +int foo (long int a, int b, int c) { return a + b + c; } #pragma omp declare simd notinbranch -extern long int +long int bar (int a, int b, long int c) { return a + b + c; diff --git a/gcc/testsuite/gcc.dg/vect/vect-simd-clone-12.c b/gcc/testsuite/gcc.dg/vect/vect-simd-clone-12.c new file mode 100644 index 00000000000..5c94153ea80 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-simd-clone-12.c @@ -0,0 +1,7 @@ +/* { dg-additional-options "-fopenmp-simd" } */ +/* { dg-additional-options "-mavx" { target avx_runtime } } */ +/* { dg-additional-sources vect-simd-clone-12a.c } */ + +#include "vect-simd-clone-10.c" + +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-simd-clone-12a.c b/gcc/testsuite/gcc.dg/vect/vect-simd-clone-12a.c new file mode 100644 index 00000000000..fcd04614e97 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-simd-clone-12a.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ + +#include "vect-simd-clone-10.h" + +#pragma omp declare simd notinbranch +__attribute__((noinline)) int +foo (long int a, int b, int c) +{ + return a + b + c; +} + +#pragma omp declare simd notinbranch +__attribute__((noinline)) long int +bar (int a, int b, long int c) +{ + return a + b + c; +} -- 2.30.2