This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/23444] New: Volatile register access incorrectly optimized
- From: "oakad at yahoo dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 17 Aug 2005 15:43:15 -0000
- Subject: [Bug c/23444] New: Volatile register access incorrectly optimized
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
For a code:
//------------
void board_init_f (ulong bootflag)
{
register volatile gd_t *gd asm ("r29");
bd_t *bd;
ulong len, addr, addr_sp;
gd_t *id;
init_fnc_t **init_fnc_ptr;
gd=0xff55ff55;
__asm__ __volatile__("or 29, 29, 29");
memset ((void *) gd, 0, sizeof (gd_t));
........
//------------
the following assembly is generated:
//------------
fff88ec8 <board_init_f>:
fff88ec8: 94 21 ff d0 stwu r1,-48(r1)
fff88ecc: 7c 08 02 a6 mflr r0
fff88ed0: be e1 00 0c stmw r23,12(r1)
fff88ed4: 90 01 00 34 stw r0,52(r1)
fff88ed8: 42 9f 00 05 bcl- 20,4*cr7+so,fff88edc<board_init_f+0x14>
fff88edc: 7f c8 02 a6 mflr r30
fff88ee0: 80 1e ff e8 lwz r0,-24(r30)
fff88ee4: 7f c0 f2 14 add r30,r0,r30
fff88ee8: 7c 7f 1b 78 mr r31,r3
/* problematic code here */
fff88eec: 7f bd eb 78 mr r29,r29
fff88ef0: 3c 60 ff 55 lis r3,-171
fff88ef4: 60 63 ff 55 ori r3,r3,65365
fff88ef8: 38 80 00 00 li r4,0
fff88efc: 38 a0 00 30 li r5,48
fff88f00: 4b ff f9 19 bl fff88818 <memset>
.....
//------------
It is seen from here, that r29 does not get initialized, despite "volatile"
specifier for variable gd (gcc is called with "-ffixed-r29"). This bug is
present in gcc-4.0.0 too.
For reference: code generated by gcc-3.4.4:
//------------
fff88cb8 <board_init_f>:
fff88cb8: 94 21 ff d8 stwu r1,-40(r1)
fff88cbc: 7c 08 02 a6 mflr r0
fff88cc0: bf 01 00 08 stmw r24,8(r1)
fff88cc4: 90 01 00 2c stw r0,44(r1)
fff88cc8: 42 9f 00 05 bcl- 20,4*cr7+so,fff88ccc<board_init_f+0x14>
fff88ccc: 7f c8 02 a6 mflr r30
fff88cd0: 80 1e ff e8 lwz r0,-24(r30)
fff88cd4: 7f c0 f2 14 add r30,r0,r30
fff88cd8: 7c 78 1b 78 mr r24,r3
/* correct code */
fff88cdc: 3f a0 ff 55 lis r29,-171
fff88ce0: 63 bd ff 55 ori r29,r29,65365
fff88ce4: 7f bd eb 78 mr r29,r29
fff88ce8: 7f a3 eb 78 mr r3,r29
fff88cec: 38 80 00 00 li r4,0
fff88cf0: 38 a0 00 30 li r5,48
fff88cf4: 4b ff f8 ed bl fff885e0 <memset>
....
//--------------
--
Summary: Volatile register access incorrectly optimized
Product: gcc
Version: 4.0.1
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: oakad at yahoo dot com
CC: gcc-bugs at gcc dot gnu dot org
GCC build triplet: i686-pc-cygwin
GCC host triplet: i686-pc-cygwin
GCC target triplet: powerpc-eabi-gcc
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23444