PR rtl-optimization/106421: ICE in bypass_block from non-local goto.

This patch fixes PR rtl-optimization/106421, an ICE-on-valid (but
undefined) regression.  The fix, as proposed by Richard Biener, is to
defend against BLOCK_FOR_INSN returning NULL in cprop's bypass_block.

2023-01-10  Roger Sayle  <roger@nextmovesoftware.com>

gcc/ChangeLog
	PR rtl-optimization/106421
	* cprop.cc (bypass_block): Check that DEST is local to this
	function (non-NULL) before calling find_edge.

gcc/testsuite/ChangeLog
	PR rtl-optimization/106421
	* gcc.dg/pr106421.c: New test case.
This commit is contained in:
Roger Sayle 2023-01-10 14:05:46 +00:00
parent c389991432
commit 851e1ba03f
2 changed files with 19 additions and 3 deletions

View file

@ -1622,9 +1622,12 @@ bypass_block (basic_block bb, rtx_insn *setcc, rtx_insn *jump)
{
dest = BLOCK_FOR_INSN (XEXP (new_rtx, 0));
/* Don't bypass edges containing instructions. */
edest = find_edge (bb, dest);
if (edest && edest->insns.r)
dest = NULL;
if (dest)
{
edest = find_edge (bb, dest);
if (edest && edest->insns.r)
dest = NULL;
}
}
else
dest = NULL;

View file

@ -0,0 +1,13 @@
/* { dg-do compile } */
/* { dg-options "-O2" } */
int main(int argc, char **argv)
{
__label__ loop, end;
void jmp(int c) { goto *(c ? &&loop : &&end); }
loop:
jmp(argc < 0);
end:
return 0;
}