http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59538
--- Comment #7 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Try: // GCC Bug - bug.c // Created by Arsham Skrenes on 2013-12-17 #include <stdio.h> #include <sys/time.h> // Find the NTH prime number SAMPLES times #define NTH 10000 #define SAMPLES 5 int main(void) { struct timeval t1, t2, t3; int i, sample; volatile int keeparound; printf("Generating %d samples...\n", SAMPLES); // i = prime candidate; check = test number (naive algorithm) for (sample = 0; sample < SAMPLES; sample++) { int count = 2, check; gettimeofday(&t1, NULL); for (i = 3; count <= NTH; i++) { for (check = 2; check <= i - 1; check++) { if (i%check == 0) break; } if (check == i) { // found a prime number count++; } } gettimeofday(&t2, NULL); // calculate primes/second for this sample timersub(&t2, &t1, &t3); printf("It took %f seconds to find the %dth prime number.\n", (double)t3.tv_usec / 1000000 + t3.tv_sec, NTH); } // If you uncomment the following line, or compile this code with flag -O1 // or less, it will work correctly... //printf("The %dth prime number is %d\n", NTH, i-1); keeparound = i - 1; return 0; } Which will keep around the final i and not cause any optimizations to happen (well GCC might change around the loop to figure out i only once but that optimization is not done currently but could be in the future).