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.

Bootstrapped and reg-tested on x86_64.

OK for trunk?

Thanks,
- Tom
Use finalize_options in lto1

2017-07-20  Tom de Vries  <t...@codesourcery.com>

	PR lto/81430
	* function.c (invoke_set_current_function_hook): Call finish_options in
	lto1 after cl_optimization_restore.

---
 gcc/function.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/gcc/function.c b/gcc/function.c
index f625489..ccb312b 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -77,6 +77,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "rtl-chkp.h"
 #include "tree-dfa.h"
 #include "tree-ssa.h"
+#include "opts.h"
 
 /* So we can assign to cfun in this file.  */
 #undef cfun
@@ -4793,6 +4794,11 @@ invoke_set_current_function_hook (tree fndecl)
 	{
 	  optimization_current_node = opts;
 	  cl_optimization_restore (&global_options, TREE_OPTIMIZATION (opts));
+	  if (in_lto_p)
+	    finish_options (&global_options, &global_options_set,
+			    (fndecl
+			     ? DECL_SOURCE_LOCATION (fndecl)
+			     : UNKNOWN_LOCATION));
 	}
 
       targetm.set_current_function (fndecl);

Reply via email to