On Fri, Apr 06, 2018 at 06:48:52AM -0700, Cesar Philippidis wrote:
> 2018-04-06  Cesar Philippidis  <ce...@codesourcery.com>
> 
>       PR middle-end/84955
> 
>       gcc/
>       * cfgloop.c (flow_loops_find): Add assert.
>       * omp-expand.c (expand_oacc_for): Add dummy false branch for
>         tiled basic blocks without omp continue statements.
>       * tree-cfg.c (execute_fixup_cfg): Handle calls to internal
>         functions like regular functions.
> 
>       libgomp/
>       * testsuite/libgomp.oacc-c-c++-common/pr84955.c: New test.
>       * testsuite/libgomp.oacc-fortran/pr84955.f90: New test.

I'd like to defer the cfgloop.c and tree-cfg.c changes to Richard, just want to
mention that:

> --- a/gcc/tree-cfg.c
> +++ b/gcc/tree-cfg.c
> @@ -9586,10 +9586,7 @@ execute_fixup_cfg (void)
>        for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
>       {
>         gimple *stmt = gsi_stmt (gsi);
> -       tree decl = is_gimple_call (stmt)
> -                   ? gimple_call_fndecl (stmt)
> -                   : NULL;
> -       if (decl)
> +       if (is_gimple_call (stmt))

This change doesn't affect just internal functions, but also all indirect
calls through function pointers with const, pure or noreturn attributes.

> --- a/gcc/omp-expand.c
> +++ b/gcc/omp-expand.c
> @@ -5439,6 +5439,13 @@ expand_oacc_for (struct omp_region *region, struct 
> omp_for_data *fd)
>  
>         split->flags ^= EDGE_FALLTHRU | EDGE_TRUE_VALUE;
>  
> +       /* Add a dummy exit for the tiled block when cont_bb is missing.  */
> +       if (cont_bb == NULL)
> +         {
> +           edge e = make_edge (body_bb, exit_bb, EDGE_FALSE_VALUE);
> +           e->probability = profile_probability::even ();
> +         }

I miss here updating of split->probability, if you make e even (the other edge
needs to have probability of 100%-the probability, i.e. even as well.

        Jakub

Reply via email to