Commit 79c7fda6 by Jakub Jelinek Committed by Jakub Jelinek

re PR middle-end/60175 (ICE on gcc.dg/asan/nosanitize-and-inline.c)

	PR middle-end/60175
	* function.c (expand_function_end): Don't emit
	clobber_return_register sequence if clobber_after is a BARRIER.
	* cfgexpand.c (construct_exit_block): Append instructions before
	return_label to prev_bb.

From-SVN: r208267
parent 715a5c85
2014-03-03 Jakub Jelinek <jakub@redhat.com>
PR middle-end/60175
* function.c (expand_function_end): Don't emit
clobber_return_register sequence if clobber_after is a BARRIER.
* cfgexpand.c (construct_exit_block): Append instructions before
return_label to prev_bb.
2014-03-02 Bill Schmidt <wschmidt@linux.vnet.ibm.com> 2014-03-02 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* config/rs6000/constraints.md: Document reserved use of "wc". * config/rs6000/constraints.md: Document reserved use of "wc".
......
...@@ -5273,7 +5273,8 @@ construct_exit_block (void) ...@@ -5273,7 +5273,8 @@ construct_exit_block (void)
edge e, e2; edge e, e2;
unsigned ix; unsigned ix;
edge_iterator ei; edge_iterator ei;
rtx orig_end = BB_END (EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb); basic_block prev_bb = EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb;
rtx orig_end = BB_END (prev_bb);
rtl_profile_for_bb (EXIT_BLOCK_PTR_FOR_FN (cfun)); rtl_profile_for_bb (EXIT_BLOCK_PTR_FOR_FN (cfun));
...@@ -5288,13 +5289,25 @@ construct_exit_block (void) ...@@ -5288,13 +5289,25 @@ construct_exit_block (void)
end = get_last_insn (); end = get_last_insn ();
if (head == end) if (head == end)
return; return;
/* While emitting the function end we could move end of the last basic block. /* While emitting the function end we could move end of the last basic
*/ block. */
BB_END (EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb) = orig_end; BB_END (prev_bb) = orig_end;
while (NEXT_INSN (head) && NOTE_P (NEXT_INSN (head))) while (NEXT_INSN (head) && NOTE_P (NEXT_INSN (head)))
head = NEXT_INSN (head); head = NEXT_INSN (head);
exit_block = create_basic_block (NEXT_INSN (head), end, /* But make sure exit_block starts with RETURN_LABEL, otherwise the
EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb); bb frequency counting will be confused. Any instructions before that
label are emitted for the case where PREV_BB falls through into the
exit block, so append those instructions to prev_bb in that case. */
if (NEXT_INSN (head) != return_label)
{
while (NEXT_INSN (head) != return_label)
{
if (!NOTE_P (NEXT_INSN (head)))
BB_END (prev_bb) = NEXT_INSN (head);
head = NEXT_INSN (head);
}
}
exit_block = create_basic_block (NEXT_INSN (head), end, prev_bb);
exit_block->frequency = EXIT_BLOCK_PTR_FOR_FN (cfun)->frequency; exit_block->frequency = EXIT_BLOCK_PTR_FOR_FN (cfun)->frequency;
exit_block->count = EXIT_BLOCK_PTR_FOR_FN (cfun)->count; exit_block->count = EXIT_BLOCK_PTR_FOR_FN (cfun)->count;
if (current_loops && EXIT_BLOCK_PTR_FOR_FN (cfun)->loop_father) if (current_loops && EXIT_BLOCK_PTR_FOR_FN (cfun)->loop_father)
......
...@@ -5156,17 +5156,20 @@ expand_function_end (void) ...@@ -5156,17 +5156,20 @@ expand_function_end (void)
crtl->return_rtx = outgoing; crtl->return_rtx = outgoing;
} }
/* Emit the actual code to clobber return register. */ /* Emit the actual code to clobber return register. Don't emit
{ it if clobber_after is a barrier, then the previous basic block
rtx seq; certainly doesn't fall thru into the exit block. */
if (!BARRIER_P (clobber_after))
{
rtx seq;
start_sequence (); start_sequence ();
clobber_return_register (); clobber_return_register ();
seq = get_insns (); seq = get_insns ();
end_sequence (); end_sequence ();
emit_insn_after (seq, clobber_after); emit_insn_after (seq, clobber_after);
} }
/* Output the label for the naked return from the function. */ /* Output the label for the naked return from the function. */
if (naked_return_label) if (naked_return_label)
......
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