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

Alex Coplan <acoplan at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |rsandifo at gcc dot gnu.org

--- Comment #13 from Alex Coplan <acoplan at gcc dot gnu.org> ---
The problem seems to be this code in aarch64_process_components:

  while (regno != last_regno)
    {
      bool frame_related_p = aarch64_emit_cfi_for_reg_p (regno);
      machine_mode mode = aarch64_reg_save_mode (regno);

      rtx reg = gen_rtx_REG (mode, regno);
      poly_int64 offset = frame.reg_offset[regno];
      if (frame_pointer_needed)
        offset -= frame.bytes_below_hard_fp;

      rtx addr = plus_constant (Pmode, ptr_reg, offset);
      rtx mem = gen_frame_mem (mode, addr);

which emits a TFmode mem with offset 512, which is out of range for TFmode (so
we later ICE with an unrecognisable insn).  Presumably this just needs tweaking
to emit a new base anchor in the case of large offsets like this.  It looks
like the code in aarch64_save_callee_saves already does this.

Reply via email to