> Hello,
> 
> and ping please.  This is now also a fix for PR 123619.
> 

> > gcc/ChangeLog:
> >
> > 2025-12-05  Martin Jambor  <[email protected]>
> >
> >     * cgraph.h (ipa_polymorphic_call_context::equal_to): Add parametr
> >     strict_speculation.
> >     * ipa-polymorphic-call.cc (ipa_polymorphic_call_context::equal_to):
> >     Likewise.
> >     * ipa-cp.cc (values_equal_for_ipcp_p): Pass true to strict_speculation
> >     of ipa_polymorphic_call_context::equal_to.

So the problem here is that iterative dataflow does not stop, since
merging is not implemented monotonously.

The problem seems to be that we keep track about consistency of the
speculation and ignore it, if it makes no sense.  However if we
encounter possible dynamic type change we remove non-speculative info
which magically makes speculation come back causing the
non-monotonicity.

Before type chane happens, we know that specualtion is already wrong, so
we should drop it.  I am testing the following


diff --git a/gcc/ipa-polymorphic-call.cc b/gcc/ipa-polymorphic-call.cc
index 243a2f13cdc..3ce9e743a05 100644
--- a/gcc/ipa-polymorphic-call.cc
+++ b/gcc/ipa-polymorphic-call.cc
@@ -2363,7 +2363,18 @@ 
ipa_polymorphic_call_context::possible_dynamic_type_change (bool in_poly_cdtor,
                                                            tree otr_type)
 {
   if (dynamic)
-    make_speculative (otr_type);
+    {
+      /* See if existing speculation was inconsistent before type change.
+         If so drop it first, so we do not lose track about it being
+        impossible.  */
+      if (speculative_outer_type
+         && !speculation_consistent_p (speculative_outer_type,
+                                       speculative_offset,
+                                       speculative_maybe_derived_type,
+                                       otr_type))
+       clear_speculation ();
+      make_speculative (otr_type);
+    }
   else if (in_poly_cdtor)
     maybe_in_construction = true;
 }

Reply via email to