Hi, IPA-CP currently assumes that cloning estimates always have some positive size cost. However, there are apparently situations in which estimate_ipcp_clone_size_and_time does return zero size and which then mostly lead to divisions by zero or failed asserts. This patch avoids that by simply bumping the sizes to 1 in those cases.
Bootstrapped and tested on x86_64-linux. OK for trunk? Thanks, Martin 2011-12-12 Martin Jambor <mjam...@suse.cz> PR tree-optimization/51362 * ipa-cp.c (estimate_local_effects): When estimated size of a specialized clone is zero, bump it to one. * testsuite/gcc.dg/ipa/pr51362.c: New test. Index: src/gcc/ipa-cp.c =================================================================== --- src.orig/gcc/ipa-cp.c +++ src/gcc/ipa-cp.c @@ -1409,6 +1409,14 @@ estimate_local_effects (struct cgraph_no + devirtualization_time_bonus (node, known_csts, known_binfos) + removable_params_cost + emc; + gcc_checking_assert (size >=0); + /* The inliner-heuristics based estimates may think that in certain + contexts some functions do not have any size at all but we want + all specializations to have at least a tiny cost, not least not to + divide by zero. */ + if (size == 0) + size = 1; + if (dump_file && (dump_flags & TDF_DETAILS)) { fprintf (dump_file, " - estimates for value "); Index: src/gcc/testsuite/gcc.dg/ipa/pr51362.c =================================================================== --- /dev/null +++ src/gcc/testsuite/gcc.dg/ipa/pr51362.c @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fipa-cp -fipa-cp-clone" } */ + +int +baz (void) +{ + return 0; +} + +int make_mess; + +__attribute__ ((noinline)) +int bar (int x, int (*f) (void)) +{ + return f (); +} + +int +foo (void) +{ + return bar (1, baz); +}