On Tue, Dec 13, 2011 at 2:38 PM, Martin Jambor <mjam...@suse.cz> wrote:
> 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?

Ok.

Thanks,
Richard.

> 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);
> +}

Reply via email to