[Bug target/40668] 64-bit sparc miscompiles memcpy of argument inside switch
mikpe at it dot uu dot se
gcc-bugzilla@gcc.gnu.org
Tue Jul 7 11:36:00 GMT 2009
------- Comment #3 from mikpe at it dot uu dot se 2009-07-07 11:35 -------
Confirmed, with gcc-4.3-20090705 it works, with gcc-4.4-20090630 it fails.
Compiling with -S and comparing the .s files it looks like 4.4 completely
mis-schedules the code for put_uint32:
put_uint32:
.register %g2, #scratch
.register %g3, #scratch
ldub [%sp+2175], %g1
ldub [%sp+2176], %g3
ldub [%sp+2177], %g2
ldub [%sp+2178], %g4
st %o0, [%sp+2175]
stb %g4, [%o1+3]
stb %g1, [%o1]
stb %g3, [%o1+1]
jmp %o7+8
stb %g2, [%o1+2]
Notice how the store of %o0 to the four bytes at %sp+2175 comes after the
corresponding byte loads, so %g1 to %g4 are loaded with garbage, likely zeroes.
In contrast, gcc-4.3 generates the store before the loads:
put_uint32:
.register %g2, #scratch
.register %g3, #scratch
st %o0, [%sp+2175]
ldub [%sp+2176], %g3
ldub [%sp+2177], %g4
ldub [%sp+2178], %g2
ldub [%sp+2175], %g1
stb %g2, [%o1+3]
stb %g1, [%o1]
stb %g3, [%o1+1]
jmp %o7+8
stb %g4, [%o1+2]
--
mikpe at it dot uu dot se changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |mikpe at it dot uu dot se
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40668
More information about the Gcc-bugs
mailing list