re PR tree-optimization/70916 (gcc ICE at -O3 on valid code on x86_64-linux-gnu in...
authorJakub Jelinek <jakub@redhat.com>
Tue, 3 May 2016 19:30:22 +0000 (21:30 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 3 May 2016 19:30:22 +0000 (21:30 +0200)
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.

Co-Authored-By: Richard Biener <rguenther@suse.de>
From-SVN: r235842

gcc/ChangeLog
gcc/tree-if-conv.c

index 12a292c17deb91933491dde1efa18d3f637c7093..f9950c420f868796fe55922b31a15f90ad590929 100644 (file)
@@ -1,3 +1,11 @@
+2016-05-03  Jakub Jelinek  <jakub@redhat.com>
+           Richard Biener  <rguenther@suse.de>
+
+       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  <hubicka@ucw.cz>
 
        * cgraph.c (symbol_table::create_edge): Set inline_failed.
index 72dca985d741ba32d73f0f4b87803886ea34391e..52292c36cd21a4a70c0a17f0996aacc4236d3500 100644 (file)
@@ -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;