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.