> Hi,
>
> PR 123629 is a somewhat complicated situation. IPA-CP clones for a
> known speculative polymorphic context in a situation when a caller
> bringing the known context has itself already been cloned, and now we
> can determine that the context coming from that clone is not
> speculative (but otherwise the same). This confuses the meet function
> of contexts which gives up and returns a useless context, which in
> turn triggers an assert because the value we originally cloned for is
> nowhere to be found in the data structures which describe what we know
> about the function clone.
>
> This patch changes the meet function so that it can deal with this
> situation. When one of the contexts does not have a certain
> component, the other one is moved to the speculative one.
>
> The patch does not have a testcase, because even though Josef Melcr has
> heroically managed to reduce the original Firefox LTO failure to six
> small files, possibly a lot of work would be needed to make their LTO
> link pass when this is fixed.
>
> The patch has passed bootstrap and testing on x86_64-linux, I have also
> LTO-bootstrapped it with -O3 and profiled-bootstrapped it.
>
> OK for master?
>
> Thanks,
>
> Martin
>
>
> gcc/ChangeLog:
>
> 2026-02-23 Martin Jambor <[email protected]>
>
> PR ipa/123629
> * ipa-polymorphic-call.cc
> (ipa_polymorphic_call_context::meet_with): When an outer context is
> NULL, call make_speculative on the other one.
OK,
thanks!
Honza
> ---
> gcc/ipa-polymorphic-call.cc | 8 +++++---
> 1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/gcc/ipa-polymorphic-call.cc b/gcc/ipa-polymorphic-call.cc
> index 5e53c217e33..b32dc70806f 100644
> --- a/gcc/ipa-polymorphic-call.cc
> +++ b/gcc/ipa-polymorphic-call.cc
> @@ -2482,12 +2482,14 @@ ipa_polymorphic_call_context::meet_with
> (ipa_polymorphic_call_context ctx,
> updated = true;
> }
>
> - /* If call is known to be invalid, we are done. */
> + /* If a certain context is known to be invalid, we can move to comparing
> + speculation. Because the second context might be a certain one which
> can
> + be met with the speculation of the first, make it speculative. */
> if (!outer_type)
> - ;
> + ctx.make_speculative ();
> else if (!ctx.outer_type)
> {
> - clear_outer_type ();
> + make_speculative ();
> updated = true;
> }
> /* If types are known to be same, merging is quite easy. */
> --
> 2.52.0
>