mirror of git://gcc.gnu.org/git/gcc.git
re PR middle-end/85956 (ICE in wide_int_to_tree_1, at tree.c:1549)
PR middle-end/85956 PR lto/88733 * tree-inline.h (struct copy_body_data): Add adjust_array_error_bounds field. * tree-inline.c (remap_type_1): Formatting fix. If TYPE_MAX_VALUE of ARRAY_TYPE's TYPE_DOMAIN is newly error_mark_node, replace it with a dummy "omp dummy var" variable if id->adjust_array_error_bounds. * omp-low.c (new_omp_context): Set cb.adjust_array_error_bounds. fortran/ * trans-openmp.c: Include attribs.h. (gfc_walk_alloc_comps, gfc_omp_clause_linear_ctor): Handle VAR_DECL max bound with "omp dummy var" attribute like NULL or error_mark_node - recompute number of elts independently. testsuite/ * c-c++-common/gomp/pr85956.c: New test. * g++.dg/gomp/pr88733.C: New test. From-SVN: r267858
This commit is contained in:
parent
b13091dd9d
commit
da972c05f4
|
|
@ -1,3 +1,14 @@
|
|||
2019-01-11 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR middle-end/85956
|
||||
PR lto/88733
|
||||
* tree-inline.h (struct copy_body_data): Add adjust_array_error_bounds
|
||||
field.
|
||||
* tree-inline.c (remap_type_1): Formatting fix. If TYPE_MAX_VALUE of
|
||||
ARRAY_TYPE's TYPE_DOMAIN is newly error_mark_node, replace it with
|
||||
a dummy "omp dummy var" variable if id->adjust_array_error_bounds.
|
||||
* omp-low.c (new_omp_context): Set cb.adjust_array_error_bounds.
|
||||
|
||||
2019-01-11 Vladimir Makarov <vmakarov@redhat.com>
|
||||
|
||||
PR rtl-optimization/87305
|
||||
|
|
|
|||
|
|
@ -1,7 +1,16 @@
|
|||
2019-01-11 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR middle-end/85956
|
||||
PR lto/88733
|
||||
* trans-openmp.c: Include attribs.h.
|
||||
(gfc_walk_alloc_comps, gfc_omp_clause_linear_ctor): Handle
|
||||
VAR_DECL max bound with "omp dummy var" attribute like NULL or
|
||||
error_mark_node - recompute number of elts independently.
|
||||
|
||||
2019-01-11 Thomas Koenig <tkoenig@gcc.gnu.org>
|
||||
|
||||
PR fortran/59345
|
||||
* trans-array.c (gfc_conv_parameter_array): Temporary
|
||||
* trans-array.c (gfc_conv_parameter_array): Temporary
|
||||
arrays generated for expressions do not need to be repacked.
|
||||
|
||||
2019-01-10 Steven G. Kargl <kargl@gcc.gnu.org>
|
||||
|
|
@ -103,7 +112,7 @@
|
|||
|
||||
2019-01-01 Steven G. Kargl <kargl@gcc.gnu.org>
|
||||
|
||||
* parse.c (decode_statement): Suppress "Unclassifiable statement"
|
||||
* parse.c (decode_statement): Suppress "Unclassifiable statement"
|
||||
error if previous error messages were emittes.
|
||||
|
||||
2019-01-01 Thomas Koenig <tkoenig@gcc.gnu.org>
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ along with GCC; see the file COPYING3. If not see
|
|||
#include "diagnostic-core.h"
|
||||
#undef GCC_DIAG_STYLE
|
||||
#define GCC_DIAG_STYLE __gcc_gfc__
|
||||
#include "attribs.h"
|
||||
|
||||
int ompws_flags;
|
||||
|
||||
|
|
@ -297,10 +298,19 @@ gfc_walk_alloc_comps (tree decl, tree dest, tree var,
|
|||
}
|
||||
else
|
||||
{
|
||||
bool compute_nelts = false;
|
||||
if (!TYPE_DOMAIN (type)
|
||||
|| TYPE_MAX_VALUE (TYPE_DOMAIN (type)) == NULL_TREE
|
||||
|| TYPE_MIN_VALUE (TYPE_DOMAIN (type)) == error_mark_node
|
||||
|| TYPE_MAX_VALUE (TYPE_DOMAIN (type)) == error_mark_node)
|
||||
compute_nelts = true;
|
||||
else if (VAR_P (TYPE_MAX_VALUE (TYPE_DOMAIN (type))))
|
||||
{
|
||||
tree a = DECL_ATTRIBUTES (TYPE_MAX_VALUE (TYPE_DOMAIN (type)));
|
||||
if (lookup_attribute ("omp dummy var", a))
|
||||
compute_nelts = true;
|
||||
}
|
||||
if (compute_nelts)
|
||||
{
|
||||
tem = fold_build2 (EXACT_DIV_EXPR, sizetype,
|
||||
TYPE_SIZE_UNIT (type),
|
||||
|
|
@ -912,11 +922,20 @@ gfc_omp_clause_linear_ctor (tree clause, tree dest, tree src, tree add)
|
|||
&& (!GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause))
|
||||
|| !POINTER_TYPE_P (type)))
|
||||
{
|
||||
bool compute_nelts = false;
|
||||
gcc_assert (TREE_CODE (type) == ARRAY_TYPE);
|
||||
if (!TYPE_DOMAIN (type)
|
||||
|| TYPE_MAX_VALUE (TYPE_DOMAIN (type)) == NULL_TREE
|
||||
|| TYPE_MIN_VALUE (TYPE_DOMAIN (type)) == error_mark_node
|
||||
|| TYPE_MAX_VALUE (TYPE_DOMAIN (type)) == error_mark_node)
|
||||
compute_nelts = true;
|
||||
else if (VAR_P (TYPE_MAX_VALUE (TYPE_DOMAIN (type))))
|
||||
{
|
||||
tree a = DECL_ATTRIBUTES (TYPE_MAX_VALUE (TYPE_DOMAIN (type)));
|
||||
if (lookup_attribute ("omp dummy var", a))
|
||||
compute_nelts = true;
|
||||
}
|
||||
if (compute_nelts)
|
||||
{
|
||||
nelems = fold_build2 (EXACT_DIV_EXPR, sizetype,
|
||||
TYPE_SIZE_UNIT (type),
|
||||
|
|
|
|||
|
|
@ -872,6 +872,7 @@ new_omp_context (gimple *stmt, omp_context *outer_ctx)
|
|||
}
|
||||
|
||||
ctx->cb.decl_map = new hash_map<tree, tree>;
|
||||
ctx->cb.adjust_array_error_bounds = true;
|
||||
|
||||
return ctx;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,3 +1,10 @@
|
|||
2019-01-11 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR middle-end/85956
|
||||
PR lto/88733
|
||||
* c-c++-common/gomp/pr85956.c: New test.
|
||||
* g++.dg/gomp/pr88733.C: New test.
|
||||
|
||||
2019-01-11 Tobias Burnus <burnus@net-b.de>
|
||||
|
||||
PR C++/88114
|
||||
|
|
|
|||
|
|
@ -0,0 +1,12 @@
|
|||
/* PR middle-end/85956 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-additional-options "-O2 -Wall" } */
|
||||
|
||||
void
|
||||
foo (int n, void *p)
|
||||
{
|
||||
int (*a)[n] = (int (*)[n]) p;
|
||||
#pragma omp parallel shared(a) default(none)
|
||||
#pragma omp master
|
||||
a[-1][-1] = 42; /* { dg-warning "array subscript -1 is below array bounds" } */
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
// PR lto/88733
|
||||
// { dg-do compile }
|
||||
// { dg-additional-options "-flto -ffat-lto-objects" { target lto } }
|
||||
|
||||
struct A { int f; } a;
|
||||
|
||||
__attribute__((noipa)) void
|
||||
bar (A **x, int)
|
||||
{
|
||||
x[0] = &a;
|
||||
}
|
||||
|
||||
int
|
||||
foo (int n)
|
||||
{
|
||||
int g;
|
||||
A *j[n];
|
||||
bar (j, n);
|
||||
#pragma omp parallel
|
||||
#pragma omp single
|
||||
g = j[0]->f;
|
||||
return g;
|
||||
}
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
foo (0);
|
||||
}
|
||||
|
|
@ -523,11 +523,27 @@ remap_type_1 (tree type, copy_body_data *id)
|
|||
|
||||
if (TYPE_MAIN_VARIANT (new_tree) != new_tree)
|
||||
{
|
||||
gcc_checking_assert (TYPE_DOMAIN (type) == TYPE_DOMAIN (TYPE_MAIN_VARIANT (type)));
|
||||
gcc_checking_assert (TYPE_DOMAIN (type)
|
||||
== TYPE_DOMAIN (TYPE_MAIN_VARIANT (type)));
|
||||
TYPE_DOMAIN (new_tree) = TYPE_DOMAIN (TYPE_MAIN_VARIANT (new_tree));
|
||||
}
|
||||
else
|
||||
TYPE_DOMAIN (new_tree) = remap_type (TYPE_DOMAIN (new_tree), id);
|
||||
{
|
||||
TYPE_DOMAIN (new_tree) = remap_type (TYPE_DOMAIN (new_tree), id);
|
||||
/* For array bounds where we have decided not to copy over the bounds
|
||||
variable which isn't used in OpenMP/OpenACC region, change them to
|
||||
an uninitialized VAR_DECL temporary. */
|
||||
if (TYPE_MAX_VALUE (TYPE_DOMAIN (new_tree)) == error_mark_node
|
||||
&& id->adjust_array_error_bounds
|
||||
&& TYPE_MAX_VALUE (TYPE_DOMAIN (type)) != error_mark_node)
|
||||
{
|
||||
tree v = create_tmp_var (TREE_TYPE (TYPE_DOMAIN (new_tree)));
|
||||
DECL_ATTRIBUTES (v)
|
||||
= tree_cons (get_identifier ("omp dummy var"), NULL_TREE,
|
||||
DECL_ATTRIBUTES (v));
|
||||
TYPE_MAX_VALUE (TYPE_DOMAIN (new_tree)) = v;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case RECORD_TYPE:
|
||||
|
|
|
|||
|
|
@ -122,6 +122,10 @@ struct copy_body_data
|
|||
/* True if the location information will need to be reset. */
|
||||
bool reset_location;
|
||||
|
||||
/* Replace error_mark_node as upper bound of array types with
|
||||
an uninitialized VAR_DECL temporary. */
|
||||
bool adjust_array_error_bounds;
|
||||
|
||||
/* A function to be called when duplicating BLOCK nodes. */
|
||||
void (*transform_lang_insert_block) (tree);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue