mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-08 18:57:49 +08:00
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
This commit is contained in:
parent
6ba4439c3b
commit
1f3d3a3161
@ -77,6 +77,25 @@ static void set_block_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)
|
||||
is safe and reasonable to integrate into other functions.
|
||||
Nonzero means value is a warning message with a single %s
|
||||
@ -1767,7 +1786,7 @@ expand_inline_function (fndecl, parms, target, ignore, type,
|
||||
|
||||
/* Make new label equivalences for the labels in the called function. */
|
||||
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. */
|
||||
emit_queue ();
|
||||
@ -1966,7 +1985,9 @@ expand_inline_function (fndecl, parms, target, ignore, type,
|
||||
break;
|
||||
|
||||
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);
|
||||
map->const_age++;
|
||||
break;
|
||||
@ -1989,7 +2010,8 @@ expand_inline_function (fndecl, parms, target, ignore, type,
|
||||
if (copy && (NOTE_LINE_NUMBER (copy) == NOTE_INSN_EH_REGION_BEG
|
||||
|| 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
|
||||
region. */
|
||||
@ -2404,14 +2426,15 @@ copy_rtx_and_substitute (orig, map)
|
||||
return gen_rtx (code, VOIDmode, copy);
|
||||
|
||||
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);
|
||||
return map->label_map[CODE_LABEL_NUMBER (orig)];
|
||||
return get_label_from_map (map, CODE_LABEL_NUMBER (orig));
|
||||
|
||||
case LABEL_REF:
|
||||
copy = gen_rtx (LABEL_REF, mode,
|
||||
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);
|
||||
|
||||
/* The fact that this label was previously nonlocal does not mean
|
||||
|
@ -122,6 +122,13 @@ extern void try_constants PROTO((rtx, struct inline_remap *));
|
||||
|
||||
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
|
||||
with a function called from note_stores. Be *very* careful that this
|
||||
is used properly in the presence of recursion. */
|
||||
|
39
gcc/unroll.c
39
gcc/unroll.c
@ -691,8 +691,9 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before,
|
||||
else if (GET_CODE (insn) == JUMP_INSN)
|
||||
{
|
||||
if (JUMP_LABEL (insn))
|
||||
map->label_map[CODE_LABEL_NUMBER (JUMP_LABEL (insn))]
|
||||
= JUMP_LABEL (insn);
|
||||
set_label_in_map (map,
|
||||
CODE_LABEL_NUMBER (JUMP_LABEL (insn)),
|
||||
JUMP_LABEL (insn));
|
||||
else if (GET_CODE (PATTERN (insn)) == ADDR_VEC
|
||||
|| GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
|
||||
{
|
||||
@ -704,7 +705,9 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before,
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
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,
|
||||
|
||||
for (j = 0; j < max_labelno; 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++)
|
||||
if (local_regno[j])
|
||||
@ -1205,7 +1208,7 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before,
|
||||
|
||||
for (j = 0; j < max_labelno; 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++)
|
||||
if (local_regno[j])
|
||||
@ -1222,8 +1225,9 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before,
|
||||
insn = PREV_INSN (copy_start);
|
||||
pattern = PATTERN (insn);
|
||||
|
||||
tem = map->label_map[CODE_LABEL_NUMBER
|
||||
(XEXP (SET_SRC (pattern), 0))];
|
||||
tem = get_label_from_map (map,
|
||||
CODE_LABEL_NUMBER
|
||||
(XEXP (SET_SRC (pattern), 0)));
|
||||
SET_SRC (pattern) = gen_rtx (LABEL_REF, VOIDmode, tem);
|
||||
|
||||
/* 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,
|
||||
if (! last_iteration)
|
||||
{
|
||||
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
|
||||
map->label_map[CODE_LABEL_NUMBER (start_label)] = start_label;
|
||||
set_label_in_map (map, CODE_LABEL_NUMBER (start_label), start_label);
|
||||
|
||||
start_sequence ();
|
||||
|
||||
@ -1928,8 +1933,9 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration,
|
||||
if (invert_exp (pattern, copy))
|
||||
{
|
||||
if (! redirect_exp (&pattern,
|
||||
map->label_map[CODE_LABEL_NUMBER
|
||||
(JUMP_LABEL (insn))],
|
||||
get_label_from_map (map,
|
||||
CODE_LABEL_NUMBER
|
||||
(JUMP_LABEL (insn))),
|
||||
exit_label, copy))
|
||||
abort ();
|
||||
}
|
||||
@ -1946,8 +1952,9 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration,
|
||||
emit_label_after (lab, jmp);
|
||||
LABEL_NUSES (lab) = 0;
|
||||
if (! redirect_exp (&pattern,
|
||||
map->label_map[CODE_LABEL_NUMBER
|
||||
(JUMP_LABEL (insn))],
|
||||
get_label_from_map (map,
|
||||
CODE_LABEL_NUMBER
|
||||
(JUMP_LABEL (insn))),
|
||||
lab, copy))
|
||||
abort ();
|
||||
}
|
||||
@ -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,
|
||||
so just use the label_map to get the new jump label. */
|
||||
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
|
||||
@ -2068,7 +2076,8 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration,
|
||||
|
||||
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++;
|
||||
}
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user