diff options
author | Jakub Jelinek <jakub@redhat.com> | 2013-11-29 11:41:12 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-11-29 11:41:12 +0100 |
commit | e06f9964af04d213dcde35ee63ecff12676ece44 (patch) | |
tree | f916e85a99fbf5d9a8618b0a2f877572cb37a8ff /gcc/omp-low.c | |
parent | c193f58b676e48bd96c62864a2da7843419e22e8 (diff) | |
download | gcc-e06f9964af04d213dcde35ee63ecff12676ece44.zip gcc-e06f9964af04d213dcde35ee63ecff12676ece44.tar.gz gcc-e06f9964af04d213dcde35ee63ecff12676ece44.tar.bz2 |
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 <rguenther@suse.de>
From-SVN: r205514
Diffstat (limited to 'gcc/omp-low.c')
-rw-r--r-- | gcc/omp-low.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 71dc811..c929157 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 (); } }; |