patch to fix PR88317

Message ID d120a3e8-352d-f1ce-4b99-20faa372a26f@redhat.com
State New
Headers show
Series
  • patch to fix PR88317
Related show

Commit Message

Vladimir Makarov Dec. 4, 2018, 10:56 p.m.
The following patch fixes

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88317

   The patch was successfully bootstrapped and tested on x86/x86-64.

   I think the test is too big to add it to GCC testsuite.  If Richard 
implements bitmap poisoning, it would be possible to find a smaller test.

   Committed as rev. 266803.

Patch

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 266802)
+++ ChangeLog	(working copy)
@@ -1,3 +1,9 @@ 
+2018-12-04  Vladimir Makarov  <vmakarov@redhat.com>
+
+	PR rtl-optimization/88317
+	* lra-constraints.c (split_reg): Don't set up check_only_regs if
+	we are outside the inheritance pass.
+
 2018-12-04  Jan Hubicka  <hubicka@ucw.cz>
 
 	* ipa-prop.c (jump_function_useful_p): New.
Index: lra-constraints.c
===================================================================
--- lra-constraints.c	(revision 266682)
+++ lra-constraints.c	(working copy)
@@ -5496,7 +5496,9 @@  lra_copy_reg_equiv (unsigned int new_reg
    ORIGINAL_REGNO.  NEXT_USAGE_INSNS specifies which instruction in
    the EBB next uses ORIGINAL_REGNO; it has the same form as the
    "insns" field of usage_insns.  If TO is not NULL, we don't use
-   usage_insns, we put restore insns after TO insn.
+   usage_insns, we put restore insns after TO insn.  It is a case when
+   we call it from lra_split_hard_reg_for, outside the inheritance
+   pass.
 
    The transformations look like:
 
@@ -5652,16 +5654,18 @@  split_reg (bool before_p, int original_r
       && mode == PSEUDO_REGNO_MODE (original_regno))
     lra_copy_reg_equiv (new_regno, original_regno);
   lra_reg_info[new_regno].restore_rtx = regno_reg_rtx[original_regno];
-  bitmap_set_bit (&check_only_regs, new_regno);
-  bitmap_set_bit (&check_only_regs, original_regno);
   bitmap_set_bit (&lra_split_regs, new_regno);
   if (to != NULL)
     {
+      lra_assert (next_usage_insns == NULL);
       usage_insn = to;
       after_p = TRUE;
     }
   else
     {
+      /* We need check_only_regs only inside the inheritance pass.  */
+      bitmap_set_bit (&check_only_regs, new_regno);
+      bitmap_set_bit (&check_only_regs, original_regno);
       after_p = usage_insns[original_regno].after_p;
       for (;;)
 	{