diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e1a1dc41ac0..4d1a97e8607 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2020-02-14 Richard Biener + + Backport from mainline + 2020-01-28 Richard Biener + + PR tree-optimization/93439 + * tree-parloops.c (create_loop_fn): Move clique bookkeeping... + * tree-cfg.c (move_sese_region_to_fn): ... here. + (verify_types_in_gimple_reference): Verify used cliques are + tracked. + 2020-02-14 Richard Biener Backport from mainline diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 81d15a747c9..72036e03c70 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2020-02-14 Richard Biener + + Backport from mainline + 2020-01-28 Richard Biener + + PR tree-optimization/93439 + * gfortran.dg/graphite/pr93439.f90: New testcase. + 2020-02-14 Richard Biener Backport from mainline diff --git a/gcc/testsuite/gfortran.dg/graphite/pr93439.f90 b/gcc/testsuite/gfortran.dg/graphite/pr93439.f90 new file mode 100644 index 00000000000..e815ab929e1 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/graphite/pr93439.f90 @@ -0,0 +1,21 @@ +! { dg-additional-options "-O2 -floop-parallelize-all -floop-unroll-and-jam -ftree-parallelize-loops=2" } + +module ai + integer, parameter :: dp = 8 +contains + subroutine qu(ja, nq, en, p5) + real(kind = dp) :: nq(ja), en(ja), p5(ja) + call tl(ja, nq, en, p5) + end subroutine qu + + subroutine tl(ja, nq, en, p5) + real(kind = dp) :: nq(9), en(9 * ja), p5(3 * ja) + do mc = 1, ja + do mb = 1, 9 + do ma = 1, 3 + p5((mc - 1) * 3 + ma) = p5((mc - 1) * 3 + ma) - 1 + end do + end do + end do + end subroutine tl +end module ai diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index d27cc65f883..0c4ae81aa05 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -3215,6 +3215,13 @@ verify_types_in_gimple_reference (tree expr, bool require_lvalue) debug_generic_stmt (expr); return true; } + if (MR_DEPENDENCE_CLIQUE (expr) != 0 + && MR_DEPENDENCE_CLIQUE (expr) > cfun->last_clique) + { + error ("invalid clique in MEM_REF"); + debug_generic_stmt (expr); + return true; + } } else if (TREE_CODE (expr) == TARGET_MEM_REF) { @@ -3234,6 +3241,13 @@ verify_types_in_gimple_reference (tree expr, bool require_lvalue) debug_generic_stmt (expr); return true; } + if (MR_DEPENDENCE_CLIQUE (expr) != 0 + && MR_DEPENDENCE_CLIQUE (expr) > cfun->last_clique) + { + error ("invalid clique in TARGET_MEM_REF"); + debug_generic_stmt (expr); + return true; + } } else if (TREE_CODE (expr) == INDIRECT_REF) { @@ -7677,6 +7691,9 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb, after = bb; } + /* Adjust the maximum clique used. */ + dest_cfun->last_clique = saved_cfun->last_clique; + loop->aux = NULL; loop0->aux = NULL; /* Loop sizes are no longer correct, fix them up. */ diff --git a/gcc/tree-parloops.c b/gcc/tree-parloops.c index c5629cc8089..dad6e2884db 100644 --- a/gcc/tree-parloops.c +++ b/gcc/tree-parloops.c @@ -1498,7 +1498,6 @@ create_loop_fn (location_t loc) DECL_ARGUMENTS (decl) = t; allocate_struct_function (decl, false); - DECL_STRUCT_FUNCTION (decl)->last_clique = act_cfun->last_clique; /* The call to allocate_struct_function clobbers CFUN, so we need to restore it. */