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]

Re: Question on cse_not_expected in explow.c:memory_address_addr_space()


On 09/28/2011 02:14 PM, Georg-Johann Lay wrote:
This leads to unpleasant code. The machine can access all RAM locations by
direct addressing. However, the resulting code is:

foo:
	ldi r24,lo8(-86)	 ;  6	*movqi/2	[length = 1]
	ldi r30,lo8(-64)	 ;  34	*movhi/5	[length = 2]
	ldi r31,lo8(10)
	std Z+3,r24	 ;  7	*movqi/3	[length = 1]
.L2:
	lds r24,2754	 ;  10	*movqi/4	[length = 2]
	sbrs r24,7	 ;  43	*sbrx_branchhi	[length = 2]
	rjmp .L2
	ldi r24,lo8(-69)	 ;  16	*movqi/2	[length = 1]
	ldi r30,lo8(-64)	 ;  33	*movhi/5	[length = 2]
	ldi r31,lo8(10)
	std Z+3,r24	 ;  17	*movqi/3	[length = 1]
.L3:
	lds r24,2754	 ;  20	*movqi/4	[length = 2]
	sbrs r24,7	 ;  42	*sbrx_branchhi	[length = 2]
	rjmp .L3
	ret	 ;  39	return	[length = 1]

Insn 34 loads 2752 (0xAC0) to r30/r31 (Z) and does an indirect access (*(Z+3),
i.e. *2755) in insn 7.  The same happens in insn 33 (load 2752) and access
(insn 17).

Is there a way to avoid this? I tried -f[no-]rerun-cse-after-loop but without
effect, same for -Os/-O2 and trying to patch rtx_costs. cse_not_expected is
overridden in some places in the middle-end.

fwprop should take care of propagating the address. Have you tried patching address_costs? Might be as simple as this (untested):


Index: avr.c
===================================================================
--- avr.c	(revision 177688)
+++ avr.c	(working copy)
@@ -5986,8 +5986,8 @@ avr_address_cost (rtx x, bool speed ATTR
     return 18;
   if (CONSTANT_ADDRESS_P (x))
     {
-      if (optimize > 0 && io_address_operand (x, QImode))
-	return 2;
+      if (optimize > 0)
+	return io_address_operand (x, QImode) ? 2 : 3;
       return 4;
     }
   return 4;

Paolo


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