On Thu, 20 Jul 2017, Tom de Vries wrote:

> Hi,
> 
> this patch fixes PR81430, an ICE in the libgomp testsuite for both openmp and
> openacc test-cases for x86_64 with nvptx accelerator.
> 
> The scenario how we hit the ICE is as follows:
> - a testcase is compiled with -O2
> - ix86_option_optimization_table enables
>   OPT_freorder_blocks_and_partition at -O2
> - cc1 writes out the flag as part of DECL_FUNCTION_SPECIFIC_OPTIMIZATION
> - lto1 reads in the flag as part of DECL_FUNCTION_SPECIFIC_OPTIMIZATION
> - lto1 uses the flag, and runs pass_partition_blocks
> - pass_partition_blocks ICEs, because it generates code that is not
>   supported by the nvptx target.
> 
> Note that for standalone compilation for single-thread ptx execution, we don't
> attempt to run pass_partition_blocks. This is because for nvptx,
> TARGET_HAVE_NAMED_SECTIONS is set to false, and this bit in finish_options
> switches off pass_partition_blocks:
> ...
>    /* If the target requested unwind info, then turn off the
>       partitioning optimization with a different message.  Likewise, if
>       the target does not support named sections.  */
> 
>   if (opts->x_flag_reorder_blocks_and_partition
>       && (!targetm_common.have_named_sections
>           || (opts->x_flag_unwind_tables
>               && targetm_common.unwind_tables_default
>               && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))))
>     {
>       if (opts_set->x_flag_reorder_blocks_and_partition)
>         inform (loc,
>                 "-freorder-blocks-and-partition does not work "
>                 "on this architecture");
>       opts->x_flag_reorder_blocks_and_partition = 0;
>       opts->x_flag_reorder_blocks = 1;
>     }
> ...
> 
> The patch fixes this by calling finish_options in lto1 after
> cl_optimization_restore.
> 
> Points for review:
> 1. I'm uncertain though about the placement of the call. Perhaps it should be
> in cl_optimization_restore, before targetm.override_options_after_change?
> 
> 2. I think that this is offloading specific, so perhaps this should be guarded
> with lto_stream_offload_p or #ifdef ACCEL_COMPILER or some such.

Hmm, I agree with #2.  I think it conceptually is a LTO stream adjustment
and thus we should do this at the time we stream in the 
optimization/target nodes (like we remap modes for example).  Not
sure if it's possible to do this at that point, but it looks like
finish_options takes two option structs and thus we should be able to
call it.

Do you get the inform note?  I suppose we don't really want that, no?

Richard.

> Bootstrapped and reg-tested on x86_64.
> 
> OK for trunk?
> 
> Thanks,
> - Tom
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
21284 (AG Nuernberg)

Reply via email to