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. --- 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
