The following program: " cat -n main.c 1 #include <stdio.h> 2 3 4 int main() 5 { 6 __label__ lab3; 7 __label__ lab4; 8 9 int i = 0; 10 11 i++; 12 lab1: fprintf(stderr, "i=%d\n", i); 13 14 i++; 15 lab2: fprintf(stderr, "i=%d\n", i); 16 17 i++; 18 lab3: fprintf(stderr, "i=%d\n", i); 19 20 i++; 21 lab4: fprintf(stderr, "i=%d\n", i); 22 23 fprintf(stderr, "&&lab1=%08x\n", (unsigned)&&lab1); 24 fprintf(stderr, "&&lab2=%08x\n", (unsigned)&&lab2); 25 fprintf(stderr, "&&lab3=%08x\n", (unsigned)&&lab3); 26 fprintf(stderr, "&&lab4=%08x\n", (unsigned)&&lab4); 27 28 return 0; 29 } "
after being compiled as /mnt/sdb8/sergei/AFSWD_debug/install/gcc-4.3.3/binsh/gcc -O1 -Wall -Wextra main.c -o main_-O1 produces: " ./main_-O1 i=1 i=2 i=3 i=4 &&lab1=08048435 &&lab2=08048452 &&lab3=0804846f &&lab4=0804848c " which is correct in a sense all the labels have different addresses. When compiled as /mnt/sdb8/sergei/AFSWD_debug/install/gcc-4.3.3/binsh/gcc -O2 -Wall -Wextra main.c -c -o main_-O2.o it produces " ./main_-O2 i=1 i=2 i=3 i=4 &&lab1=08048430 &&lab2=08048430 &&lab3=08048430 &&lab4=08048430 ", which is wrong in the sense all the addresses are the same. Please note that labels have intentionally been put against 'fprintf' statements which are _not_ eliminated by optimization ('objdump' easily proves this). I have read pages ## 246 .. 248 in http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc.pdf , they don't mention optimizations (or did I miss it ?). The problem also exists with gcc-3.4.6. -- Summary: -O2 and higher causes wrong label address calculation Product: gcc Version: 4.3.3 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: sergstesh at yahoo dot com GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: i686-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40115