On Wed, Apr 01, 2020 at 03:36:30PM +0200, Richard Biener wrote:
> @@ -512,7 +512,10 @@ can_inline_edge_by_limits_p (struct cgraph_edge *e, bool 
> report,
>             /* When devirtualization is disabled for callee, it is not safe
>                to inline it as we possibly mangled the type info.
>                Allow early inlining of always inlines.  */
> -           || (!early && check_maybe_down (flag_devirtualize)))
> +           || (!early && check_maybe_down (flag_devirtualize))
> +           /* It's not safe to inline a function where loops maybe
> +              infinite into a function where we assume the reverse.  */
> +           || check_maybe_down (flag_finite_loops))
>       {
>         e->inline_failed = CIF_OPTIMIZATION_MISMATCH;
>         inlinable = false;

Couldn't the above care only if the function has any loops?
Otherwise, won't it prevent cross-language LTO inlining too much?
Or instead of disabling inlining arrange for a safe flag_finite_loops value
for the resulting function (set some flag in cfun of the function that would
be considered together with flag_finite_loops (so that we don't have to
create further OPTIMIZATION_NODEs) and disable finite loops opts if we've
inlined !flag_finite_loops function into flag_finite_loops one)?

        Jakub

Reply via email to