This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Eliminated function return values in retarget


Hi folks,

I'm retargetting GCC to a custom architecture 
(https://github.com/jamieiles/gcc-oldland is the retarget) and have an 
odd problem with function return values near the end of a function being 
eliminated.  For example:

	extern int getreturn(void);
	
	int foo(void)
	{
		if (getreturn() != 0)
			return -1;
	
		return 0;
	}

I see that with optimization (-O1 or greater) that this gets compiled 
into a call to getreturn() and then unconditionally sets the return 
value to -1 (with a one_cmpl + eor + ior).  Inserting a call to another 
function inbetween the 'return -1' and 'return 0' is enough to cause 
working code to be generated.

works fine at -O0 generating

00000000 <foo>:
   0:	f0 ce ff 93 	str32	$lr, [$sp, 0x1ffc]
   4:	d0 8e ff 93 	str32	$fp, [$sp, 0x1ff8]
   8:	0d 8e 00 08 	sub	$fp, $sp, 0x8
   c:	0e 8e 00 08 	sub	$sp, $sp, 0x8
  10:	fb ff ff 40 	call	0 <foo>
			10: R_OLDLAND_PC24	getreturn-0x4
  14:	01 00 00 3e 	mov	$r1, $r0
  18:	00 00 00 3c 	mov	$r0, 0x0
  1c:	00 01 00 32 	cmp	$r1, $r0
  20:	03 00 00 58 	beq	30 <foo+0x30>
  24:	00 fc ff ef 	movhi	$r0, 0xffff
  28:	00 fc ff f7 	orlo	$r0, $r0, 0xffff
  2c:	01 00 00 50 	b	34 <foo+0x34>
  30:	00 00 00 3c 	mov	$r0, 0x0
  34:	0e 8e 00 00 	add	$sp, $sp, 0x8
  38:	0d 8e 00 00 	add	$fp, $sp, 0x8
  3c:	0d 8e ff 83 	ldr32	$fp, [$sp, 0x1ff8]
  40:	0f ce ff 83 	ldr32	$lr, [$sp, 0x1ffc]
  44:	f0 00 00 46 	ret	

but at -O1 I get

00000000 <foo>:
   0:	f0 ce ff 93 	str32	$lr, [$sp, 0x1ffc]
   4:	d0 8e ff 93 	str32	$fp, [$sp, 0x1ff8]
   8:	0d 8e 00 08 	sub	$fp, $sp, 0x8
   c:	0e 8e 00 08 	sub	$sp, $sp, 0x8
  10:	fb ff ff 40 	call	0 <foo>
			10: R_OLDLAND_PC24	getreturn-0x4
  14:	01 00 00 3c 	mov	$r1, 0x0
  18:	01 01 00 0a 	sub	$r1, $r1, $r0
  1c:	00 01 00 2a 	or	$r0, $r1, $r0
  20:	00 f0 01 38 	asr	$r0, $r0, 0x1f
  24:	0e 8e 00 00 	add	$sp, $sp, 0x8
  28:	0d 8e 00 00 	add	$fp, $sp, 0x8
  2c:	0d 8e ff 83 	ldr32	$fp, [$sp, 0x1ff8]
  30:	0f ce ff 83 	ldr32	$lr, [$sp, 0x1ffc]
  34:	f0 00 00 46 	ret	

I have $r0-$r5 as call used registers and my TARGET_FUNCTION_VALUE and 
TARGET_FUNCTION_VALUE_REGNO_P using $r0.

Any pointers would be greatfully received.

Regards,

Jamie


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]