re PR rtl-optimization/79386 (ICE: segmentation fault in cprop w/ -O2 on 32-bit BE...
authorJakub Jelinek <jakub@redhat.com>
Tue, 7 Feb 2017 17:45:57 +0000 (18:45 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 7 Feb 2017 17:45:57 +0000 (18:45 +0100)
PR rtl-optimization/79386
* cprop.c (bypass_conditional_jumps): Initialize
bypass_last_basic_block already before splitting bbs after
unconditional traps...
(bypass_conditional_jumps): ... rather than here.

* gcc.c-torture/compile/pr79386.c: New test.

From-SVN: r245251

gcc/ChangeLog
gcc/cprop.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr79386.c [new file with mode: 0644]

index 18c20836ed83944c97253eb9d7b7e93aff843892..c5f5f13d5c9dad7d34f28145f9cb75b9a6189829 100644 (file)
@@ -1,5 +1,11 @@
 2017-02-07  Jakub Jelinek  <jakub@redhat.com>
 
+       PR rtl-optimization/79386
+       * cprop.c (bypass_conditional_jumps): Initialize
+       bypass_last_basic_block already before splitting bbs after
+       unconditional traps...
+       (bypass_conditional_jumps): ... rather than here.
+
        PR target/79299
        * config/i386/sse.md (xtg_mode, gatherq_mode): New mode attrs.
        (*avx512f_gathersi<mode>, *avx512f_gathersi<mode>_2,
index f704a0d1f5ef26a4639bb79b398c0ba7cab397a5..e315e53b695fedf562c628028ae8b79889b4f20a 100644 (file)
@@ -1697,7 +1697,6 @@ bypass_conditional_jumps (void)
   if (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb == EXIT_BLOCK_PTR_FOR_FN (cfun))
     return 0;
 
-  bypass_last_basic_block = last_basic_block_for_fn (cfun);
   mark_dfs_back_edges ();
 
   changed = 0;
@@ -1863,6 +1862,11 @@ one_cprop_pass (void)
              }
        }
 
+      /* Make sure bypass_conditional_jumps will ignore not just its new
+        basic blocks, but also the ones after unconditional traps (those are
+        unreachable and will be eventually removed as such).  */
+      bypass_last_basic_block = last_basic_block_for_fn (cfun);
+
       while (!uncond_traps.is_empty ())
        {
          rtx_insn *insn = uncond_traps.pop ();
index 2741631a4f2c9a23d1b1a06779d741e296401420..7d793de238fb706052df88445c649f56be71e371 100644 (file)
@@ -1,3 +1,8 @@
+2017-02-07  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/79386
+       * gcc.c-torture/compile/pr79386.c: New test.
+
 2017-02-07  Dominik Vogt  <vogt@linux.vnet.ibm.com>
            Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr79386.c b/gcc/testsuite/gcc.c-torture/compile/pr79386.c
new file mode 100644 (file)
index 0000000..21b7759
--- /dev/null
@@ -0,0 +1,46 @@
+/* PR rtl-optimization/79386 */
+
+int a, b;
+
+int
+foo (int x)
+{
+  int c;
+  int *d, *e;
+
+  if (b == 0)
+    {
+      c = 0;
+      e = &b;
+      d = &b;
+    }
+  else
+    {
+      int f;
+
+      c = 1;
+      for (f = 0; f < 9; ++f)
+       c *= 3;
+      e = (int *) (__UINTPTR_TYPE__) c;
+      d = &x;
+    }
+  *e = c < 3;
+  if (*e != 0)
+    {
+      int g;
+
+      b += (a != 0) ? a : 1;
+      if (g != 0 || x != 0)
+       *d = 0;
+      if (b >= 0)
+       {
+         if (g != 0)
+           g = x;
+         if (*d / g != 0)
+           for (;;)
+             ;
+       }
+    }
+
+  return b * (a != 0 && *d != 0);
+}