On Tue, Jan 24, 2017 at 05:27:26PM +0000, David Sherwood wrote:
> I have a patch to fix the following openmp issue:
> 
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79212
> 
> Writing openmp directives in a certain way in fortran programs can lead to
> the following assert:
> 
> internal compiler error: in maybe_lookup_decl_in_outer_ctx, at omp-low.c:4134
> 0xa941e6 maybe_lookup_decl_in_outer_ctx
>         /work/davshe01/oban-work-shoji/src/gcc/gcc/omp-low.c:4134
> 0xa9cadc scan_sharing_clauses
>         /work/davshe01/oban-work-shoji/src/gcc/gcc/omp-low.c:1975
> 
> Tested:
> aarch64 - No regressions in gcc/testsuite/fortran.dg, gcc/testsuite/gcc.dg,
> gcc/testsuite/g++.dg or libgomp/testsuite
> 
> Will do a full test run before submitting.
> 
> Good to go?
> David Sherwood.
> 
> ChangeLog:
> 
> 2017-01-24  David Sherwood  <david.sherw...@arm.com>
> 
>     PR middle-end/79212

This line should be intended by a single tab.

>     gcc/
>         * gimplify.c (omp_notice_variable): Add GOVD_SEEN flag to variables 
> in all contexts.

These too.

>     gcc/testsuite/
>         * gfortran.dg/gomp/sharing-4.f90: New test.
> 

--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -7147,12 +7147,9 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx, tree 
decl, bool in_code)
               && (TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl))))
                   != INTEGER_CST))
        {
-         splay_tree_node n2;
          tree t = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl)));
          gcc_assert (DECL_P (t));
-         n2 = splay_tree_lookup (ctx->variables, (splay_tree_key) t);
-         if (n2)
-           n2->value |= GOVD_SEEN;
+         omp_notice_variable (ctx, t, true);
        }
     }

As this is conditional, if the decl won't be in ctx->variables splay tree,
bad things will happen (omp_notice_variable could complain loudly, or make
it shared etc. or whatever the default is).  So perhaps it should be
instead:
          splay_tree_node n2;
          tree t = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl)));
          gcc_assert (DECL_P (t));
          n2 = splay_tree_lookup (ctx->variables, (splay_tree_key) t);
          if (n2)
            omp_notice_variable (ctx, t, true);

Ok for trunk with those changes.

        Jakub

Reply via email to