Commit 0fd44da3 by Martin Jambor Committed by Martin Jambor

re PR tree-optimization/56310 (ICE: in decide_about_value, at ipa-cp.c:3310 with…

re PR tree-optimization/56310 (ICE: in decide_about_value, at ipa-cp.c:3310 with -fipa-cp -fno-early-inlining -fipa-cp-clone --param=ipa-cp-eval-threshold=1)

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.

testsuite/
	* g++.dg/ipa/pr56310.C: New test.

From-SVN: r196207
parent 7a92038b
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.
......
......@@ -2807,12 +2807,15 @@ intersect_with_plats (struct ipcp_param_lattices *plats,
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);
......@@ -2892,7 +2895,7 @@ intersect_aggregates_with_edge (struct cgraph_edge *cs, int index,
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);
......@@ -2925,9 +2928,9 @@ intersect_aggregates_with_edge (struct cgraph_edge *cs, int index,
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
......
2013-02-21 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/56310
* g++.dg/ipa/pr56310.C: New test.
2013-02-21 Janus Weil <janus@gcc.gnu.org>
PR fortran/56385
......
/* { dg-do compile } */
/* { dg-options "-O -fipa-cp -std=gnu++0x -fno-early-inlining -fipa-cp-clone --param=ipa-cp-eval-threshold=1" } */
void bar (void *, void *);
struct C
{
constexpr C ():p (0)
{
}
void *get ()
{
return p;
}
void *p;
};
struct B:C
{
};
struct A
{
void f (B * x, B * y)
{
bar (x->get (), y->get ());
}
};
void
foo ()
{
A a;
B b;
a.f (&b, &b);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment