Hi, while removing use of optimize_function_for_size_p from the ipa-inliner (since we already check cgraph_maybe_hot_edge_p that include the test), I noticed that optimize_function_for_size_p (DECL_STRUCT_FUNCTION (node->decl)) won't give the expected results on WPA when DECL_STRUCT_FUNCTION is NULL. Fixed by adding cgraph_optimize_for_size_p.
Bootstrapped/regtested x86_64-linux. Honza * cgraph.h (cgraph_optimize_for_size_p): Declare. * ipa-cp.c (ipcp_insert_stage): Use cgraph_optimize_for_size_p. * predict.c (cgraph_optimize_for_size_p): Break out from ... (optimize_function_for_size_p) ... here. Index: cgraph.h =================================================================== *** cgraph.h (revision 172709) --- cgraph.h (working copy) *************** bool cgraph_comdat_can_be_unshared_p (st *** 656,661 **** --- 656,662 ---- /* In predict.c */ bool cgraph_maybe_hot_edge_p (struct cgraph_edge *e); + bool cgraph_optimize_for_size_p (struct cgraph_node *); /* In varpool.c */ extern GTY(()) struct varpool_node *varpool_nodes_queue; Index: ipa-cp.c =================================================================== *** ipa-cp.c (revision 172709) --- ipa-cp.c (working copy) *************** ipcp_insert_stage (void) *** 1410,1416 **** if (new_size + growth > max_new_size) break; if (growth ! && optimize_function_for_size_p (DECL_STRUCT_FUNCTION (node->decl))) { if (dump_file) fprintf (dump_file, "Not versioning, cold code would grow"); --- 1410,1416 ---- if (new_size + growth > max_new_size) break; if (growth ! && cgraph_optimize_for_size_p (node)) { if (dump_file) fprintf (dump_file, "Not versioning, cold code would grow"); Index: predict.c =================================================================== *** predict.c (revision 172709) --- predict.c (working copy) *************** maybe_hot_edge_p (edge e) *** 196,202 **** --- 196,204 ---- return maybe_hot_frequency_p (EDGE_FREQUENCY (e)); } + /* Return true in case BB is probably never executed. */ + bool probably_never_executed_bb_p (const_basic_block bb) { *************** probably_never_executed_bb_p (const_basi *** 209,214 **** --- 211,229 ---- return false; } + /* Return true if NODE should be optimized for size. */ + + bool + cgraph_optimize_for_size_p (struct cgraph_node *node) + { + if (optimize_size) + return true; + if (node && (node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED)) + return true; + else + return false; + } + /* Return true when current function should always be optimized for size. */ bool *************** optimize_function_for_size_p (struct fun *** 220,230 **** return true; if (!fun || !fun->decl) return false; ! node = cgraph_get_node (fun->decl); ! if (node && (node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED)) ! return true; ! else ! return false; } /* Return true when current function should always be optimized for speed. */ --- 235,241 ---- return true; if (!fun || !fun->decl) return false; ! return cgraph_optimize_for_size_p (cgraph_get_node (fun->decl)); } /* Return true when current function should always be optimized for speed. */