------- Additional Comments From mostrows at watson dot ibm dot com 2004-10-13 23:11 ------- Subject: Re: const/pure functions result in bad asm
Here is simpler code that demonstrates the problem. Note, no loops involved. Further below is compilation and objdump with and without DBUG. struct thread_info { int preempt_count; }; #ifdef BUG static inline struct thread_info *cti(void) __attribute__((pure)); #else static inline struct thread_info *cti(void); #endif static inline struct thread_info *cti(void) { struct thread_info **ti; __asm__("mr %0,13" : "=r"(ti)); return *ti; } int fn() { int ret = 0; cti()->preempt_count++; ret = cti()->preempt_count++; return ret; } [EMAIL PROTECTED]:~/tools.k42/powerpc/partDeb/os$ powerpc64-linux-g++ - c -o workqueue.o wq.C -O1 [EMAIL PROTECTED]:~/tools.k42/powerpc/partDeb/os$ powerpc64-linux-objdump -d workqueue.o workqueue.o: file format elf64-powerpc Disassembly of section .text: 0000000000000000 <._Z2fnv>: 0: 7d aa 6b 78 mr r10,r13 4: e9 6a 00 00 ld r11,0(r10) 8: 81 2b 00 00 lwz r9,0(r11) c: 39 29 00 01 addi r9,r9,1 10: 91 2b 00 00 stw r9,0(r11) 14: e9 6a 00 00 ld r11,0(r10) 18: 81 2b 00 00 lwz r9,0(r11) 1c: 7d 23 07 b4 extsw r3,r9 20: 39 29 00 01 addi r9,r9,1 24: 91 2b 00 00 stw r9,0(r11) 28: 4e 80 00 20 blr 2c: 00 00 00 00 .long 0x0 30: 00 09 00 00 .long 0x90000 34: 00 00 00 00 .long 0x0 [EMAIL PROTECTED]:~/tools.k42/powerpc/partDeb/os$ powerpc64-linux-g++ - c -o workqueue.o wq.C -O1 -DBUG [EMAIL PROTECTED]:~/tools.k42/powerpc/partDeb/os$ powerpc64-linux-objdump -d workqueue.o workqueue.o: file format elf64-powerpc Disassembly of section .text: 0000000000000000 <._Z2fnv>: 0: 48 00 00 00 b 0 <._Z2fnv> 4: 00 00 00 00 .long 0x0 8: 00 09 00 00 .long 0x90000 c: 00 00 00 00 .long 0x0 -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17972