This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Adjust DEBUG_INSNs in update_equiv_regs (PR debug/43479)


Hi!

The following patch cures:
+XPASS: gcc.dg/guality/pr41353-1.c  -O1  line 28 j == 28 + 37
-FAIL: gcc.dg/guality/pr43479.c  -O1  line 13 i == 6
-FAIL: gcc.dg/guality/pr43479.c  -O1  line 13 h == 9
-FAIL: gcc.dg/guality/pr43479.c  -O1  line 18 j == 8
-FAIL: gcc.dg/guality/pr43479.c  -O1  line 18 h == 9
-FAIL: gcc.dg/guality/pr43479.c  -O2  line 13 i == 6
-FAIL: gcc.dg/guality/pr43479.c  -O2  line 13 h == 9
-FAIL: gcc.dg/guality/pr43479.c  -O2  line 18 j == 8
-FAIL: gcc.dg/guality/pr43479.c  -O2  line 18 h == 9
-FAIL: gcc.dg/guality/pr43479.c  -O3 -fomit-frame-pointer  line 13 i == 6
-FAIL: gcc.dg/guality/pr43479.c  -O3 -fomit-frame-pointer  line 13 h == 9
-FAIL: gcc.dg/guality/pr43479.c  -O3 -fomit-frame-pointer  line 18 j == 8
-FAIL: gcc.dg/guality/pr43479.c  -O3 -fomit-frame-pointer  line 18 h == 9
-FAIL: gcc.dg/guality/pr43479.c  -O3 -g  line 13 i == 6
-FAIL: gcc.dg/guality/pr43479.c  -O3 -g  line 13 h == 9
-FAIL: gcc.dg/guality/pr43479.c  -O3 -g  line 18 j == 8
-FAIL: gcc.dg/guality/pr43479.c  -O3 -g  line 18 h == 9
-FAIL: gcc.dg/guality/pr43479.c  -Os  line 13 i == 6
-FAIL: gcc.dg/guality/pr43479.c  -Os  line 13 h == 9
-FAIL: gcc.dg/guality/pr43479.c  -Os  line 18 j == 8
-FAIL: gcc.dg/guality/pr43479.c  -Os  line 18 h == 9
-FAIL: gcc.dg/guality/pr43479.c  -O2 -flto  line 13 i == 6
-FAIL: gcc.dg/guality/pr43479.c  -O2 -flto  line 13 h == 9
-FAIL: gcc.dg/guality/pr43479.c  -O2 -flto  line 18 j == 8
-FAIL: gcc.dg/guality/pr43479.c  -O2 -flto  line 18 h == 9
-FAIL: gcc.dg/guality/pr43479.c  -O2 -fwhopr  line 13 i == 6
-FAIL: gcc.dg/guality/pr43479.c  -O2 -fwhopr  line 13 h == 9
-FAIL: gcc.dg/guality/pr43479.c  -O2 -fwhopr  line 18 j == 8
-FAIL: gcc.dg/guality/pr43479.c  -O2 -fwhopr  line 18 h == 9
-FAIL: gcc.dg/guality/vla-1.c  -O1  line 17 sizeof (a) == 6
-FAIL: gcc.dg/guality/vla-1.c  -O2  line 17 sizeof (a) == 6
-FAIL: gcc.dg/guality/vla-1.c  -O3 -fomit-frame-pointer  line 17 sizeof (a) == 6
-FAIL: gcc.dg/guality/vla-1.c  -O3 -g  line 17 sizeof (a) == 6
-FAIL: gcc.dg/guality/vla-1.c  -Os  line 17 sizeof (a) == 6
on i686-linux.  The problem is if update_equiv_regs replaces equiv source
in the only (non-debug) user or moves the equiv insn right before it,
the DEBUG_INSNs that might also mention the pseudo aren't adjusted,
and thus removed very soon afterwards as they aren't used where the
pseudo is live anymore (either it isn't live at all, or just in between
two adjacent insns).

The following patch implements that adjusting.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2010-03-24  Jakub Jelinek  <jakub@redhat.com>

	PR debug/43479
	* ira.c (adjust_cleared_regs): New function.
	(update_equiv_regs): Adjust cleared_regs in DEBUG_INSNs.

--- gcc/ira.c.jj	2009-11-30 15:53:27.000000000 +0100
+++ gcc/ira.c	2010-03-24 09:31:52.000000000 +0100
@@ -2282,6 +2282,22 @@ no_equiv (rtx reg, const_rtx store ATTRI
     }
 }
 
+/* In DEBUG_INSN location adjust REGs from CLEARED_REGS bitmap to the
+   equivalent replacement.  */
+
+static rtx
+adjust_cleared_regs (rtx loc, const_rtx old_rtx ATTRIBUTE_UNUSED, void *data)
+{
+  if (REG_P (loc))
+    {
+      bitmap cleared_regs = (bitmap) data;
+      if (bitmap_bit_p (cleared_regs, REGNO (loc)))
+	return simplify_replace_fn_rtx (*reg_equiv[REGNO (loc)].src_p,
+					NULL_RTX, adjust_cleared_regs, data);
+    }
+  return NULL_RTX;
+}
+
 /* Nonzero if we recorded an equivalence for a LABEL_REF.  */
 static int recorded_label_ref;
 
@@ -2717,13 +2733,29 @@ update_equiv_regs (void)
     }
 
   if (!bitmap_empty_p (cleared_regs))
-    FOR_EACH_BB (bb)
-      {
-	bitmap_and_compl_into (DF_LIVE_IN (bb), cleared_regs);
-	bitmap_and_compl_into (DF_LIVE_OUT (bb), cleared_regs);
-	bitmap_and_compl_into (DF_LR_IN (bb), cleared_regs);
-	bitmap_and_compl_into (DF_LR_OUT (bb), cleared_regs);
-      }
+    {
+      FOR_EACH_BB (bb)
+	{
+	  bitmap_and_compl_into (DF_LIVE_IN (bb), cleared_regs);
+	  bitmap_and_compl_into (DF_LIVE_OUT (bb), cleared_regs);
+	  bitmap_and_compl_into (DF_LR_IN (bb), cleared_regs);
+	  bitmap_and_compl_into (DF_LR_OUT (bb), cleared_regs);
+	}
+
+      /* Last pass - adjust debug insns referencing cleared regs.  */
+      if (MAY_HAVE_DEBUG_INSNS)
+	for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
+	  if (DEBUG_INSN_P (insn))
+	    {
+	      rtx old_loc = INSN_VAR_LOCATION_LOC (insn);
+	      INSN_VAR_LOCATION_LOC (insn)
+		= simplify_replace_fn_rtx (old_loc, NULL_RTX,
+					   adjust_cleared_regs,
+					   (void *) cleared_regs);
+	      if (old_loc != INSN_VAR_LOCATION_LOC (insn))
+		df_insn_rescan (insn);
+	    }
+    }
 
   BITMAP_FREE (cleared_regs);
 

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]