This is the mail archive of the gcc-patches@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]

[Patch,AVR]: Fix rtx_costs of SYMBOL_REF


This is a mini-patch to fix rtx_costs for SYMBOL_REF.

The cost of a SYMBOL_REF is the same as a CONST_INT because it can be
used the same way.  I observed small performance regression in my code
and found that the reason is too high cost for SYMBOL_REF.

char x[10];

char getx2 (unsigned char i, unsigned char j)
{
    return x[i] + x[j];
}

char getx1 (unsigned char i)
{
    return x[i];
}


Without the patch, in getx2 symbol x in loaded in insn 8 and
then used in insn 9 and insn 12:

getx2:
	ldi r18,lo8(x)	 ;  8	*movhi/4	[length = 2]
	ldi r19,hi8(x)
	movw r30,r18	 ;  27	*movhi/1	[length = 1]
	add r30,r22	 ;  9	*addhi3_zero_extend	[length = 2]
	adc r31,__zero_reg__
	movw r26,r18	 ;  28	*movhi/1	[length = 1]
	add r26,r24	 ;  12	*addhi3_zero_extend	[length = 2]
	adc r27,__zero_reg__
	ld r25,Z	 ;  13	*movqi/4	[length = 1]
	ld r24,X	 ;  14	*movqi/4	[length = 1]
	add r24,r25	 ;  20	addqi3/1	[length = 1]
	ret	 ;  31	return	[length = 1]

getx1:
	ldi r30,lo8(x)	 ;  7	*movhi/4	[length = 2]
	ldi r31,hi8(x)
	add r30,r24	 ;  8	*addhi3_zero_extend	[length = 2]
	adc r31,__zero_reg__
	ld r24,Z	 ;  14	*movqi/4	[length = 1]
	ret	 ;  23	return	[length = 1]


With the patch, the symbol is added directly resulting in smaller
and faster code for getx2.  Moreover, register pressure is smaller.
getx1 performs the same as before.

getx2:
	mov r30,r22	 ;  27	*movqi/1	[length = 1]
	ldi r31,lo8(0)	 ;  28	*movqi/1	[length = 1]
	subi r30,lo8(-(x))	 ;  9	*addhi3/4	[length = 2]
	sbci r31,hi8(-(x))
	mov r26,r24	 ;  29	*movqi/1	[length = 1]
	ldi r27,lo8(0)	 ;  30	*movqi/1	[length = 1]
	subi r26,lo8(-(x))	 ;  12	*addhi3/4	[length = 2]
	sbci r27,hi8(-(x))
	ld r25,Z	 ;  13	*movqi/4	[length = 1]
	ld r24,X	 ;  14	*movqi/4	[length = 1]
	add r24,r25	 ;  20	addqi3/1	[length = 1]
	ret	 ;  33	return	[length = 1]

getx1:
	mov r30,r24	 ;  21	*movqi/1	[length = 1]
	ldi r31,lo8(0)	 ;  22	*movqi/1	[length = 1]
	subi r30,lo8(-(x))	 ;  8	*addhi3/4	[length = 2]
	sbci r31,hi8(-(x))
	ld r24,Z	 ;  14	*movqi/4	[length = 1]
	ret	 ;  25	return	[length = 1]


OK to commit?

Johann

	* config/avr/avr.c (avr_rtx_costs): Set cost of SYMBOL_REF to 0.

Index: config/avr/avr.c
===================================================================
--- config/avr/avr.c	(revision 176276)
+++ config/avr/avr.c	(working copy)
@@ -5341,6 +5341,7 @@ avr_rtx_costs (rtx x, int codearg, int o
     {
     case CONST_INT:
     case CONST_DOUBLE:
+    case SYMBOL_REF:
       /* Immediate constants are as cheap as registers.  */
       *total = 0;
       return true;
@@ -5348,7 +5349,6 @@ avr_rtx_costs (rtx x, int codearg, int o
     case MEM:
     case CONST:
     case LABEL_REF:
-    case SYMBOL_REF:
       *total = COSTS_N_INSNS (GET_MODE_SIZE (mode));
       return true;


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