diff --git a/gcc/gimple-range-gori.cc b/gcc/gimple-range-gori.cc index 6dc15a0ce3f..c37e54bcf84 100644 --- a/gcc/gimple-range-gori.cc +++ b/gcc/gimple-range-gori.cc @@ -1142,7 +1142,10 @@ gori_compute::compute_operand1_range (vrange &r, // If op1 == op2, create a new trio for just this call. if (op1 == op2 && gimple_range_ssa_p (op1)) - trio = relation_trio (trio.lhs_op1 (), trio.lhs_op2 (), VREL_EQ); + { + relation_kind k = get_identity_relation (op1, op1_range); + trio = relation_trio (trio.lhs_op1 (), trio.lhs_op2 (), k); + } if (!handler.calc_op1 (r, lhs, op2_range, trio)) return false; } @@ -1218,7 +1221,10 @@ gori_compute::compute_operand2_range (vrange &r, // If op1 == op2, create a new trio for this stmt. if (op1 == op2 && gimple_range_ssa_p (op1)) - trio = relation_trio (trio.lhs_op1 (), trio.lhs_op2 (), VREL_EQ); + { + relation_kind k = get_identity_relation (op1, op1_range); + trio = relation_trio (trio.lhs_op1 (), trio.lhs_op2 (), k); + } // Intersect with range for op2 based on lhs and op1. if (!handler.calc_op2 (r, lhs, op1_range, trio)) return false; diff --git a/gcc/value-relation.cc b/gcc/value-relation.cc index 7df2cd6e961..f2c668a0193 100644 --- a/gcc/value-relation.cc +++ b/gcc/value-relation.cc @@ -183,6 +183,20 @@ relation_transitive (relation_kind r1, relation_kind r2) return relation_kind (rr_transitive_table[r1][r2]); } +// When operands of a statement are identical ssa_names, return the +// approriate relation between operands for NAME == NAME, given RANGE. +// +relation_kind +get_identity_relation (tree name, vrange &range ATTRIBUTE_UNUSED) +{ + // Return VREL_UNEQ when it is supported for floats as appropriate. + if (frange::supports_p (TREE_TYPE (name))) + return VREL_EQ; + + // Otherwise return VREL_EQ. + return VREL_EQ; +} + // This vector maps a relation to the equivalent tree code. static const tree_code relation_to_code [VREL_LAST] = { diff --git a/gcc/value-relation.h b/gcc/value-relation.h index be6e277421b..f00f84f93b6 100644 --- a/gcc/value-relation.h +++ b/gcc/value-relation.h @@ -91,6 +91,9 @@ inline bool relation_equiv_p (relation_kind r) void print_relation (FILE *f, relation_kind rel); +// Return relation for NAME == NAME with RANGE. +relation_kind get_identity_relation (tree name, vrange &range); + class relation_oracle { public: