https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108552
--- Comment #19 from Uroš Bizjak <ubizjak at gmail dot com> --- Some further analysis: pretmp_94 = __gcov0.prep_compound_page[7]; <-- _179 = pretmp_94 + 1; <-- ivtmp.1725_211 = (unsigned long long) _179; _135 = (unsigned int) nr_pages_11; _134 = _135 + 4294967294; <-- _132 = (unsigned long long) _134; <-- _89 = (unsigned long long) pretmp_94; <-- _76 = _89 + 2; <- _19 = _76 + _132; <- And the loop exit condition is: # ivtmp.1725_77 = PHI <ivtmp.1725_69(9), ivtmp.1725_211(8)> ... ivtmp.1725_69 = ivtmp.1725_77 + 1; And the loop exit condition is: if (_19 != ivtmp.1725_69) So, both ivtmp and _19 are calculated from the value at __gcov0.prep_compound_page. But as shown in Comment #15, we have two separate reads from the location, the compiler assumes that the value there is invariant, which is probably not the case.