Provide a routine for NAME == NAME relation.
We've been assuming x == x s VREL_EQ in GORI, but this is not always going to be true with floating point. Provide an API to return the relation. * gimple-range-gori.cc (gori_compute::compute_operand1_range): Use identity relation. (gori_compute::compute_operand2_range): Ditto. * value-relation.cc (get_identity_relation): New. * value-relation.h (get_identity_relation): New prototype.
This commit is contained in:
parent
c47ceea551
commit
33f080a7f1
3 changed files with 25 additions and 2 deletions
|
@ -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;
|
||||
|
|
|
@ -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] = {
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Add table
Reference in a new issue