From 15a47f437d2ba320aa9cb72986812f115498dbf9 Mon Sep 17 00:00:00 2001 From: "Vladimir N. Makarov" Date: Wed, 6 Jan 2021 14:48:53 -0500 Subject: [PR97978] LRA: Permit temporary allocation incorrectness after hard reg split. LRA can crash when a hard register was split and the same hard register was assigned on the previous assignment sub-pass. The following patch fixes this problem. gcc/ChangeLog: PR rtl-optimization/97978 * lra-int.h (lra_hard_reg_split_p): New external. * lra.c (lra_hard_reg_split_p): New global. (lra): Set up lra_hard_reg_split_p after splitting a hard reg. * lra-assigns.c (lra_assign): Don't check allocation correctness after hard reg splitting. gcc/testsuite/ChangeLog: PR rtl-optimization/97978 * gcc.target/i386/pr97978.c: New. --- gcc/lra-assigns.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'gcc/lra-assigns.c') diff --git a/gcc/lra-assigns.c b/gcc/lra-assigns.c index 9335e4c..c6a941f 100644 --- a/gcc/lra-assigns.c +++ b/gcc/lra-assigns.c @@ -1636,10 +1636,11 @@ lra_assign (bool &fails_p) bitmap_initialize (&all_spilled_pseudos, ®_obstack); create_live_range_start_chains (); setup_live_pseudos_and_spill_after_risky_transforms (&all_spilled_pseudos); - if (! lra_asm_error_p && flag_checking) - /* Check correctness of allocation for call-crossed pseudos but - only when there are no asm errors as in the case of errors the - asm is removed and it can result in incorrect allocation. */ + if (! lra_hard_reg_split_p && ! lra_asm_error_p && flag_checking) + /* Check correctness of allocation but only when there are no hard reg + splits and asm errors as in the case of errors explicit insns involving + hard regs are added or the asm is removed and this can result in + incorrect allocation. */ for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) if (lra_reg_info[i].nrefs != 0 && reg_renumber[i] >= 0 -- cgit v1.1