diff -uprN a/gcc/lra.c b/gcc/lra.c --- a/gcc/lra.c 2020-12-14 15:26:36.331633230 +0800 +++ b/gcc/lra.c 2020-12-15 18:56:33.699633230 +0800 @@ -507,6 +507,26 @@ lra_emit_move (rtx x, rtx y) data. */ if (old != max_reg_num ()) expand_reg_data (old); + while (insn != NULL) + { + if (GET_CODE (PATTERN (insn)) == SET + && GET_CODE (SET_SRC (PATTERN (insn))) == LO_SUM + && GET_CODE (SET_DEST (PATTERN (insn))) == REG + && strcmp (insn_data[recog_memoized (insn)].name, + "add_losym_di") == 0) + { + rtx add_losym_dest = SET_DEST (PATTERN (insn)); + for (int i = (int) max_reg_num () - 1; i >= old; i--) + { + if (regno_reg_rtx[i] == add_losym_dest) + { + setup_reg_classes (i, GENERAL_REGS, + NO_REGS, GENERAL_REGS); + } + } + } + insn = PREV_INSN (insn); + } return; } lra_emit_add (x, XEXP (y, 0), XEXP (y, 1));