Commit 1f3d3a31 by Jeff Law

integrate.c (get_label_from_map): New function.

        * integrate.c (get_label_from_map): New function.
        (expand_inline_function): Use it.  Initialize the label_map to
        NULL_RTX instead of gen_label_rtx.
        (copy_rtx_and_substitute): Use get_label_from_map.
        * integrate.h (get_label_from_map): New function.
        (set_label_from_map): New macro.
        * unroll.c (unroll_loop): Use them.
        (copy_loop_body): Ditto.

From-SVN: r17139
parent 6ba4439c
...@@ -77,6 +77,25 @@ static void set_block_abstract_flags PROTO((tree, int)); ...@@ -77,6 +77,25 @@ static void set_block_abstract_flags PROTO((tree, int));
void set_decl_abstract_flags PROTO((tree, int)); void set_decl_abstract_flags PROTO((tree, int));
/* Returns the Ith entry in the label_map contained in MAP. If the
Ith entry has not yet been set, it is assumed to be a fresh label.
Essentially, we use this function to perform a lazy initialization
of label_map, thereby avoiding huge memory explosions when the
label_map gets very large. */
rtx
get_label_from_map (map, i)
struct inline_remap* map;
int i;
{
rtx x = map->label_map[i];
if (x == NULL_RTX)
x = map->label_map[i] = gen_label_rtx();
return x;
}
/* Zero if the current function (whose FUNCTION_DECL is FNDECL) /* Zero if the current function (whose FUNCTION_DECL is FNDECL)
is safe and reasonable to integrate into other functions. is safe and reasonable to integrate into other functions.
Nonzero means value is a warning message with a single %s Nonzero means value is a warning message with a single %s
...@@ -1767,7 +1786,7 @@ expand_inline_function (fndecl, parms, target, ignore, type, ...@@ -1767,7 +1786,7 @@ expand_inline_function (fndecl, parms, target, ignore, type,
/* Make new label equivalences for the labels in the called function. */ /* Make new label equivalences for the labels in the called function. */
for (i = min_labelno; i < max_labelno; i++) for (i = min_labelno; i < max_labelno; i++)
map->label_map[i] = gen_label_rtx (); map->label_map[i] = NULL_RTX;
/* Perform postincrements before actually calling the function. */ /* Perform postincrements before actually calling the function. */
emit_queue (); emit_queue ();
...@@ -1966,7 +1985,9 @@ expand_inline_function (fndecl, parms, target, ignore, type, ...@@ -1966,7 +1985,9 @@ expand_inline_function (fndecl, parms, target, ignore, type,
break; break;
case CODE_LABEL: case CODE_LABEL:
copy = emit_label (map->label_map[CODE_LABEL_NUMBER (insn)]); copy =
emit_label (get_label_from_map(map,
CODE_LABEL_NUMBER (insn)));
LABEL_NAME (copy) = LABEL_NAME (insn); LABEL_NAME (copy) = LABEL_NAME (insn);
map->const_age++; map->const_age++;
break; break;
...@@ -1989,7 +2010,8 @@ expand_inline_function (fndecl, parms, target, ignore, type, ...@@ -1989,7 +2010,8 @@ expand_inline_function (fndecl, parms, target, ignore, type,
if (copy && (NOTE_LINE_NUMBER (copy) == NOTE_INSN_EH_REGION_BEG if (copy && (NOTE_LINE_NUMBER (copy) == NOTE_INSN_EH_REGION_BEG
|| NOTE_LINE_NUMBER (copy) == NOTE_INSN_EH_REGION_END)) || NOTE_LINE_NUMBER (copy) == NOTE_INSN_EH_REGION_END))
{ {
rtx label = map->label_map[NOTE_BLOCK_NUMBER (copy)]; rtx label =
get_label_from_map (map, NOTE_BLOCK_NUMBER (copy));
/* We have to forward these both to match the new exception /* We have to forward these both to match the new exception
region. */ region. */
...@@ -2404,14 +2426,15 @@ copy_rtx_and_substitute (orig, map) ...@@ -2404,14 +2426,15 @@ copy_rtx_and_substitute (orig, map)
return gen_rtx (code, VOIDmode, copy); return gen_rtx (code, VOIDmode, copy);
case CODE_LABEL: case CODE_LABEL:
LABEL_PRESERVE_P (map->label_map[CODE_LABEL_NUMBER (orig)]) LABEL_PRESERVE_P (get_label_from_map (map, CODE_LABEL_NUMBER (orig)))
= LABEL_PRESERVE_P (orig); = LABEL_PRESERVE_P (orig);
return map->label_map[CODE_LABEL_NUMBER (orig)]; return get_label_from_map (map, CODE_LABEL_NUMBER (orig));
case LABEL_REF: case LABEL_REF:
copy = gen_rtx (LABEL_REF, mode, copy = gen_rtx (LABEL_REF, mode,
LABEL_REF_NONLOCAL_P (orig) ? XEXP (orig, 0) LABEL_REF_NONLOCAL_P (orig) ? XEXP (orig, 0)
: map->label_map[CODE_LABEL_NUMBER (XEXP (orig, 0))]); : get_label_from_map (map,
CODE_LABEL_NUMBER (XEXP (orig, 0))));
LABEL_OUTSIDE_LOOP_P (copy) = LABEL_OUTSIDE_LOOP_P (orig); LABEL_OUTSIDE_LOOP_P (copy) = LABEL_OUTSIDE_LOOP_P (orig);
/* The fact that this label was previously nonlocal does not mean /* The fact that this label was previously nonlocal does not mean
......
...@@ -122,6 +122,13 @@ extern void try_constants PROTO((rtx, struct inline_remap *)); ...@@ -122,6 +122,13 @@ extern void try_constants PROTO((rtx, struct inline_remap *));
extern void mark_stores PROTO((rtx, rtx)); extern void mark_stores PROTO((rtx, rtx));
/* Return the label indicated. */
extern rtx get_label_from_map PROTO((struct inline_remap *, int));
/* Set the label indicated. */
#define set_label_in_map(map, i, x) \
((map)->label_map[i] = (x))
/* Unfortunately, we need a global copy of const_equiv map for communication /* Unfortunately, we need a global copy of const_equiv map for communication
with a function called from note_stores. Be *very* careful that this with a function called from note_stores. Be *very* careful that this
is used properly in the presence of recursion. */ is used properly in the presence of recursion. */
......
...@@ -691,8 +691,9 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before, ...@@ -691,8 +691,9 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before,
else if (GET_CODE (insn) == JUMP_INSN) else if (GET_CODE (insn) == JUMP_INSN)
{ {
if (JUMP_LABEL (insn)) if (JUMP_LABEL (insn))
map->label_map[CODE_LABEL_NUMBER (JUMP_LABEL (insn))] set_label_in_map (map,
= JUMP_LABEL (insn); CODE_LABEL_NUMBER (JUMP_LABEL (insn)),
JUMP_LABEL (insn));
else if (GET_CODE (PATTERN (insn)) == ADDR_VEC else if (GET_CODE (PATTERN (insn)) == ADDR_VEC
|| GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC) || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
{ {
...@@ -704,7 +705,9 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before, ...@@ -704,7 +705,9 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before,
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
{ {
label = XEXP (XVECEXP (pat, diff_vec_p, i), 0); label = XEXP (XVECEXP (pat, diff_vec_p, i), 0);
map->label_map[CODE_LABEL_NUMBER (label)] = label; set_label_in_map (map,
CODE_LABEL_NUMBER (label),
label);
} }
} }
} }
...@@ -1043,7 +1046,7 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before, ...@@ -1043,7 +1046,7 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before,
for (j = 0; j < max_labelno; j++) for (j = 0; j < max_labelno; j++)
if (local_label[j]) if (local_label[j])
map->label_map[j] = gen_label_rtx (); set_label_in_map (map, j, gen_label_rtx ());
for (j = FIRST_PSEUDO_REGISTER; j < max_reg_before_loop; j++) for (j = FIRST_PSEUDO_REGISTER; j < max_reg_before_loop; j++)
if (local_regno[j]) if (local_regno[j])
...@@ -1205,7 +1208,7 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before, ...@@ -1205,7 +1208,7 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before,
for (j = 0; j < max_labelno; j++) for (j = 0; j < max_labelno; j++)
if (local_label[j]) if (local_label[j])
map->label_map[j] = gen_label_rtx (); set_label_in_map (map, j, gen_label_rtx ());
for (j = FIRST_PSEUDO_REGISTER; j < max_reg_before_loop; j++) for (j = FIRST_PSEUDO_REGISTER; j < max_reg_before_loop; j++)
if (local_regno[j]) if (local_regno[j])
...@@ -1222,8 +1225,9 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before, ...@@ -1222,8 +1225,9 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before,
insn = PREV_INSN (copy_start); insn = PREV_INSN (copy_start);
pattern = PATTERN (insn); pattern = PATTERN (insn);
tem = map->label_map[CODE_LABEL_NUMBER tem = get_label_from_map (map,
(XEXP (SET_SRC (pattern), 0))]; CODE_LABEL_NUMBER
(XEXP (SET_SRC (pattern), 0)));
SET_SRC (pattern) = gen_rtx (LABEL_REF, VOIDmode, tem); SET_SRC (pattern) = gen_rtx (LABEL_REF, VOIDmode, tem);
/* Set the jump label so that it can be used by later loop unrolling /* Set the jump label so that it can be used by later loop unrolling
...@@ -1640,10 +1644,11 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration, ...@@ -1640,10 +1644,11 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration,
if (! last_iteration) if (! last_iteration)
{ {
final_label = gen_label_rtx (); final_label = gen_label_rtx ();
map->label_map[CODE_LABEL_NUMBER (start_label)] = final_label; set_label_in_map (map, CODE_LABEL_NUMBER (start_label),
final_label);
} }
else else
map->label_map[CODE_LABEL_NUMBER (start_label)] = start_label; set_label_in_map (map, CODE_LABEL_NUMBER (start_label), start_label);
start_sequence (); start_sequence ();
...@@ -1928,8 +1933,9 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration, ...@@ -1928,8 +1933,9 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration,
if (invert_exp (pattern, copy)) if (invert_exp (pattern, copy))
{ {
if (! redirect_exp (&pattern, if (! redirect_exp (&pattern,
map->label_map[CODE_LABEL_NUMBER get_label_from_map (map,
(JUMP_LABEL (insn))], CODE_LABEL_NUMBER
(JUMP_LABEL (insn))),
exit_label, copy)) exit_label, copy))
abort (); abort ();
} }
...@@ -1946,8 +1952,9 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration, ...@@ -1946,8 +1952,9 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration,
emit_label_after (lab, jmp); emit_label_after (lab, jmp);
LABEL_NUSES (lab) = 0; LABEL_NUSES (lab) = 0;
if (! redirect_exp (&pattern, if (! redirect_exp (&pattern,
map->label_map[CODE_LABEL_NUMBER get_label_from_map (map,
(JUMP_LABEL (insn))], CODE_LABEL_NUMBER
(JUMP_LABEL (insn))),
lab, copy)) lab, copy))
abort (); abort ();
} }
...@@ -1990,7 +1997,8 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration, ...@@ -1990,7 +1997,8 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration,
for a switch statement. This label must have been mapped, for a switch statement. This label must have been mapped,
so just use the label_map to get the new jump label. */ so just use the label_map to get the new jump label. */
JUMP_LABEL (copy) JUMP_LABEL (copy)
= map->label_map[CODE_LABEL_NUMBER (JUMP_LABEL (insn))]; = get_label_from_map (map,
CODE_LABEL_NUMBER (JUMP_LABEL (insn)));
} }
/* If this is a non-local jump, then must increase the label /* If this is a non-local jump, then must increase the label
...@@ -2068,7 +2076,8 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration, ...@@ -2068,7 +2076,8 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration,
if (insn != start_label) if (insn != start_label)
{ {
copy = emit_label (map->label_map[CODE_LABEL_NUMBER (insn)]); copy = emit_label (get_label_from_map (map,
CODE_LABEL_NUMBER (insn)));
map->const_age++; map->const_age++;
} }
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment