From f1542d9aee3d96366a680a470e2754912f0e8ce7 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 24 Jan 2018 17:28:47 +0100 Subject: [PATCH] re PR middle-end/83977 (ICE in simd_clone_clauses_extract, at omp-simd-clone.c:184) PR middle-end/83977 * tree.c (free_lang_data_in_decl): Don't clear DECL_ABSTRACT_ORIGIN here. * omp-low.c (create_omp_child_function): Remove "omp declare simd" attributes from DECL_ATTRIBUTES (decl) without affecting DECL_ATTRIBUTES (current_function_decl). * omp-simd-clone.c (expand_simd_clones): Ignore DECL_ARTIFICIAL functions with non-NULL DECL_ABSTRACT_ORIGIN. * c-c++-common/gomp/pr83977-1.c: New test. * c-c++-common/gomp/pr83977-2.c: New test. * c-c++-common/gomp/pr83977-3.c: New test. * gfortran.dg/gomp/pr83977.f90: New test. From-SVN: r257023 --- gcc/ChangeLog | 11 +++++++++++ gcc/omp-low.c | 17 +++++++++++++++++ gcc/omp-simd-clone.c | 4 ++++ gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/c-c++-common/gomp/pr83977-1.c | 19 +++++++++++++++++++ gcc/testsuite/c-c++-common/gomp/pr83977-2.c | 18 ++++++++++++++++++ gcc/testsuite/c-c++-common/gomp/pr83977-3.c | 21 +++++++++++++++++++++ gcc/testsuite/gfortran.dg/gomp/pr83977.f90 | 15 +++++++++++++++ gcc/tree.c | 10 ---------- 9 files changed, 113 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/gomp/pr83977-1.c create mode 100644 gcc/testsuite/c-c++-common/gomp/pr83977-2.c create mode 100644 gcc/testsuite/c-c++-common/gomp/pr83977-3.c create mode 100644 gcc/testsuite/gfortran.dg/gomp/pr83977.f90 diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9c313b367d3..e52ca7c3d6c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2018-01-24 Jakub Jelinek + + PR middle-end/83977 + * tree.c (free_lang_data_in_decl): Don't clear DECL_ABSTRACT_ORIGIN + here. + * omp-low.c (create_omp_child_function): Remove "omp declare simd" + attributes from DECL_ATTRIBUTES (decl) without affecting + DECL_ATTRIBUTES (current_function_decl). + * omp-simd-clone.c (expand_simd_clones): Ignore DECL_ARTIFICIAL + functions with non-NULL DECL_ABSTRACT_ORIGIN. + 2018-01-24 Richard Sandiford PR tree-optimization/83979 diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 3fcda29d326..ebbf88e250e 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -1585,6 +1585,23 @@ create_omp_child_function (omp_context *ctx, bool task_copy) DECL_INITIAL (decl) = make_node (BLOCK); BLOCK_SUPERCONTEXT (DECL_INITIAL (decl)) = decl; DECL_ATTRIBUTES (decl) = DECL_ATTRIBUTES (current_function_decl); + /* Remove omp declare simd attribute from the new attributes. */ + if (tree a = lookup_attribute ("omp declare simd", DECL_ATTRIBUTES (decl))) + { + while (tree a2 = lookup_attribute ("omp declare simd", TREE_CHAIN (a))) + a = a2; + a = TREE_CHAIN (a); + for (tree *p = &DECL_ATTRIBUTES (decl); *p != a;) + if (is_attribute_p ("omp declare simd", get_attribute_name (*p))) + *p = TREE_CHAIN (*p); + else + { + tree chain = TREE_CHAIN (*p); + *p = copy_node (*p); + p = &TREE_CHAIN (*p); + *p = chain; + } + } DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl) = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (current_function_decl); DECL_FUNCTION_SPECIFIC_TARGET (decl) diff --git a/gcc/omp-simd-clone.c b/gcc/omp-simd-clone.c index b7737a25824..fbcb92ba76f 100644 --- a/gcc/omp-simd-clone.c +++ b/gcc/omp-simd-clone.c @@ -1574,6 +1574,10 @@ expand_simd_clones (struct cgraph_node *node) tree attr = lookup_attribute ("omp declare simd", DECL_ATTRIBUTES (node->decl)); if (attr == NULL_TREE + /* Ignore artificial decls with an abstract origin, results of function + cloning, versioning etc. We want to handle certain builtins + with simd attribute, like __builtin_sin. */ + || (DECL_ARTIFICIAL (node->decl) && DECL_ABSTRACT_ORIGIN (node->decl)) || node->global.inlined_to || lookup_attribute ("noclone", DECL_ATTRIBUTES (node->decl))) return; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 00592b7b3f3..e0ee6b0a438 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2018-01-24 Jakub Jelinek + + PR middle-end/83977 + * c-c++-common/gomp/pr83977-1.c: New test. + * c-c++-common/gomp/pr83977-2.c: New test. + * c-c++-common/gomp/pr83977-3.c: New test. + * gfortran.dg/gomp/pr83977.f90: New test. + 2018-01-24 Richard Sandiford PR testsuite/83889 diff --git a/gcc/testsuite/c-c++-common/gomp/pr83977-1.c b/gcc/testsuite/c-c++-common/gomp/pr83977-1.c new file mode 100644 index 00000000000..9941db49469 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/pr83977-1.c @@ -0,0 +1,19 @@ +/* PR middle-end/83977 */ +/* { dg-do compile } */ +/* { dg-additional-options "-O2" } */ + +struct S { int a, b, c; }; + +#pragma omp declare simd uniform(z) linear(v:1) +__attribute__((noinline)) static int +foo (int x, int y, struct S z, int u, int v) +{ + return x + y + z.a; +} + +int +bar (int x, int y, int z) +{ + struct S s = { z, 1, 1 }; + return foo (x, y, s, 0, 0); +} diff --git a/gcc/testsuite/c-c++-common/gomp/pr83977-2.c b/gcc/testsuite/c-c++-common/gomp/pr83977-2.c new file mode 100644 index 00000000000..c3359b9f05e --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/pr83977-2.c @@ -0,0 +1,18 @@ +/* PR middle-end/83977 */ +/* { dg-do compile } */ + +void bar (void); + +#pragma omp declare simd uniform (b) linear(a:b) +int +foo (int a, int b) +{ + a = a + 1; +/* This function can't be called from simd loops, + because it violates declare simd restrictions. + We shouldn't ICE on it though, nor attempt to generate + simd clones for the *omp_fn* functions. */ + #pragma omp parallel + bar (); + return a; +} diff --git a/gcc/testsuite/c-c++-common/gomp/pr83977-3.c b/gcc/testsuite/c-c++-common/gomp/pr83977-3.c new file mode 100644 index 00000000000..00e18d85b37 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/pr83977-3.c @@ -0,0 +1,21 @@ +/* PR middle-end/83977 */ +/* { dg-do compile } */ + +void bar (void); +int foo (int, int) __attribute__((used)); + +#pragma omp declare simd uniform (b) linear(a:b) +int +foo (int a, int b) +{ + a = a + 1; +/* This function can't be called from simd loops, + because it violates declare simd restrictions. + We shouldn't ICE on it though, nor attempt to generate + simd clones for the *omp_fn* functions. */ + #pragma omp parallel + bar (); + return a; +} + +int foo (int, int) __attribute__((unused)); diff --git a/gcc/testsuite/gfortran.dg/gomp/pr83977.f90 b/gcc/testsuite/gfortran.dg/gomp/pr83977.f90 new file mode 100644 index 00000000000..b8ad1a7e39c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/pr83977.f90 @@ -0,0 +1,15 @@ +! PR middle-end/83977 +! { dg-do compile } + +integer function foo (a, b) + integer :: a, b +!$omp declare simd uniform(b) linear(ref(a):b) + a = a + 1 +! This function can't be called from simd loops, +! because it violates declare simd restrictions. +! We shouldn't ICE on it though, nor attempt to generate +! simd clones for the *omp_fn* functions. +!$omp parallel + call sub +!$omp end parallel +end diff --git a/gcc/tree.c b/gcc/tree.c index 63a29f4868c..cd68fb57c77 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -5329,16 +5329,6 @@ free_lang_data_in_decl (tree decl) At this point, it is not needed anymore. */ DECL_SAVED_TREE (decl) = NULL_TREE; - /* Clear the abstract origin if it refers to a method. - Otherwise dwarf2out.c will ICE as we splice functions out of - TYPE_FIELDS and thus the origin will not be output - correctly. */ - if (DECL_ABSTRACT_ORIGIN (decl) - && DECL_CONTEXT (DECL_ABSTRACT_ORIGIN (decl)) - && RECORD_OR_UNION_TYPE_P - (DECL_CONTEXT (DECL_ABSTRACT_ORIGIN (decl)))) - DECL_ABSTRACT_ORIGIN (decl) = NULL_TREE; - /* Sometimes the C++ frontend doesn't manage to transform a temporary DECL_VINDEX referring to itself into a vtable slot number as it should. Happens with functions that are copied and then forgotten -- 2.30.2