The compare_repeat_factors comparator fails qsort checking eventually
because it uses rf2->rank - rf1->rank to compare unsigned numbers
which causes issues for ranks that interpret negative as signed.
Fixed by re-writing the obvious way. I've also fixed the count
comparison which suffers from truncation as count is 64bit signed
while the comparator result is 32bit int (that's a lot less likely
to hit in practice though).
The testcase from the PR is too large to include.
PR tree-optimization/115599
* tree-ssa-reassoc.cc (compare_repeat_factors): Use explicit
compares to avoid truncations.
const repeat_factor *rf1 = (const repeat_factor *) x1;
const repeat_factor *rf2 = (const repeat_factor *) x2;
- if (rf1->count != rf2->count)
- return rf1->count - rf2->count;
+ if (rf1->count < rf2->count)
+ return -1;
+ else if (rf1->count > rf2->count)
+ return 1;
+
+ if (rf1->rank < rf2->rank)
+ return 1;
+ else if (rf1->rank > rf2->rank)
+ return -1;
- return rf2->rank - rf1->rank;
+ return 0;
}
/* Look for repeated operands in OPS in the multiply tree rooted at