diff options
author | Ilya Leoshkevich <iii@linux.ibm.com> | 2018-11-09 20:33:19 +0000 |
---|---|---|
committer | Ilya Leoshkevich <iii@gcc.gnu.org> | 2018-11-09 20:33:19 +0000 |
commit | 340e0dd66466091ea2bbd160592c017eb67dc47d (patch) | |
tree | d7d598af8c44850d0dca325c3f08006fc48c3d1d /gcc/expr.c | |
parent | 81a227c6054a82118d80d3f4b2fffb44bc43aae2 (diff) | |
download | gcc-340e0dd66466091ea2bbd160592c017eb67dc47d.zip gcc-340e0dd66466091ea2bbd160592c017eb67dc47d.tar.gz gcc-340e0dd66466091ea2bbd160592c017eb67dc47d.tar.bz2 |
S/390: Allow relative addressing of literal pool entries
r265490 allowed the compiler to choose in a more flexible way whether to
use load or load-address-relative-long (LARL) instruction. When it
chose LARL for literal pool references, the latter ones were rewritten
by pass_s390_early_mach to use UNSPEC_LTREF, which assumes base register
usage, which in turn is not compatible with LARL. The end result was an
ICE because of unrecognizable insn.
UNSPEC_LTREF and friends are necessary in order to communicate the
dependency on the base register to pass_sched2. When relative
addressing is used, no base register is necessary, so in such cases the
rewrite must be avoided.
gcc/ChangeLog:
2018-11-09 Ilya Leoshkevich <iii@linux.ibm.com>
PR target/87762
* config/s390/s390.c (s390_safe_relative_long_p): New function.
(annotate_constant_pool_refs): Skip insns which support
relative addressing.
(annotate_constant_pool_refs_1): New helper function.
(find_constant_pool_ref): Skip insns which support relative
addression.
(find_constant_pool_ref_1): New helper function.
(replace_constant_pool_ref): Skip insns which support
relative addressing.
(replace_constant_pool_ref_1): New helper function.
(s390_mainpool_start): Adapt to the new signature.
(s390_mainpool_finish): Likewise.
(s390_chunkify_start): Likewise.
(s390_chunkify_finish): Likewise.
(pass_s390_early_mach::execute): Likewise.
(s390_prologue_plus_offset): Likewise.
(s390_emit_prologue): Likewise.
(s390_emit_epilogue): Likewise.
From-SVN: r265991
Diffstat (limited to 'gcc/expr.c')
0 files changed, 0 insertions, 0 deletions