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);
