diff options
author | Martin Jambor <mjambor@suse.cz> | 2013-02-21 17:08:51 +0100 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2013-02-21 17:08:51 +0100 |
commit | 0fd44da38705c491a51156ca623ad18c949cf772 (patch) | |
tree | 6b3cf574a28b6b5fe93dee0bb9118cfee4eb65bc | |
parent | 7a92038b78ce817067aeaa5ed0a8b83c3da97834 (diff) | |
download | gcc-0fd44da38705c491a51156ca623ad18c949cf772.zip gcc-0fd44da38705c491a51156ca623ad18c949cf772.tar.gz gcc-0fd44da38705c491a51156ca623ad18c949cf772.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/ipa-cp.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ipa/pr56310.C | 36 |
4 files changed, 57 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a688247..27e8428 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 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. diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 45c1093..9a67f3c 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 90df864..8f0ec27 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +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 diff --git a/gcc/testsuite/g++.dg/ipa/pr56310.C b/gcc/testsuite/g++.dg/ipa/pr56310.C new file mode 100644 index 0000000..af6979c --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr56310.C @@ -0,0 +1,36 @@ +/* { 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); +} |