This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] [LRA] Fix wrong-code PR 91109
- From: Bernd Edlinger <bernd dot edlinger at hotmail dot de>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Cc: Vladimir Makarov <vmakarov at redhat dot com>
- Date: Mon, 5 Aug 2019 20:37:27 +0000
- Subject: [PATCH] [LRA] Fix wrong-code PR 91109
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.edlinger@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);
}