aboutsummaryrefslogtreecommitdiff
path: root/gcc/flow.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2004-02-06 20:29:56 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2004-02-06 19:29:56 +0000
commit298c28a8f4e43c22d3ad390699192f2dfa8fca70 (patch)
treeb09126fc8be0deb3ef0fabb92f855b241186e585 /gcc/flow.c
parentfbdf188d7809e1c8a5edf36f95a4f846dd1d2c85 (diff)
downloadgcc-298c28a8f4e43c22d3ad390699192f2dfa8fca70.zip
gcc-298c28a8f4e43c22d3ad390699192f2dfa8fca70.tar.gz
gcc-298c28a8f4e43c22d3ad390699192f2dfa8fca70.tar.bz2
flow.c (update_life_info): Allocate reg_deaths when called from scheudler.
* flow.c (update_life_info): Allocate reg_deaths when called from scheudler. (attempt_auto_inc): Update life ranges accordingly. From-SVN: r77415
Diffstat (limited to 'gcc/flow.c')
-rw-r--r--gcc/flow.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/gcc/flow.c b/gcc/flow.c
index 049a587..a12f0ed 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -627,6 +627,9 @@ update_life_info (sbitmap blocks, enum update_life_extent extent, int prop_flags
tmp = INITIALIZE_REG_SET (tmp_head);
ndead = 0;
+ if ((prop_flags & PROP_REG_INFO) && !reg_deaths)
+ reg_deaths = xcalloc (sizeof (*reg_deaths), max_regno);
+
timevar_push ((extent == UPDATE_LIFE_LOCAL || blocks)
? TV_LIFE_UPDATE : TV_LIFE);
@@ -3376,16 +3379,16 @@ attempt_auto_inc (struct propagate_block_info *pbi, rtx inc, rtx insn,
incr_reg = q;
regno = REGNO (q);
+ if ((pbi->flags & PROP_REG_INFO)
+ && !REGNO_REG_SET_P (pbi->reg_live, regno))
+ reg_deaths[regno] = pbi->insn_num;
+
/* REGNO is now used in INCR which is below INSN, but
it previously wasn't live here. If we don't mark
it as live, we'll put a REG_DEAD note for it
on this insn, which is incorrect. */
SET_REGNO_REG_SET (pbi->reg_live, regno);
- /* We shall not do the autoinc during final pass. */
- if (flags & PROP_REG_INFO)
- abort ();
-
/* If there are any calls between INSN and INCR, show
that REGNO now crosses them. */
for (temp = insn; temp != incr; temp = NEXT_INSN (temp))
@@ -3417,14 +3420,21 @@ attempt_auto_inc (struct propagate_block_info *pbi, rtx inc, rtx insn,
/* If the original source was dead, it's dead now. */
rtx note;
- /* We shall not do the autoinc during final pass. */
- if (flags & PROP_REG_INFO)
- abort ();
while ((note = find_reg_note (incr, REG_DEAD, NULL_RTX)) != NULL_RTX)
{
remove_note (incr, note);
if (XEXP (note, 0) != incr_reg)
- CLEAR_REGNO_REG_SET (pbi->reg_live, REGNO (XEXP (note, 0)));
+ {
+ unsigned int regno = REGNO (XEXP (note, 0));
+
+ if ((pbi->flags & PROP_REG_INFO)
+ && REGNO_REG_SET_P (pbi->reg_live, regno))
+ {
+ REG_LIVE_LENGTH (regno) += pbi->insn_num - reg_deaths[regno];
+ reg_deaths[regno] = 0;
+ }
+ CLEAR_REGNO_REG_SET (pbi->reg_live, REGNO (XEXP (note, 0)));
+ }
}
PUT_CODE (incr, NOTE);