https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87762

--- Comment #4 from iii at gcc dot gnu.org ---
Author: iii
Date: Fri Nov  9 20:33:19 2018
New Revision: 265991

URL: https://gcc.gnu.org/viewcvs?rev=265991&root=gcc&view=rev
Log:
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  <i...@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.

Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/config/s390/s390.c

Reply via email to