[PATCH] LoongArch: Allow to relax instructions into NOPs after handling alignment

Xi Ruoyao xry111@xry111.site
Mon Jun 30 06:40:08 GMT 2025


On Mon, 2025-06-30 at 01:33 +0800, WANG Xuerui wrote:
> From: WANG Xuerui <git@xen0n.name>
> 
> Right now, LoongArch linker relaxation is 2-pass, since after alignment
> is done, byte deletion can no longer happen. However, as the alignment
> pass also shrinks text sections, new relaxation chances may well be
> created after alignment is done. Although at this point we can no longer
> delete unused instructions without disturbing alignment, we can still
> replace them with NOPs; popular LoongArch micro-architectures can
> eliminate NOPs during execution, so we can expect a (very) slight
> performance improvement from those late-created relaxation chances.
> 
> To achieve this, the number of relax passes is raised to 3 for
> LoongArch, and every relaxation handler except loongarch_relax_align is
> migrated to a new helper loongarch_relax_delete_or_nop, that either
> deletes bytes or fills the bytes to be "deleted" with NOPs, depending on
> whether the containing section already has undergone alignment. Also,
> since no byte can be deleted during this relax pass, in the pass the
> pending_delete_ops structure is no longer allocated, and
> loongarch_calc_relaxed_addr(x) degrades to the trivial "return x" in
> this case.

IMO in pass 3 we can also be more aggressive estimating the distance r -
l.  I.e. now we have code snippets like:

  /* If pc and symbol not in the same segment, add/sub segment alignment.  */
  if (!loongarch_two_sections_in_same_segment (info->output_bfd,
                           sec->output_section,
                           sym_sec->output_section))
    max_alignment = info->maxpagesize > max_alignment ? info->maxpagesize
                            : max_alignment;

  if (symval > pc)
    pc -= (max_alignment > 4 ? max_alignment : 0);
  else if (symval < pc)
    pc += (max_alignment > 4 ? max_alignment : 0);

This is because if we delete some byte before l, the distance between l
and r may increase (as r may be unmoved due to some alignment
requirement).  But it shouldn't happen anymore in pass 3.


-- 
Xi Ruoyao <xry111@xry111.site>


More information about the Binutils mailing list