This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Adjust DEBUG_INSNs in update_equiv_regs (PR debug/43479)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Vladimir Makarov <vmakarov at redhat dot com>, Peter Bergner <bergner at vnet dot ibm dot com>, Kenneth Zadeck <zadeck at naturalbridge dot com>, Richard Guenther <rguenther at suse dot de>, Alexandre Oliva <aoliva at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Wed, 24 Mar 2010 13:28:30 +0100
- Subject: [PATCH] Adjust DEBUG_INSNs in update_equiv_regs (PR debug/43479)
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
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