diff options
author | Richard Biener <rguenther@suse.de> | 2020-05-06 10:23:15 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2020-12-01 15:00:23 +0100 |
commit | 70ac96884811b6971b44a7ffa94d637f612e6cc4 (patch) | |
tree | d5d09ff8981a7c1bfa93ee8681694cee98e2e7de /gcc | |
parent | 3d0da0bc398054f2c37f09b13ccf7e2e2ef63b22 (diff) | |
download | gcc-70ac96884811b6971b44a7ffa94d637f612e6cc4.zip gcc-70ac96884811b6971b44a7ffa94d637f612e6cc4.tar.gz gcc-70ac96884811b6971b44a7ffa94d637f612e6cc4.tar.bz2 |
middle-end/94964 - avoid EH loop entry with CP_SIMPLE_PREHEADERS
Loop optimizers expect to be able to insert on the preheader
edge w/o splitting it thus avoid ending up with a preheader
that enters the loop via an EH edge (or an abnormal edge).
2020-05-06 Richard Biener <rguenther@suse.de>
PR middle-end/94964
* cfgloopmanip.c (create_preheader): Require non-complex
preheader edge for CP_SIMPLE_PREHEADERS.
(cherry picked from commit 6fc00b41e764219e2c88d8892d7c701c0d292a17)
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cfgloopmanip.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c index 4b300f2..6be59c3 100644 --- a/gcc/cfgloopmanip.c +++ b/gcc/cfgloopmanip.c @@ -1500,9 +1500,10 @@ create_preheader (struct loop *loop, int flags) else { /* If we want simple preheaders, also force the preheader to have - just a single successor. */ + just a single successor and a normal edge. */ if ((flags & CP_SIMPLE_PREHEADERS) - && !single_succ_p (single_entry->src)) + && ((single_entry->flags & EDGE_COMPLEX) + || !single_succ_p (single_entry->src))) need_forwarder_block = true; /* If we want fallthru preheaders, also create forwarder block when preheader ends with a jump or has predecessors from loop. */ |