https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105459

Kewen Lin <linkw at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org

--- Comment #6 from Kewen Lin <linkw at gcc dot gnu.org> ---
The r12-3721 makes it get the exact fp_expression info and more optimization
chance then exposes this issue.

Some diff from a.wpa.085i.inline between the good and bad:

-IPA function summary for bar/2 inlinable
+IPA function summary for bar/2 inlinable fp_expression

+Copying FP flags from bar/2 to foo/3
...
+Copying FP flags from foo/3 to main/5
...

-IPA function summary for main/5 inlinable
+IPA function summary for main/5 inlinable fp_expression

When we are expand node for function main, we create the target global for its
target option node, later init_function_start -> initialize_rtl ->
backend_init_target -> ira_init -> ira_init_costs initialize the init_cost.
Then it comes to handle ipa_transforms like:

if (ipa_transforms_to_apply.exists ())
    execute_all_ipa_transforms (false);

try to call input_function for callees. In this case, function quux share the
same target option node with main, when switching back to main, it hits the
condition in 

  else if (flag_unsafe_math_optimizations
           != TREE_TARGET_OPTION (new_tree)->x_ix86_unsafe_math_optimizations
           || (flag_excess_precision
               != TREE_TARGET_OPTION (new_tree)->x_ix86_excess_precision))
    {
      cl_target_option_restore (&global_options, &global_options_set,
                                TREE_TARGET_OPTION (new_tree));
      ix86_excess_precision = flag_excess_precision;
      ix86_unsafe_math_optimizations = flag_unsafe_math_optimizations;
      DECL_FUNCTION_SPECIFIC_TARGET (fndecl) = new_tree
        = build_target_option_node (&global_options, &global_options_set);
      if (TREE_TARGET_GLOBALS (new_tree))
        restore_target_globals (TREE_TARGET_GLOBALS (new_tree));
      else if (new_tree == target_option_default_node)
        restore_target_globals (&default_target_globals);
      else
        TREE_TARGET_GLOBALS (new_tree) = save_target_globals_default_opts ();
    }

it calls save_target_globals_default_opts for new target globals. Note that the
previous ira_int in target global has been initialized by backend_init_target,
while this new created target global doesn't, it's associated to the target
node newly created for main. There is no other places to initialize ira_int, so
it gets ICE during ira pass.

Reply via email to