aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2024-06-23 14:37:53 +0200
committerRichard Biener <rguenther@suse.de>2024-06-24 09:18:02 +0200
commitae13af26060eb686418ea9c9d455cd665049402d (patch)
treec7366b7af35eebf636a1ad6b81c15f2343445db7 /gcc
parent6274f10318d05311f31147c895f76a01aec37830 (diff)
downloadgcc-ae13af26060eb686418ea9c9d455cd665049402d.zip
gcc-ae13af26060eb686418ea9c9d455cd665049402d.tar.gz
gcc-ae13af26060eb686418ea9c9d455cd665049402d.tar.bz2
tree-optimization/115599 - reassoc qsort comparator issue
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/tree-ssa-reassoc.cc13
1 files changed, 10 insertions, 3 deletions
diff --git a/gcc/tree-ssa-reassoc.cc b/gcc/tree-ssa-reassoc.cc
index 4d9f521..d743522 100644
--- a/gcc/tree-ssa-reassoc.cc
+++ b/gcc/tree-ssa-reassoc.cc
@@ -6414,10 +6414,17 @@ compare_repeat_factors (const void *x1, const void *x2)
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