static bool gate_call_cdce (void) { /* The limit constants used in the implementation assume IEEE floating point format. Other formats can be supported in the future if needed. */ return flag_tree_builtin_call_dce != 0 && optimize_function_for_speed_p (cfun); }
/* Return true if this NODE is viable candidate for cloning. */ static bool ipcp_cloning_candidate_p (struct cgraph_node *node) { int n_calls = 0; int n_hot_calls = 0; gcov_type direct_call_sum = 0; struct cgraph_edge *e; /* We never clone functions that are not visible from outside. FIXME: in future we should clone such functions when they are called with different constants, but current ipcp implementation is not good on this. */ if (cgraph_only_called_directly_p (node) || !node->analyzed) return false; /* When function address is taken, we are pretty sure it will be called in hidden way. */ if (node->address_taken) { if (dump_file) fprintf (dump_file, "Not considering %s for cloning; address is taken.\n", cgraph_node_name (node)); return false; } if (cgraph_function_body_availability (node) <= AVAIL_OVERWRITABLE) { if (dump_file) fprintf (dump_file, "Not considering %s for cloning; body is overwritable.\n", cgraph_node_name (node)); return false; } if (!ipcp_versionable_function_p (node)) { if (dump_file) fprintf (dump_file, "Not considering %s for cloning; body is not versionable.\n", cgraph_node_name (node)); return false; } for (e = node->callers; e; e = e->next_caller) { direct_call_sum += e->count; n_calls ++; if (cgraph_maybe_hot_edge_p (e)) n_hot_calls ++; } if (!n_calls) { if (dump_file) fprintf (dump_file, "Not considering %s for cloning; no direct calls.\n", cgraph_node_name (node)); return false; } if (node->local.inline_summary.self_size < n_calls) { if (dump_file) fprintf (dump_file, "Considering %s for cloning; code would shrink.\n", cgraph_node_name (node)); return true; } if (!flag_ipa_cp_clone) { if (dump_file) fprintf (dump_file, "Not considering %s for cloning; -fipa-cp-clone disabled.\n", cgraph_node_name (node)); return false; } if (!optimize_function_for_speed_p (DECL_STRUCT_FUNCTION (node->decl))) { if (dump_file) fprintf (dump_file, "Not considering %s for cloning; optimizing it for size.\n", cgraph_node_name (node)); return false; } /* When profile is available and function is hot, propagate into it even if calls seems cold; constant propagation can improve function's speed significantly. */ if (max_count) { if (direct_call_sum > node->count * 90 / 100) { if (dump_file) fprintf (dump_file, "Considering %s for cloning; usually called directly.\n", cgraph_node_name (node)); return true; } } if (!n_hot_calls) { if (dump_file) fprintf (dump_file, "Not considering %s for cloning; no hot calls.\n", cgraph_node_name (node)); return false; } if (dump_file) fprintf (dump_file, "Considering %s for cloning.\n", cgraph_node_name (node)); return true; }