2013-02-21 Martin Jambor <mjambor@suse.cz>
+ PR tree-optimization/56310
+ * ipa-cp.c (agg_replacements_to_vector): New parameter index, copy
+ only matching indices and non-negative final offsets.
+ (intersect_aggregates_with_edge): Pass src_idx to
+ agg_replacements_to_vector. Pass src_idx insstead of index to
+ intersect_with_agg_replacements.
+
+2013-02-21 Martin Jambor <mjambor@suse.cz>
+
* ipa-cp.c (good_cloning_opportunity_p): Dump the real threshold
instead of hard-wired defaults.
vector result while subtracting OFFSET from the individual value offsets. */
static vec<ipa_agg_jf_item_t>
-agg_replacements_to_vector (struct cgraph_node *node, HOST_WIDE_INT offset)
+agg_replacements_to_vector (struct cgraph_node *node, int index,
+ HOST_WIDE_INT offset)
{
struct ipa_agg_replacement_value *av;
vec<ipa_agg_jf_item_t> res = vNULL;
for (av = ipa_get_agg_replacements_for_node (node); av; av = av->next)
+ if (av->index == index
+ && (av->offset - offset) >= 0)
{
struct ipa_agg_jf_item item;
gcc_checking_assert (av->value);
if (agg_pass_through_permissible_p (orig_plats, jfunc))
{
if (!inter.exists ())
- inter = agg_replacements_to_vector (cs->caller, 0);
+ inter = agg_replacements_to_vector (cs->caller, src_idx, 0);
else
intersect_with_agg_replacements (cs->caller, src_idx,
&inter, 0);
if (caller_info->ipcp_orig_node)
{
if (!inter.exists ())
- inter = agg_replacements_to_vector (cs->caller, delta);
+ inter = agg_replacements_to_vector (cs->caller, src_idx, delta);
else
- intersect_with_agg_replacements (cs->caller, index, &inter,
+ intersect_with_agg_replacements (cs->caller, src_idx, &inter,
delta);
}
else