[Bug c/23444] New: Volatile register access incorrectly optimized

oakad at yahoo dot com gcc-bugzilla@gcc.gnu.org
Wed Aug 17 15:44:00 GMT 2005


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



More information about the Gcc-bugs mailing list