aboutsummaryrefslogtreecommitdiff
path: root/gcc/omp-low.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2013-11-29 11:41:12 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2013-11-29 11:41:12 +0100
commite06f9964af04d213dcde35ee63ecff12676ece44 (patch)
treef916e85a99fbf5d9a8618b0a2f877572cb37a8ff /gcc/omp-low.c
parentc193f58b676e48bd96c62864a2da7843419e22e8 (diff)
downloadgcc-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.c23
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 (); }
};