diff options
author | Hans-Peter Nilsson <hp@axis.com> | 2021-02-17 19:37:18 +0100 |
---|---|---|
committer | Hans-Peter Nilsson <hp@axis.com> | 2021-02-22 17:59:14 +0100 |
commit | 6cb68940dcf9d80ff60576a1b5769cb12d195a03 (patch) | |
tree | a5e4269f7cc4558fce59785786803e1bbc298fa5 /libgcc | |
parent | afed55036b65526be006d55f003f670ebeadb223 (diff) | |
download | gcc-6cb68940dcf9d80ff60576a1b5769cb12d195a03.zip gcc-6cb68940dcf9d80ff60576a1b5769cb12d195a03.tar.gz gcc-6cb68940dcf9d80ff60576a1b5769cb12d195a03.tar.bz2 |
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.
Diffstat (limited to 'libgcc')
0 files changed, 0 insertions, 0 deletions