[patch,avr]: Increase branch costs after reload.
Georg-Johann Lay
avr@gjlay.de
Fri Jan 13 13:28:00 GMT 2017
This adds a penalty of 4 to the post-reload branch costs.
Purpose is reduce the number of out-of-line blocks like in
unsigned long variant5 (unsigned in)
{
unsigned long out = 0;
if (in & (1 << 0)) out |= 0xful << (4*0);
if (in & (1 << 1)) out |= 0xful << (4*1);
if (in & (1 << 2)) out |= 0xful << (4*2);
if (in & (1 << 3)) out |= 0xful << (4*3);
return out;
}
without the patch, code is
variant5:
mov r18,r24 ; 67 movqi_insn/1 [length = 1]
sbrs r24,0 ; 10 *sbrx_branchhi [length = 2]
rjmp .L6
ldi r22,lo8(15) ; 5 *movsi/5 [length = 4]
ldi r23,0
ldi r24,0
ldi r25,0
.L2:
<some_code_and_epilogue>
.L6:
ldi r22,0 ; 4 *movsi/2 [length = 3]
ldi r23,0
movw r24,r22
rjmp .L2 ; 74 jump [length = 1]
and with the patch it reads:
variant5:
mov r18,r24 ; 67 movqi_insn/1 [length = 1]
ldi r22,lo8(15) ; 5 *movsi/5 [length = 4]
ldi r23,0
ldi r24,0
ldi r25,0
sbrc r18,0 ; 10 *sbrx_branchhi [length = 2]
rjmp .L2
ldi r22,0 ; 4 *movsi/2 [length = 3]
ldi r23,0
movw r24,r22
.L2:
<some_code_and_epilogue>
Using fall-through safes insn 74.
Main blocker for not increasing default branch costs in general
is do_store_flag which is a heap of assertions not using
rtx_costs and which gives the best results with the old
default of 0, which is not changed.
Tested without regressions.
Ok for trunk?
Johann
* config/avr/avr.h (BRANCH_COST) [reload_completed]: Increase by 4.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: branch-costs.diff
Type: text/x-patch
Size: 778 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20170113/196fad6c/attachment.bin>
More information about the Gcc-patches
mailing list