https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70995
Bug ID: 70995 Summary: [SH] rotcl usage results in bloaty code Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: olegendo at gcc dot gnu.org Target Milestone: --- Target: sh*-*-* While the following: unsigned int test_14 (unsigned int a, int b, int c) { bool r = b == c; return (a << 9) | r; } compiles to a minimal sequence (-m4 -O2): cmp/eq r6,r5 shll8 r4 mov r4,r0 rts rotcl r0 changing the input values a little: unsigned int test_15 (unsigned int a, int b, int c) { bool r = b != c; return (a << 11) | r; } results in (-m4 -O2): cmp/eq r6,r5 movt r1 shll8 r4 tst r1,r1 shll2 r4 mov r4,r0 rts rotcl r0 and on SH2A (has nott insn): shll8 r4 cmp/eq r6,r5 shll2 r4 mov r4,r0 nott rts rotcl r0 It seems for certain parameters it's better to not use the rotcl insn if the nott insn is not available, as it saves one insn: shll8 r4 cmp/eq r6,r5 shll2 r4 mov #-1,r0 negc r0,r0 rts or r4,r0