On 12/17/2015 03:51 PM, Richard Biener wrote:
On Thu, 17 Dec 2015, Yury Gribov wrote:
On 12/17/2015 02:57 PM, Richard Biener wrote:
On Thu, 17 Dec 2015, Yury Gribov wrote:
That's an interesting one. The original comparison function assumes that
operand_equal_p(a,b) is true iff compare_tree(a, b) == 0.
Unfortunately that's not true (functions are written by different
authors).
This causes subtle violation of transitiveness.
I believe removing operand_equal_p should preserve the intended semantics
(same approach taken in another comparison function in this file -
comp_dr_with_seg_len_pair).
Cc-ing Cong Hou and Richard who are the authours.
I don't think the patch is good. compare_tree really doesn't expect
equal elements (and it returning zero is bad or a bug).
Hm but that's how it's used in other comparator in this file
(comp_dr_with_seg_len_pair).
But for sure
switch (code)
{
/* For const values, we can just use hash values for comparisons. */
case INTEGER_CST:
case REAL_CST:
case FIXED_CST:
case STRING_CST:
case COMPLEX_CST:
case VECTOR_CST:
{
hashval_t h1 = iterative_hash_expr (t1, 0);
hashval_t h2 = iterative_hash_expr (t2, 0);
if (h1 != h2)
return h1 < h2 ? -1 : 1;
break;
}
doesn't detect un-equality correctly (it assumes the hash is
collision-free).
Also note that operator== of dr_with_seg_len again also uses
operand_equal_p (plus compare_tree).
IMHO compare_tree should be cleaned up with respect to what
trees we expect here (no REAL_CSTs for example) and properly
do comparisons.
But it's also
"lazy" in that it will return 0 when it hopes a further disambiguation
inside dr_group_sort_cmp on a different field will eventually lead to
a non-zero compare_tree.
So eventually if compare_tree returns zero we have to fall back to the
final disambiguator using gimple_uid.
That said, I'd like to see the testcase where you observe an
intransitive comparison.
Let me dig my debugging logs (I'll send detailed repro tomorrow).
Added home address.