This could help in reducing the amount of work for bounds checking. $ cat mymax.c #include <stdlib.h> #include <stdio.h>
int main() { char *p; int i,j,n; scanf("%d",&n); j = 0; for (i=0; i<n; i++) { if (j < i) j = i; } printf("%d\n",j); return 0; } $ gcc -g -funroll-all-loops -S -O3 -fdump-tree-optimized mymax.c still does the do loop: <L13>:; j = 0; i = 0; <L0>:; j = MAX_EXPR <j, i>; i = i + 1; if (i != n.10) goto <L0>; else goto <L4>; when the loop could be optimized to if (n <= 0) j = 0; else j = n-1; -- Summary: Move maximum out of a loop Product: gcc Version: 4.1.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: enhancement Priority: P2 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: tkoenig at gcc dot gnu dot org CC: gcc-bugs at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21278