[Bug tree-optimization/37239] New: peeling last iteration of a <= loop
bonzini at gnu dot org
gcc-bugzilla@gcc.gnu.org
Tue Aug 26 11:35:00 GMT 2008
If the condition of the loop is tested within the loop with == or !=, it may be
beneficial to peel off the final iteration of the loop by changing the
condition to <.
This happens in the attached benchmark's heapsort function where
while ((maxIdx += maxIdx) <= last) {
if (maxIdx != last && numbers[maxIdx] < numbers[maxIdx + 1]) maxIdx++;
if (tmp >= numbers[maxIdx]) break;
numbers[top] = numbers[maxIdx];
top = maxIdx;
}
can become
while ((maxIdx += maxIdx) <= last) {
if (numbers[maxIdx] < numbers[maxIdx + 1]) maxIdx++;
if (tmp >= numbers[maxIdx]) break;
numbers[top] = numbers[maxIdx];
top = maxIdx;
}
if (maxIdx == last && tmp < numbers[maxIdx]) {
numbers[top] = numbers[maxIdx];
top = maxIdx;
}
enabling in turn if-conversion of the first branch.
Performance of the benchmark is (-O3)
basic 2.990
peeling only 2.730
if-conversion only 2.290
peel+if-convert 2.010 (faster than quicksort!!)
ICC does this optimization.
--
Summary: peeling last iteration of a <= loop
Product: gcc
Version: 4.3.2
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: normal
Priority: P3
Component: tree-optimization
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: bonzini at gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37239
More information about the Gcc-bugs
mailing list