re PR middle-end/81030 (ICE on valid code at -O1 (only) on x86_64-linux-gnu: verify_f...
authorJan Hubicka <hubicka@gcc.gnu.org>
Thu, 20 Jul 2017 11:27:31 +0000 (11:27 +0000)
committerJan Hubicka <hubicka@gcc.gnu.org>
Thu, 20 Jul 2017 11:27:31 +0000 (11:27 +0000)
PR middle-end/81030
* cfgbuild.c (find_many_sub_basic_blocks): Update REG_BR_PROB note
when gimple level profile disagrees with what RTL expander did.
* gcc.dg/pr81030.c: New test.

From-SVN: r250383

gcc/ChangeLog
gcc/cfgbuild.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr81030.c [new file with mode: 0644]

index 5bea9dd1e3e6963a66a8e33e7f1dc2d3020838ac..b6282b0999746f7d6e38e1b77dacfe6675045ada 100644 (file)
@@ -1,3 +1,10 @@
+2017-07-18  Jan Hubicka  <hubicka@ucw.cz>
+           Tom de Vries  <tom@codesourcery.com>
+
+       PR middle-end/81030
+       * cfgbuild.c (find_many_sub_basic_blocks): Update REG_BR_PROB note
+       when gimple level profile disagrees with what RTL expander did.
+
 2017-07-20  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/61171
index 16b07073b917e62227195bb6d28b47e4d0b2efad..2fe74c4085163866110beec3efe3c344b663be2a 100644 (file)
@@ -673,10 +673,18 @@ find_many_sub_basic_blocks (sbitmap blocks)
                     && profile_status_for_fn (cfun) != PROFILE_READ))
              bb->count = profile_count::uninitialized ();
          }
-       else
-         /* If nothing changed, there is no need to create new BBs.  */
-         if (EDGE_COUNT (bb->succs) == n_succs[bb->index])
+       /* If nothing changed, there is no need to create new BBs.  */
+       else if (EDGE_COUNT (bb->succs) == n_succs[bb->index])
+         {
+           /* In rare occassions RTL expansion might have mistakely assigned
+              a probabilities different from what is in CFG.  This happens
+              when we try to split branch to two but optimize out the
+              second branch during the way. See PR81030.  */
+           if (JUMP_P (BB_END (bb)) && any_condjump_p (BB_END (bb))
+               && EDGE_COUNT (bb->succs) >= 2)
+             update_br_prob_note (bb);
            continue;
+         }
 
        compute_outgoing_frequencies (bb);
       }
index 8ff6c4f200c6e8bdd967e89e838ae6964a194ad1..8b840a2a01f6e23291c5cd334c74d0ad34ffb6c6 100644 (file)
@@ -1,3 +1,8 @@
+2017-07-17  Tom de Vries  <tom@codesourcery.com>
+
+       PR middle-end/81030
+       * gcc.dg/pr81030.c: New test.
+
 2017-07-20  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/61171
diff --git a/gcc/testsuite/gcc.dg/pr81030.c b/gcc/testsuite/gcc.dg/pr81030.c
new file mode 100644 (file)
index 0000000..23da6e5
--- /dev/null
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-O1" } */
+
+void __assert_fail (const char *, const char *, unsigned int, const char *);
+
+int a, b, c, d, e, f, h;
+unsigned char g;
+
+int main ()
+{
+  int i, *j = &b;
+  if (a)
+    {
+      if (h)
+       {
+         int **k = &j;
+         d = 0;
+         *k = &e;
+       }
+      else
+       for (b = 0; b > -28; b = g)
+         ;
+      c || !j ? : __assert_fail ("c || !j", "small.c", 20, "main");
+      if (f)
+       for (i = 0; i < 1; i++)
+         ;
+    }
+  return 0;
+}