cris: Fix addi insn mult vs. shift canonicalization
authorHans-Peter Nilsson <hp@axis.com>
Wed, 17 Feb 2021 18:37:18 +0000 (19:37 +0100)
committerHans-Peter Nilsson <hp@axis.com>
Mon, 22 Feb 2021 16:59:14 +0000 (17:59 +0100)
commit6cb68940dcf9d80ff60576a1b5769cb12d195a03
treea5e4269f7cc4558fce59785786803e1bbc298fa5
parentafed55036b65526be006d55f003f670ebeadb223
cris: Fix addi insn mult vs. shift canonicalization

Ever since the canonicalization clean-up of (mult X (1 << N)) into
(ashift X N) outside addresses, the CRIS addi patterns have been
unmatched.  No big deal.

Unfortunately, nobody thought of adjusting reloaded addresses, so
transforming mult into a shift has to be a kludged for when reload
decides that it has to move an address like (plus (mult reg0 4) reg1)
into a register, as happens building libgfortran.  (No, simplify_rtx
et al don't automatically DTRT.)  Something less kludgy would make
sense if it wasn't for the current late development stage and reload
being deprecated.  I don't know whether this issue is absent for LRA,
though.

I added a testsuite for the reload issue, despite being exposed by a
libgfortran build, so the issue would be covered by C/C++ builds, but
to the CRIS test-suite, not as a generic test, to avoid bad feelings
from anyone preferring short test-times to redundant coverage.

gcc:
* config/cris/cris.c (cris_print_operand) <'T'>: Change
valid operand from is now an addi mult-value to shift-value.
* config/cris/cris.md (*addi): Change expression of scaled
operand from mult to ashift.
* config/cris/cris.md (*addi_reload): New insn_and_split.

gcc/testsuite:
* gcc.target/cris/torture/sync-reload-mul-1.c: New test.
gcc/config/cris/cris.c
gcc/config/cris/cris.md
gcc/testsuite/gcc.target/cris/torture/sync-reload-mul-1.c [new file with mode: 0644]