https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116413
--- Comment #18 from Michael Matz <matz at gcc dot gnu.org> --- This last problem is a pre-existing one in the backend. It accepts bare label_ref plus operands, but it does so also in flag_pic mode. There it isn't correct (because it implies another memory reference). This problem was masked earlier because expand generates the address reference to the jump table with a ASHIFT, which wasn't accepted formerly by the backend. That non-acceptance lead to expand decomposing everything in the address to registers, including the bare label_ref, which then ultimately went the correct ways. The LRA patches now _do_ accept the ASHIFT parts (and that's okay), but this leads to an overall acceptance of '(plus (ashift (reg) (1)) (label_ref))' and that's not acceptable (ahem). Solution: don't accept a bare label_ref as plus operand if flag_pic. See below: @@ -2247,6 +2275,7 @@ m68k_decompose_address (machine_mode mode, rtx x, references. It seems unlikely that we would ever generate indexed accesses to unplaced labels in other cases. */ if (GET_CODE (x) == PLUS + && !flag_pic && m68k_jump_table_ref_p (XEXP (x, 1)) && m68k_decompose_index (XEXP (x, 0), strict_p, address)) {