Hi!
PR 91109 is a wrong-code bug, where LRA is using a scratch register which is actually not available for use, and thus gets clobbered when it should not. That seems to be mostly because the live range info of the cloned schatch register is not working the way how update_scrach_ops sets up the new register. Moreover for the new register there is a much better alternative free register available, so that just not trying the re-use the previous hard register assignment solves the problem. For more background please see the bugzilla PR 91109. Since I am able to reproduce this bug with latest gcc-9 branch, I want to ask right away, if it is okay to back-port after a while. Boot-strapped and reg-tested on x86_64-pc-linux-gnu and armv7-linux-gnueabihf. Is it OK for trunk? Thanks, Bernd.
2019-07-30 Bernd Edlinger <bernd.edlin...@hotmail.de> PR tree-optimization/91109 * lra-remat.c (update_scratch_ops): Remove assignment of the hard register. Index: gcc/lra-remat.c =================================================================== --- gcc/lra-remat.c (revision 273767) +++ gcc/lra-remat.c (working copy) @@ -1021,7 +1021,6 @@ get_hard_regs (struct lra_insn_reg *reg, int &nreg static void update_scratch_ops (rtx_insn *remat_insn) { - int hard_regno; lra_insn_recog_data_t id = lra_get_insn_recog_data (remat_insn); struct lra_static_insn_data *static_id = id->insn_static_data; for (int i = 0; i < static_id->n_operands; i++) @@ -1032,17 +1031,9 @@ update_scratch_ops (rtx_insn *remat_insn) int regno = REGNO (*loc); if (! lra_former_scratch_p (regno)) continue; - hard_regno = reg_renumber[regno]; *loc = lra_create_new_reg (GET_MODE (*loc), *loc, lra_get_allocno_class (regno), "scratch pseudo copy"); - if (hard_regno >= 0) - { - reg_renumber[REGNO (*loc)] = hard_regno; - if (lra_dump_file) - fprintf (lra_dump_file, " Assigning the same %d to r%d\n", - REGNO (*loc), hard_regno); - } lra_register_new_scratch_op (remat_insn, i, id->icode); }