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) ...@@ -67,8 +67,14 @@ find_block_to_duplicate_for_splitting_paths (basic_block latch)
region. Verify that it is. region. Verify that it is.
First, verify that BB has two predecessors (each arm of the First, verify that BB has two predecessors (each arm of the
IF-THEN-ELSE) and two successors (the latch and exit). */ IF-THEN-ELSE) and two successors (the latch and exit) and that
if (EDGE_COUNT (bb->preds) == 2 && EDGE_COUNT (bb->succs) == 2) 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 /* Now verify that BB's immediate dominator ends in a
conditional as well. */ 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