On Wed, Jan 20, 2016 at 9:32 AM, Eric Botcazou <[email protected]> wrote:
> Hi,
>
> this patch from Jan:
> https://gcc.gnu.org/ml/gcc-patches/2015-03/msg01388.html
> totally disabled cross-language inlining into Ada without notice, by adding a
> check that always fails when the language of the callee is not Ada...
> The attached patch simply deletes this new check to restore the initial state.
>
> Tested on x86_64-suse-linux, OK for the mainline?
I think the intent was to allow inlining a non-throwing -fnon-call-exceptions
function into a not -fnon-call-exceptions function but _not_ a
non-throwing not -fnon-call-exceptions function (that "not-throwing" is
basically a non-sensible test) into a -fnon-call-exceptions function
because that may now miss EH edges.
So the test looks conservatively correct to me - we can't reliably
check whether the callee throws if the IL now were -fnon-call-exceptions
(which we know the caller is after !opt_for_fn (callee->decl,
flag_non_call_exceptions)
So - this doesn't look correct to me.
OTOH
static inline int foo (int a, int *b)
{
return a / *b;
}
int __attribute__((optimize("non-call-exceptions")))
bar (int *p, int *b)
{
try
{
return foo (*p, b);
}
catch (...)
{
return 0;
}
}
happily inlines foo with your patch but doesn't ICE during stmt verification.
So maybe we're not verifying that "correctness" part - ah, yeah, I think
we changed it to only verify EH tree vs. stmt consistency but not the
other way around.
Not sure if we already have a C++ testcase like the above, if not can
you add this one to the torture?
Given this I wonder if we can also change check_match to check_maybe_up,
basically handle -fnon-call-exceptions the same as -fexceptions.
Thanks,
Richard.
>
> 2016-01-20 Eric Botcazou <[email protected]>
>
> * ipa-inline.c (can_inline_edge_p): Back out overzealous check on
> flag_non_call_exceptions compatibility.
>
>
> --
> Eric Botcazou