From 2e063ded5483a92525ee58cac98bbefc996336af Mon Sep 17 00:00:00 2001 From: jakub Date: Tue, 3 May 2016 19:30:22 +0000 Subject: [PATCH] PR tree-optimization/70916 * tree-if-conv.c: Include cfganal.h. (pass_if_conversion::execute): Call connect_infinite_loops_to_exit and remove_fake_exit_edges around the optimization pass. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@235842 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 8 ++++++++ gcc/tree-if-conv.c | 11 +++++++++++ 2 files changed, 19 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 12a292c17deb..f9950c420f86 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2016-05-03 Jakub Jelinek + Richard Biener + + PR tree-optimization/70916 + * tree-if-conv.c: Include cfganal.h. + (pass_if_conversion::execute): Call connect_infinite_loops_to_exit + and remove_fake_exit_edges around the optimization pass. + 2016-05-03 Jan Hubicka * cgraph.c (symbol_table::create_edge): Set inline_failed. diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index 72dca985d741..52292c36cd21 100644 --- a/gcc/tree-if-conv.c +++ b/gcc/tree-if-conv.c @@ -113,6 +113,7 @@ along with GCC; see the file COPYING3. If not see #include "varasm.h" #include "builtins.h" #include "params.h" +#include "cfganal.h" /* Only handle PHIs with no more arguments unless we are asked to by simd pragma. */ @@ -2812,6 +2813,14 @@ pass_if_conversion::execute (function *fun) if (number_of_loops (fun) <= 1) return 0; + /* If there are infinite loops, during CDI_POST_DOMINATORS computation + we can pick pretty much random bb inside of the infinite loop that + has the fake edge. If we are unlucky enough, this can confuse the + add_to_predicate_list post-dominator check to optimize as if that + bb or some other one is a join block when it actually is not. + See PR70916. */ + connect_infinite_loops_to_exit (); + FOR_EACH_LOOP (loop, 0) if (flag_tree_loop_if_convert == 1 || flag_tree_loop_if_convert_stores == 1 @@ -2819,6 +2828,8 @@ pass_if_conversion::execute (function *fun) && !loop->dont_vectorize)) todo |= tree_if_conversion (loop); + remove_fake_exit_edges (); + if (flag_checking) { basic_block bb; -- 2.47.3