https://gcc.gnu.org/g:ef5d3579596127f21ee50500427dfef11db79bcf

commit r17-4400-gef5d3579596127f21ee50500427dfef11db79bcf
Author: Andrew MacLeod <[email protected]>
Date:   Wed Sep 16 06:48:31 2026 -0400

    Never record VREL_UNDEFINED in a relation chain.
    
    VREL_UNDEFINED should never be entered into a relation chain.  Any
    attempt to do so indicates an unreachable block, and may affect further
    searches.
    
    Assisted-By: Claude Opus 5
    
            gcc/
            * value-relation.cc (dom_oracle::record): Do not record
            VREL_UNDEFINED.
            (dom_oracle::search_and_merge_relation): Likewise.
            (path_oracle::record): Likewise.

Diff:
---
 gcc/value-relation.cc | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/gcc/value-relation.cc b/gcc/value-relation.cc
index 69b4364b59ad..0eb6bdec75fa 100644
--- a/gcc/value-relation.cc
+++ b/gcc/value-relation.cc
@@ -1369,6 +1369,10 @@ dom_oracle::record (basic_block bb, relation_kind k, 
tree op1, tree op2)
   if (op1 == op2)
     return false;
 
+  // Do not register an impossible relation.
+  if (k == VREL_UNDEFINED)
+    return false;
+
   // Equivalencies are handled by the equivalence oracle.
   if (relation_equiv_p (k))
     return equiv_oracle::record (bb, k, op1, op2);
@@ -1456,7 +1460,9 @@ relation_chain *
 dom_oracle::search_and_merge_relation (basic_block bb, relation_kind k,
                                       tree op1, tree op2)
 {
-  gcc_checking_assert (k != VREL_VARYING && k != VREL_EQ);
+  // Check for invalid relations to register.
+  gcc_checking_assert (k != VREL_VARYING && k != VREL_UNDEFINED
+                      && k != VREL_EQ);
 
   relation_chain *ptr;
   relation_kind curr = find_relation_block (bb->index, op1, op2, &ptr);
@@ -1464,6 +1470,11 @@ dom_oracle::search_and_merge_relation (basic_block bb, 
relation_kind k,
   // If there is an existing relation in this block, just intersect with it.
   if (curr != VREL_VARYING)
     {
+      // If K contradicts what is already recorded, the block is unreachable.
+      // Leave the existing relation alone rather than replacing it with
+      // UNDEFINED, matching what the dominator merge below does.
+      if (relation_intersect (curr, k) == VREL_UNDEFINED)
+       return NULL;
       // If there was no change, return no record.
       value_relation vr (k, op1, op2);
       if (!ptr->intersect (vr))
@@ -2071,6 +2082,10 @@ path_oracle::record (basic_block bb, relation_kind k, 
tree ssa1, tree ssa2)
   if (curr != VREL_VARYING)
     k = relation_intersect (curr, k);
 
+  // Do not register an impossible relation.
+  if (k == VREL_UNDEFINED)
+    return false;
+
   bool ret;
   if (k == VREL_EQ)
     ret = register_equiv (bb, ssa1, ssa2);

Reply via email to