Commit 1d93c1bd by Richard Biener

tree-optimization/95133 - avoid abnormal edges in path splitting

When path splitting tries to detect a CFG diamond make sure it
is composed of normal (non-EH, not abnormal) edges.  Otherwise
CFG manipulation later may fail.

2020-05-15  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/95133
	* gimple-ssa-split-paths.c
	(find_block_to_duplicate_for_splitting_paths): Check for
	normal edges.

	* gcc.dg/pr95133.c: New testcase.
parent fe19d514
......@@ -67,8 +67,14 @@ find_block_to_duplicate_for_splitting_paths (basic_block latch)
region. Verify that it is.
First, verify that BB has two predecessors (each arm of the
IF-THEN-ELSE) and two successors (the latch and exit). */
if (EDGE_COUNT (bb->preds) == 2 && EDGE_COUNT (bb->succs) == 2)
IF-THEN-ELSE) and two successors (the latch and exit) and that
all edges are normal. */
if (EDGE_COUNT (bb->preds) == 2
&& !(EDGE_PRED (bb, 0)->flags & EDGE_COMPLEX)
&& !(EDGE_PRED (bb, 1)->flags & EDGE_COMPLEX)
&& EDGE_COUNT (bb->succs) == 2
&& !(EDGE_SUCC (bb, 0)->flags & EDGE_COMPLEX)
&& !(EDGE_SUCC (bb, 1)->flags & EDGE_COMPLEX))
{
/* Now verify that BB's immediate dominator ends in a
conditional as well. */
......
/* { dg-do compile } */
/* { dg-options "-O3" } */
extern int a[16];
void f (int *ip, int x)
{
int *xp = a;
for (int i=0; i<8; ++i)
{
base: if (x) return;
}
*xp++ = *ip;
goto *(&&base + *ip);
}
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