mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-01-30 01:20:06 +08:00
re PR rtl-optimization/7520 (internal compiler error in verify_local_live_at_start)
PR optimization/7520 * cfganal.c (flow_active_insn_p): New. (forwarder_block_p): Use it. From-SVN: r57593
This commit is contained in:
parent
10a197ee7c
commit
3dfda826c4
@ -1,3 +1,9 @@
|
||||
2002-09-27 Richard Henderson <rth@redhat.com>
|
||||
|
||||
PR optimization/7520
|
||||
* cfganal.c (flow_active_insn_p): New.
|
||||
(forwarder_block_p): Use it.
|
||||
|
||||
2002-09-27 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* emit-rtl.c (active_insn_p): Revert last change.
|
||||
|
@ -54,7 +54,31 @@ static void flow_dfs_compute_reverse_finish
|
||||
PARAMS ((depth_first_search_ds));
|
||||
static void remove_fake_successors PARAMS ((basic_block));
|
||||
static bool need_fake_edge_p PARAMS ((rtx));
|
||||
static bool flow_active_insn_p PARAMS ((rtx));
|
||||
|
||||
/* Like active_insn_p, except keep the return value clobber around
|
||||
even after reload. */
|
||||
|
||||
static bool
|
||||
flow_active_insn_p (insn)
|
||||
rtx insn;
|
||||
{
|
||||
if (active_insn_p (insn))
|
||||
return true;
|
||||
|
||||
/* A clobber of the function return value exists for buggy
|
||||
programs that fail to return a value. It's effect is to
|
||||
keep the return value from being live across the entire
|
||||
function. If we allow it to be skipped, we introduce the
|
||||
possibility for register livetime aborts. */
|
||||
if (GET_CODE (PATTERN (insn)) == CLOBBER
|
||||
&& GET_CODE (XEXP (PATTERN (insn), 0)) == REG
|
||||
&& REG_FUNCTION_VALUE_P (XEXP (PATTERN (insn), 0)))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Return true if the block has no effect and only forwards control flow to
|
||||
its single destination. */
|
||||
|
||||
@ -69,12 +93,12 @@ forwarder_block_p (bb)
|
||||
return false;
|
||||
|
||||
for (insn = bb->head; insn != bb->end; insn = NEXT_INSN (insn))
|
||||
if (INSN_P (insn) && active_insn_p (insn))
|
||||
if (INSN_P (insn) && flow_active_insn_p (insn))
|
||||
return false;
|
||||
|
||||
return (!INSN_P (insn)
|
||||
|| (GET_CODE (insn) == JUMP_INSN && simplejump_p (insn))
|
||||
|| !active_insn_p (insn));
|
||||
|| !flow_active_insn_p (insn));
|
||||
}
|
||||
|
||||
/* Return nonzero if we can reach target from src by falling through. */
|
||||
|
26
gcc/testsuite/gcc.c-torture/compile/20020927-1.c
Normal file
26
gcc/testsuite/gcc.c-torture/compile/20020927-1.c
Normal file
@ -0,0 +1,26 @@
|
||||
/* PR optimization/7520 */
|
||||
/* ICE at -O3 on x86 due to register life problems caused by
|
||||
the return-without-value in bar. */
|
||||
|
||||
int
|
||||
foo ()
|
||||
{
|
||||
int i;
|
||||
long long int j;
|
||||
|
||||
while (1)
|
||||
{
|
||||
if (j & 1)
|
||||
++i;
|
||||
j >>= 1;
|
||||
if (j)
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
bar ()
|
||||
{
|
||||
if (foo ())
|
||||
return;
|
||||
}
|
Loading…
Reference in New Issue
Block a user