aboutsummaryrefslogtreecommitdiff
path: root/gcc/ira.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-03-24 17:50:11 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2010-03-24 17:50:11 +0100
commit3a6191b1f909385d62d2df1837c031a366ba762f (patch)
treef6c43bec236d3651d319f9bfbf4ace3a1a1e4c59 /gcc/ira.c
parentbff0b1a6df2f43750d5b4c6eeb02b0e9ad15fc30 (diff)
downloadgcc-3a6191b1f909385d62d2df1837c031a366ba762f.zip
gcc-3a6191b1f909385d62d2df1837c031a366ba762f.tar.gz
gcc-3a6191b1f909385d62d2df1837c031a366ba762f.tar.bz2
re PR debug/43479 (Missing DW_TAG_lexical_block+DW_TAG_variable)
PR debug/43479 * ira.c (adjust_cleared_regs): New function. (update_equiv_regs): Adjust cleared_regs in DEBUG_INSNs. From-SVN: r157702
Diffstat (limited to 'gcc/ira.c')
-rw-r--r--gcc/ira.c48
1 files changed, 40 insertions, 8 deletions
diff --git a/gcc/ira.c b/gcc/ira.c
index e5a6171..b4397c8 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -1,5 +1,5 @@
/* Integrated Register Allocator (IRA) entry point.
- Copyright (C) 2006, 2007, 2008, 2009
+ Copyright (C) 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
Contributed by Vladimir Makarov <vmakarov@redhat.com>.
@@ -2282,6 +2282,22 @@ no_equiv (rtx reg, const_rtx store ATTRIBUTE_UNUSED, void *data ATTRIBUTE_UNUSED
}
}
+/* 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);