re PR rtl-optimization/83575 (ICE: verify_flow_info failed (error: multiple hot/cold...
authorJan Hubicka <hubicka@ucw.cz>
Wed, 10 Jan 2018 08:19:52 +0000 (09:19 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 10 Jan 2018 08:19:52 +0000 (08:19 +0000)
PR middle-end/83575
* predict.c (force_edge_cold): Handle in more sane way edges
with no prediction.

From-SVN: r256420

gcc/ChangeLog
gcc/predict.c

index fee06da31664749f8dea990d7883226d61711b58..98ea00bd5be7922ae76731c446de86a49e748e09 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-09  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR middle-end/83575
+       * predict.c (force_edge_cold): Handle in more sane way edges
+       with no prediction.
+
 2018-01-09  Carl Love  <cel@us.ibm.com>
 
        * config/rs6002/altivec.md (p8_vmrgow): Add support for V2DI, V2DF,
index be0db6f8a89bc436c35dfca9f15944635ba0795a..b6be32d48bc2fe87e273e45fdfc3656e118e53e9 100644 (file)
@@ -4040,6 +4040,10 @@ force_edge_cold (edge e, bool impossible)
   edge e2;
   bool uninitialized_exit = false;
 
+  /* When branch probability guesses are not known, then do nothing.  */
+  if (!impossible && !e->count ().initialized_p ())
+    return;
+
   profile_probability goal = (impossible ? profile_probability::never ()
                              : profile_probability::very_unlikely ());
 
@@ -4050,17 +4054,23 @@ force_edge_cold (edge e, bool impossible)
   FOR_EACH_EDGE (e2, ei, e->src->succs)
     if (e2 != e)
       {
+       if (e->flags & EDGE_FAKE)
+         continue;
        if (e2->count ().initialized_p ())
          count_sum += e2->count ();
-       else
-         uninitialized_exit = true;
        if (e2->probability.initialized_p ())
          prob_sum += e2->probability;
+       else 
+         uninitialized_exit = true;
       }
 
+  /* If we are not guessing profiles but have some other edges out,
+     just assume the control flow goes elsewhere.  */
+  if (uninitialized_exit)
+    e->probability = goal;
   /* If there are other edges out of e->src, redistribute probabilitity
      there.  */
-  if (prob_sum > profile_probability::never ())
+  else if (prob_sum > profile_probability::never ())
     {
       if (!(e->probability < goal))
        e->probability = goal;
@@ -4100,8 +4110,7 @@ force_edge_cold (edge e, bool impossible)
        update_br_prob_note (e->src);
       if (e->src->count == profile_count::zero ())
        return;
-      if (count_sum == profile_count::zero () && !uninitialized_exit
-         && impossible)
+      if (count_sum == profile_count::zero () && impossible)
        {
          bool found = false;
          if (e->src == ENTRY_BLOCK_PTR_FOR_FN (cfun))