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.
This commit is contained in:
parent
62af27e77b
commit
aaf1ee4831
@ -1,3 +1,10 @@
|
||||
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.
|
||||
|
||||
2020-05-15 Christophe Lyon <christophe.lyon@linaro.org>
|
||||
|
||||
* config/arm/arm.c (reg_needs_saving_p): Add support for interrupt
|
||||
|
@ -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. */
|
||||
|
@ -1,3 +1,8 @@
|
||||
2020-05-15 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/95133
|
||||
* gcc.dg/pr95133.c: New testcase.
|
||||
|
||||
2020-05-15 Tobias Burnus <tobias@codesourcery.com>
|
||||
|
||||
PR middle-end/94635
|
||||
|
14
gcc/testsuite/gcc.dg/pr95133.c
Normal file
14
gcc/testsuite/gcc.dg/pr95133.c
Normal file
@ -0,0 +1,14 @@
|
||||
/* { 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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user