This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug regression/38674] New: optimization bug.
- From: "gilles dot chanteperdrix at xenomai dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 30 Dec 2008 16:12:50 -0000
- Subject: [Bug regression/38674] New: optimization bug.
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
When compiling the following code with -O2:
#include <stdio.h>
static unsigned long long __attribute__((noinline)) f(void *ptr, unsigned long
long ull)
{
register unsigned long __r2 __asm__ ("r2") = (unsigned long) (&ull);
__asm__ __volatile__ ("" : "+r" (__r2));
return * (unsigned long long *) __r2;
}
int main(void)
{
fprintf(stderr, "f(NULL, 0): %Lu\n", f(NULL, 0));
return 0;
}
we get the following warning:
/tmp/ccJNzMaH.s: Assembler messages:
/tmp/ccJNzMaH.s:21: Warning: source register same as write-back base
And when running the program on target, the printed return value of f is not 0.
A disassembly of f:
000083f4 <f>:
83f4: e24dd008 sub sp, sp, #8 ; 0x8
83f8: e28d2008 add r2, sp, #8 ; 0x8
83fc: e16220f8 strd r2, [r2, #-8]!
8400: e8920003 ldm r2, {r0, r1}
8404: e28dd008 add sp, sp, #8 ; 0x8
8408: e12fff1e bx lr
shows that r2 seems to be clobbered before its value is saved on stack.
--
Summary: optimization bug.
Product: gcc
Version: 4.3.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: regression
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: gilles dot chanteperdrix at xenomai dot org
GCC target triplet: armeb-unknown-linux-gnueabi
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38674