lower-subreg.c (resolve_simple_move): If called self-recursive...

* lower-subreg.c (resolve_simple_move): If called self-recursive,
	do not delete_insn insns that have not yet been emitted, only
	unlink them with remove_insn.
	* df-scan.c (df_insn_delete): Revert r197492.

From-SVN: r198042
This commit is contained in:
Steven Bosscher 2013-04-17 23:05:59 +00:00
parent bb52b0b918
commit 6873ecabc2
3 changed files with 14 additions and 11 deletions

View File

@ -1,3 +1,10 @@
2013-04-18 Steven Bosscher <steven@gcc.gnu.org>
* lower-subreg.c (resolve_simple_move): If called self-recursive,
do not delete_insn insns that have not yet been emitted, only
unlink them with remove_insn.
* df-scan.c (df_insn_delete): Revert r197492.
2013-04-17 Steven Bosscher <steven@gcc.gnu.org>
* emit-rtl.c (link_insn_into_chain): Handle chaining of SEQUENCEs.

View File

@ -1158,17 +1158,7 @@ df_insn_delete (rtx insn)
In any case, we expect BB to be non-NULL at least up to register
allocation, so disallow a non-NULL BB up to there. Not perfect
but better than nothing... */
/* ??? bb can also be NULL if lower-subreg.c:resolve_simple_mov emits
an insn into a sequence and then does delete_insn on it. Not sure
if that makes sense, but for now it means this assert cannot work.
See PR56738.
Disable for now but revisit before the end of GCC 4.9 stage1. */
#if 0
gcc_checking_assert (bb != NULL || reload_completed);
#else
if (bb == NULL)
return;
#endif
df_grow_bb_info (df_scan);
df_grow_reg_info ();

View File

@ -1069,7 +1069,13 @@ resolve_simple_move (rtx set, rtx insn)
emit_insn_before (insns, insn);
delete_insn (insn);
/* If we get here via self-recutsion, then INSN is not yet in the insns
chain and delete_insn will fail. We only want to remove INSN from the
current sequence. See PR56738. */
if (in_sequence_p ())
remove_insn (insn);
else
delete_insn (insn);
return insns;
}