void bar (char *); void baz (int); char a[10]; void __attribute__((noinline)) bar (char *p) { asm volatile ("" : : "r" (p) : "memory"); }
void __attribute__((noinline)) baz (int i) { asm volatile ("" : : "r" (i) : "memory"); } int __attribute__((noinline)) foo (int i) { bar (a); baz (a[i + 1]); return i; } int main (void) { foo (7); return 0; } on x86_64-linux -O2 -g has wrong location info for i during epilogue - i is said to live in %edi initially (correct), then in %ebx starting from middle of the first call (also correct), but at the end of function it does: movl %ebx, %eax popq %rbx and of course the restoring of %rbx invalidates the location (so var-tracking should say that i now lives in %eax instead). -- Summary: var-tracking fails to notice a value change Product: gcc Version: 4.5.0 Status: UNCONFIRMED Keywords: wrong-debug Severity: normal Priority: P3 Component: debug AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: jakub at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43176