PR ld/12928 * elf64-alpha.c (elf64_alpha_relax_tls_get_addr): Recover the tlsgd insn before swapping adjacent insns. Index: elf64-alpha.c =================================================================== RCS file: /cvs/src/src/bfd/elf64-alpha.c,v retrieving revision 1.179 diff -u -p -r1.179 elf64-alpha.c --- elf64-alpha.c 22 Jun 2011 16:18:24 -0000 1.179 +++ elf64-alpha.c 24 Jun 2011 17:29:38 -0000 @@ -3508,6 +3508,13 @@ elf64_alpha_relax_tls_get_addr (struct a pos[3] = info->contents + gpdisp->r_offset; pos[4] = pos[3] + gpdisp->r_addend; + /* Beware of the compiler hoisting part of the sequence out a loop + and adjusting the destination register for the TLSGD insn. If this + happens, there will be a move into $16 before the JSR insn, so only + transformations of the first insn pair should use this register. */ + tlsgd_reg = bfd_get_32 (info->abfd, pos[0]); + tlsgd_reg = (tlsgd_reg >> 21) & 31; + /* Generally, the positions are not allowed to be out of order, lest the modified insn sequence have different register lifetimes. We can make an exception when pos 1 is adjacent to pos 0. */ @@ -3575,13 +3582,6 @@ elf64_alpha_relax_tls_get_addr (struct a use_gottprel = FALSE; new_symndx = is_gd ? ELF64_R_SYM (irel->r_info) : STN_UNDEF; - /* Beware of the compiler hoisting part of the sequence out a loop - and adjusting the destination register for the TLSGD insn. If this - happens, there will be a move into $16 before the JSR insn, so only - transformations of the first insn pair should use this register. */ - tlsgd_reg = bfd_get_32 (info->abfd, pos[0]); - tlsgd_reg = (tlsgd_reg >> 21) & 31; - switch (!dynamic && !info->link_info->shared) { case 1: