commit 1f02961b23976d35b10e2399708c6eb00632f9d6 Author: Andrew MacLeod Date: Fri Mar 24 09:18:33 2023 -0400 Don't interpret contents of a value_relation record. before floating point relations were added, we tried to sanitize value-relation records to not include non-sensensical records... ie x != x or x < x. INstead, we made a VREL_VARYING record with no operands. When floating point relations were supported, some of these were no longer non-sensical, AND we expanded the use of value_relation records into GORI. As a result, this sanitization is no longer needed. The Oracle does not create records with op1 == op2, so its only within GORI that these records can exist, and we shouldnt try to interpret them. The bug occurs because the "sanitized" records doesnt set op1 anmd op2, but we have a record so expected it to be set. PR tree-optimization/109265 PR tree-optimization/109274 gcc/ * value-relation.h (value_relation::set_relation): Always create the record that is requested. gcc/testsuite/ * gcc.dg/pr109274.c: New. diff --git a/gcc/testsuite/gcc.dg/pr109274.c b/gcc/testsuite/gcc.dg/pr109274.c new file mode 100644 index 00000000000..5dbc0232f8e --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr109274.c @@ -0,0 +1,16 @@ +/* PR tree-optimization/109274 */ +/* { dg-do compile } */ +/* { dg-options "-O2 " } */ + +float a, b, c; +int d; +float bar (void); + +void +foo (void) +{ + a = 0 * -(2.0f * c); + d = a != a ? 0 : bar (); + b = c; +} + diff --git a/gcc/value-relation.h b/gcc/value-relation.h index 36a75862cc7..3177ecb1ad0 100644 --- a/gcc/value-relation.h +++ b/gcc/value-relation.h @@ -445,13 +445,6 @@ value_relation::set_relation (relation_kind r, tree n1, tree n2) { gcc_checking_assert (TREE_CODE (n1) == SSA_NAME && TREE_CODE (n2) == SSA_NAME); - if (n1 == n2 && r != VREL_EQ) - { - related = VREL_VARYING; - name1 = NULL_TREE; - name2 = NULL_TREE; - return; - } related = r; name1 = n1; name2 = n2;