http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60911
--- Comment #11 from Richard Biener <rguenth at gcc dot gnu.org> --- Index: gcc/passes.c =================================================================== --- gcc/passes.c (revision 209742) +++ gcc/passes.c (working copy) @@ -2194,8 +2194,26 @@ execute_one_pass (opt_pass *pass) Apply all trnasforms first. */ if (pass->type == SIMPLE_IPA_PASS) { + struct cgraph_node *node; bool applied = false; - do_per_function (apply_ipa_transforms, (void *)&applied); + FOR_EACH_DEFINED_FUNCTION (node) + if (node->analyzed + && cgraph_function_with_gimple_body_p (node) + && (!node->clone_of || node->decl != node->clone_of->decl)) + { + if (!node->global.inlined_to + && node->ipa_transforms_to_apply.exists ()) + { + cgraph_get_body (node); + push_cfun (DECL_STRUCT_FUNCTION (node->decl)); + execute_all_ipa_transforms (); + rebuild_cgraph_edges (); + free_dominance_info (CDI_DOMINATORS); + free_dominance_info (CDI_POST_DOMINATORS); + pop_cfun (); + applied = true; + } + } if (applied) symtab_remove_unreachable_nodes (true, dump_file); /* Restore current_pass. */ should work and avoid all the issues I ran into with the patches patching do_per_function. I'm testing that for trunk/4.9 now with possible cleanups done on trunk only.