On Wed, Jun 25, 2003 at 09:27:33AM +0100, Philip Blundell wrote: > On Thu, 2003-06-19 at 16:26, Bill Allombert wrote: > > Package: gcc-3.3 > > Version: 1:3.3-3 > > Severity: normal > > > > Dear GCC maintainers, > > > > gcc 3.3 (1:3.3ds9-3) miscompile pari (2.1.5) on arm with -O3, whereas > > gcc 3.2 (3.2.3 20030331) worked fine. > > > > With -O2 gcc 3.3 works fine also > > > > The preprocessed miscompiled file is available at > > http://people.debian.org/~ballombe/misc/init.i.gz > > Thanks for your report. Can you give any details of the miscompilation?
Well, it look like return statement are uncorrectly optimised with -O3: The following file exhibit the problem: ----test.c-------- typedef long *GEN; #define typ(x) ((((long)(x))&1)? 0: (((unsigned long) ((GEN) (x))[0]) >> 24)) GEN powrealraw(GEN x, long n); GEN powraw(GEN x, long n) { if (typ(x)==16) return powrealraw(x,n); else return powrealraw(x,n); } ------------------ Using a intermediary variable work around the problem: GEN z=(typ(x)==16)? powrealraw(x,n): powrealraw(x,n); return z; Above is the diff of the asm file: -O2 test2.S -O3 test.S --- test2.S 2003-06-25 20:05:52.000000000 +0000 +++ test.S 2003-06-25 20:05:41.000000000 +0000 @@ -12,8 +12,8 @@ mov r2, r0 mov ip, r1 bne .L2 - ldrb r3, [r0, #3] @ zero_extendqisi2 - cmp r3, #16 + ldrb lr, [r0, #3] @ zero_extendqisi2 + cmp lr, #16 beq .L4 .L2: mov r0, r2 Here the supposed buggy test.S: --test.S------------------------- .file "test.c" .text .align 2 .global powraw .type powraw, %function powraw: @ args = 0, pretend = 0, frame = 0 @ frame_needed = 0, uses_anonymous_args = 0 @ link register save eliminated. tst r0, #1 @ lr needed for prologue mov r2, r0 mov ip, r1 bne .L2 ldrb lr, [r0, #3] @ zero_extendqisi2 cmp lr, #16 beq .L4 .L2: mov r0, r2 mov r1, ip .L4: b powrealraw .size powraw, .-powraw .ident "GCC: (GNU) 3.3 (Debian)" ------------------------------ A wild guess : '@ lr needed for prologue' mean that lr must not be clobbered but 'ldrb lr, [r0, #3]' clobber it (??) Cheers, -- Bill. <[EMAIL PROTECTED]> Imagine a large red swirl here.