[Bug target/51244] SH Target: Inefficient conditional branch
oleg.endo@t-online.de
gcc-bugzilla@gcc.gnu.org
Wed Dec 28 16:07:00 GMT 2011
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51244
--- Comment #6 from Oleg Endo <oleg.endo@t-online.de> 2011-12-28 15:59:35 UTC ---
(In reply to comment #3)
> Created attachment 26191 [details]
> Proposed patch to improve some of the issues.
>
> The attached patch removes the useless sequence and still allows the -1
> constant to be CSE-ed for such cases as the example function above.
>
> I haven't ran all tests on it yet, but CSiBE shows average code size reduction
> of approx. -0.1% for -m4* with some code size increases in some files.
Some of the code size increases are caused by the ifcvt.c pass which tries to
transform sequences like:
int test_func_6 (int a, int b, int c)
{
if (a == 16)
c = 0;
return b + c;
}
into branch-free code like:
mov r4,r0 ! 45 movsi_ie/2 [length = 2]
cmp/eq #16,r0 ! 9 cmpeqsi_t/2 [length = 2]
mov #-1,r0 ! 34 movsi_ie/3 [length = 2]
negc r0,r0 ! 38 *negc [length = 2]
neg r0,r0 ! 36 negsi2 [length = 2]
and r6,r0 ! 37 *andsi3_compact/2 [length = 2]
rts ! 48 *return_i [length = 2]
add r5,r0 ! 14 *addsi3_compact [length = 2]
instead of the more compact (and on SH4 most likely better):
mov r4,r0 ! 41 movsi_ie/2 [length = 2]
cmp/eq #16,r0 ! 9 cmpeqsi_t/2 [length = 2]
bf 0f ! 34 *movsicc_t_true/2 [length = 4]
mov #0,r6
0:
add r5,r6 ! 14 *addsi3_compact [length = 2]
rts ! 44 *return_i [length = 2]
mov r6,r0 ! 19 movsi_ie/2 [length = 2]
This particular case is handled in noce_try_store_flag_mask, which does the
transformation if BRANCH_COST >= 2, which is true for -m4. I guess before the
patch ifcvt didn't realize that this transformation can be applied.
I've tried setting BRANCH_COST to 1, which avoids this transformation but
increases overall code size a bit.
More information about the Gcc-bugs
mailing list