recog.c (split_insn): Break out from ...
* recog.c (split_insn): Break out from ... (split_all_insns): ... here; do not use basic block information when it is broken. From-SVN: r43009
This commit is contained in:
parent
2fe7bb353a
commit
d58d4c12b0
|
@ -1,3 +1,9 @@
|
||||||
|
Fri Jun 8 14:16:33 CEST 2001 Jan Hubicka <jh@suse.cz>
|
||||||
|
|
||||||
|
* recog.c (split_insn): Break out from ...
|
||||||
|
(split_all_insns): ... here; do not use basic block information
|
||||||
|
when it is broken.
|
||||||
|
|
||||||
Thu Jun 7 18:27:53 CEST 2001 Jan Hubicka <jh@suse.cz>
|
Thu Jun 7 18:27:53 CEST 2001 Jan Hubicka <jh@suse.cz>
|
||||||
|
|
||||||
* simplify-rtx.c (simplify_subreg): Fix verification of
|
* simplify-rtx.c (simplify_subreg): Fix verification of
|
||||||
|
|
151
gcc/recog.c
151
gcc/recog.c
|
@ -57,6 +57,7 @@ static void validate_replace_rtx_1 PARAMS ((rtx *, rtx, rtx, rtx));
|
||||||
static rtx *find_single_use_1 PARAMS ((rtx, rtx *));
|
static rtx *find_single_use_1 PARAMS ((rtx, rtx *));
|
||||||
static rtx *find_constant_term_loc PARAMS ((rtx *));
|
static rtx *find_constant_term_loc PARAMS ((rtx *));
|
||||||
static void validate_replace_src_1 PARAMS ((rtx *, void *));
|
static void validate_replace_src_1 PARAMS ((rtx *, void *));
|
||||||
|
static rtx split_insn PARAMS ((rtx));
|
||||||
|
|
||||||
/* Nonzero means allow operands to be volatile.
|
/* Nonzero means allow operands to be volatile.
|
||||||
This should be 0 if you are generating rtl, such as if you are calling
|
This should be 0 if you are generating rtl, such as if you are calling
|
||||||
|
@ -2700,6 +2701,66 @@ reg_fits_class_p (operand, class, offset, mode)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Split single instruction. Helper function for split_all_insns.
|
||||||
|
Return last insn in the sequence if succesfull, or NULL if unsuccesfull. */
|
||||||
|
static rtx
|
||||||
|
split_insn (insn)
|
||||||
|
rtx insn;
|
||||||
|
{
|
||||||
|
rtx set;
|
||||||
|
if (!INSN_P (insn))
|
||||||
|
;
|
||||||
|
/* Don't split no-op move insns. These should silently
|
||||||
|
disappear later in final. Splitting such insns would
|
||||||
|
break the code that handles REG_NO_CONFLICT blocks. */
|
||||||
|
|
||||||
|
else if ((set = single_set (insn)) != NULL && set_noop_p (set))
|
||||||
|
{
|
||||||
|
/* Nops get in the way while scheduling, so delete them
|
||||||
|
now if register allocation has already been done. It
|
||||||
|
is too risky to try to do this before register
|
||||||
|
allocation, and there are unlikely to be very many
|
||||||
|
nops then anyways. */
|
||||||
|
if (reload_completed)
|
||||||
|
{
|
||||||
|
PUT_CODE (insn, NOTE);
|
||||||
|
NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
|
||||||
|
NOTE_SOURCE_FILE (insn) = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Split insns here to get max fine-grain parallelism. */
|
||||||
|
rtx first = PREV_INSN (insn);
|
||||||
|
rtx last = try_split (PATTERN (insn), insn, 1);
|
||||||
|
|
||||||
|
if (last != insn)
|
||||||
|
{
|
||||||
|
/* try_split returns the NOTE that INSN became. */
|
||||||
|
PUT_CODE (insn, NOTE);
|
||||||
|
NOTE_SOURCE_FILE (insn) = 0;
|
||||||
|
NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
|
||||||
|
|
||||||
|
/* ??? Coddle to md files that generate subregs in post-
|
||||||
|
reload splitters instead of computing the proper
|
||||||
|
hard register. */
|
||||||
|
if (reload_completed && first != last)
|
||||||
|
{
|
||||||
|
first = NEXT_INSN (first);
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
if (INSN_P (first))
|
||||||
|
cleanup_subreg_operands (first);
|
||||||
|
if (first == last)
|
||||||
|
break;
|
||||||
|
first = NEXT_INSN (first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL_RTX;
|
||||||
|
}
|
||||||
/* Split all insns in the function. If UPD_LIFE, update life info after. */
|
/* Split all insns in the function. If UPD_LIFE, update life info after. */
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -2710,6 +2771,22 @@ split_all_insns (upd_life)
|
||||||
int changed;
|
int changed;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (!upd_life)
|
||||||
|
{
|
||||||
|
rtx next, insn;
|
||||||
|
|
||||||
|
for (insn = get_insns (); insn ; insn = next)
|
||||||
|
{
|
||||||
|
rtx last;
|
||||||
|
|
||||||
|
/* Can't use `next_real_insn' because that might go across
|
||||||
|
CODE_LABELS and short-out basic blocks. */
|
||||||
|
next = NEXT_INSN (insn);
|
||||||
|
last = split_insn (insn);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
blocks = sbitmap_alloc (n_basic_blocks);
|
blocks = sbitmap_alloc (n_basic_blocks);
|
||||||
sbitmap_zero (blocks);
|
sbitmap_zero (blocks);
|
||||||
changed = 0;
|
changed = 0;
|
||||||
|
@ -2721,82 +2798,26 @@ split_all_insns (upd_life)
|
||||||
|
|
||||||
for (insn = bb->head; insn ; insn = next)
|
for (insn = bb->head; insn ; insn = next)
|
||||||
{
|
{
|
||||||
rtx set;
|
rtx last;
|
||||||
|
|
||||||
/* Can't use `next_real_insn' because that might go across
|
/* Can't use `next_real_insn' because that might go across
|
||||||
CODE_LABELS and short-out basic blocks. */
|
CODE_LABELS and short-out basic blocks. */
|
||||||
next = NEXT_INSN (insn);
|
next = NEXT_INSN (insn);
|
||||||
if (! INSN_P (insn))
|
last = split_insn (insn);
|
||||||
;
|
if (last)
|
||||||
|
|
||||||
/* Don't split no-op move insns. These should silently
|
|
||||||
disappear later in final. Splitting such insns would
|
|
||||||
break the code that handles REG_NO_CONFLICT blocks. */
|
|
||||||
|
|
||||||
else if ((set = single_set (insn)) != NULL
|
|
||||||
&& set_noop_p (set))
|
|
||||||
{
|
{
|
||||||
/* Nops get in the way while scheduling, so delete them
|
SET_BIT (blocks, i);
|
||||||
now if register allocation has already been done. It
|
changed = 1;
|
||||||
is too risky to try to do this before register
|
if (insn == bb->end)
|
||||||
allocation, and there are unlikely to be very many
|
bb->end = last;
|
||||||
nops then anyways. */
|
insn = last;
|
||||||
if (reload_completed)
|
|
||||||
{
|
|
||||||
PUT_CODE (insn, NOTE);
|
|
||||||
NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
|
|
||||||
NOTE_SOURCE_FILE (insn) = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Split insns here to get max fine-grain parallelism. */
|
|
||||||
rtx first = PREV_INSN (insn);
|
|
||||||
rtx last = try_split (PATTERN (insn), insn, 1);
|
|
||||||
|
|
||||||
if (last != insn)
|
|
||||||
{
|
|
||||||
SET_BIT (blocks, i);
|
|
||||||
changed = 1;
|
|
||||||
|
|
||||||
/* try_split returns the NOTE that INSN became. */
|
|
||||||
PUT_CODE (insn, NOTE);
|
|
||||||
NOTE_SOURCE_FILE (insn) = 0;
|
|
||||||
NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
|
|
||||||
|
|
||||||
/* ??? Coddle to md files that generate subregs in post-
|
|
||||||
reload splitters instead of computing the proper
|
|
||||||
hard register. */
|
|
||||||
if (reload_completed && first != last)
|
|
||||||
{
|
|
||||||
first = NEXT_INSN (first);
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
if (INSN_P (first))
|
|
||||||
cleanup_subreg_operands (first);
|
|
||||||
if (first == last)
|
|
||||||
break;
|
|
||||||
first = NEXT_INSN (first);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (insn == bb->end)
|
|
||||||
{
|
|
||||||
bb->end = last;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (insn == bb->end)
|
if (insn == bb->end)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ??? When we're called from just after reload, the CFG is in bad
|
if (insn == NULL)
|
||||||
shape, and we may have fallen off the end. This could be fixed
|
|
||||||
by having reload not try to delete unreachable code. Otherwise
|
|
||||||
assert we found the end insn. */
|
|
||||||
if (insn == NULL && upd_life)
|
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue