re PR middle-end/70807 (fwprop pass ICE with incoming CDI_DOMINATORS)
authorIlya Enkovich <ilya.enkovich@intel.com>
Wed, 11 May 2016 09:33:13 +0000 (09:33 +0000)
committerIlya Enkovich <ienkovich@gcc.gnu.org>
Wed, 11 May 2016 09:33:13 +0000 (09:33 +0000)
gcc/

PR middle-end/70807
* cfgrtl.h (delete_insn_and_edges): Now return bool.
* cfgrtl.c (delete_insn_and_edges): Likewise.
* config/i386/i386.c (convert_scalars_to_vector): Remove
redundant code.
* cse.c (cse_insn): Compute cse_cfg_altered.
(delete_trivially_dead_insns): Likewise.
(cse_cc_succs): Likewise.
(rest_of_handle_cse): Free dominance info if required.
(rest_of_handle_cse2): Likewise.
(rest_of_handle_cse_after_global_opts): Likewise.

gcc/testsuite/

PR middle-end/70807
* gcc.dg/pr70807.c: New test.

From-SVN: r236114

gcc/ChangeLog
gcc/cfgrtl.c
gcc/cfgrtl.h
gcc/config/i386/i386.c
gcc/cse.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr70807.c [new file with mode: 0644]

index 84d5ddcba2c8a4ee2549309e373e567f2a4c83ef..b0d0949a62e2806d61b61b8521bb4dababbb7b62 100644 (file)
@@ -1,3 +1,17 @@
+2016-05-11  Ilya Enkovich  <ilya.enkovich@intel.com>
+
+       PR middle-end/70807
+       * cfgrtl.h (delete_insn_and_edges): Now return bool.
+       * cfgrtl.c (delete_insn_and_edges): Likewise.
+       * config/i386/i386.c (convert_scalars_to_vector): Remove
+       redundant code.
+       * cse.c (cse_insn): Compute cse_cfg_altered.
+       (delete_trivially_dead_insns): Likewise.
+       (cse_cc_succs): Likewise.
+       (rest_of_handle_cse): Free dominance info if required.
+       (rest_of_handle_cse2): Likewise.
+       (rest_of_handle_cse_after_global_opts): Likewise.
+
 2016-05-11  Alan Modra  <amodra@gmail.com>
 
        * config/rs6000/rs6000.c (is_complex_IBM_long_double,
index 62b0596203f01a816f782f7b802ab983aae0d958..3d8ed60c2a0c162d962cf5e540b4f0c745517455 100644 (file)
@@ -215,9 +215,10 @@ delete_insn (rtx uncast_insn)
     }
 }
 
-/* Like delete_insn but also purge dead edges from BB.  */
+/* Like delete_insn but also purge dead edges from BB.
+   Return true if any edges are eliminated.  */
 
-void
+bool
 delete_insn_and_edges (rtx_insn *insn)
 {
   bool purge = false;
@@ -228,7 +229,8 @@ delete_insn_and_edges (rtx_insn *insn)
     purge = true;
   delete_insn (insn);
   if (purge)
-    purge_dead_edges (BLOCK_FOR_INSN (insn));
+    return purge_dead_edges (BLOCK_FOR_INSN (insn));
+  return false;
 }
 
 /* Unlink a chain of insns between START and FINISH, leaving notes
index 0d880242354a4e30bff014544c44566eb83c7051..d81928a6ebfb33dc23f42b2ea62d65a6cfeb07ba 100644 (file)
@@ -21,7 +21,7 @@ along with GCC; see the file COPYING3.  If not see
 #define GCC_CFGRTL_H
 
 extern void delete_insn (rtx);
-extern void delete_insn_and_edges (rtx_insn *);
+extern bool delete_insn_and_edges (rtx_insn *);
 extern void delete_insn_chain (rtx, rtx, bool);
 extern basic_block create_basic_block_structure (rtx_insn *, rtx_insn *,
                                                 rtx_note *, basic_block);
index 237ba8009d662400267da8b5e9330b6ad1f0b6a5..9f62089b8b127622c8e962214acf1a78fdef2e41 100644 (file)
@@ -3969,13 +3969,6 @@ convert_scalars_to_vector ()
   bitmap_obstack_release (NULL);
   df_process_deferred_rescans ();
 
-  /* FIXME: Since the CSE pass may change dominance info, which isn't
-     expected by the fwprop pass, call free_dominance_info to
-     invalidate dominance info.  Otherwise, the fwprop pass may crash
-     when dominance info is changed.  */
-  if (TARGET_64BIT)
-    free_dominance_info (CDI_DOMINATORS);
-
   /* Conversion means we may have 128bit register spills/fills
      which require aligned stack.  */
   if (converted_insns)
index 7456e84c3294c31f25bfa5464e352cbb056ca1e1..04e1a8563d7d2daca7773047808cb5809b95ef1c 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -5505,7 +5505,7 @@ cse_insn (rtx_insn *insn)
       else if (n_sets == 1 && dest == pc_rtx && src == pc_rtx)
        {
          /* One less use of the label this insn used to jump to.  */
-         delete_insn_and_edges (insn);
+         cse_cfg_altered |= delete_insn_and_edges (insn);
          cse_jumps_altered = true;
          /* No more processing for this set.  */
          sets[i].rtl = 0;
@@ -5516,7 +5516,7 @@ cse_insn (rtx_insn *insn)
        {
          if (cfun->can_throw_non_call_exceptions && can_throw_internal (insn))
            cse_cfg_altered = true;
-         delete_insn_and_edges (insn);
+         cse_cfg_altered |= delete_insn_and_edges (insn);
          /* No more processing for this set.  */
          sets[i].rtl = 0;
        }
@@ -5551,7 +5551,7 @@ cse_insn (rtx_insn *insn)
                  REG_NOTES (new_rtx) = note;
                }
 
-             delete_insn_and_edges (insn);
+             cse_cfg_altered |= delete_insn_and_edges (insn);
              insn = new_rtx;
            }
          else
@@ -7131,7 +7131,7 @@ delete_trivially_dead_insns (rtx_insn *insns, int nreg)
              count_reg_usage (insn, counts, NULL_RTX, -1);
              ndead++;
            }
-         delete_insn_and_edges (insn);
+         cse_cfg_altered |= delete_insn_and_edges (insn);
        }
     }
 
@@ -7427,7 +7427,7 @@ cse_cc_succs (basic_block bb, basic_block orig_bb, rtx cc_reg, rtx cc_src,
                                    newreg);
        }
 
-      delete_insn_and_edges (insns[i]);
+      cse_cfg_altered |= delete_insn_and_edges (insns[i]);
     }
 
   return mode;
@@ -7568,6 +7568,9 @@ rest_of_handle_cse (void)
   else if (tem == 1 || optimize > 1)
     cleanup_cfg (0);
 
+  if (cse_cfg_altered && dom_info_available_p (CDI_DOMINATORS))
+    free_dominance_info (CDI_DOMINATORS);
+
   return 0;
 }
 
@@ -7637,6 +7640,9 @@ rest_of_handle_cse2 (void)
   else if (tem == 1)
     cleanup_cfg (0);
 
+  if (cse_cfg_altered && dom_info_available_p (CDI_DOMINATORS))
+    free_dominance_info (CDI_DOMINATORS);
+
   cse_not_expected = 1;
   return 0;
 }
@@ -7695,7 +7701,7 @@ rest_of_handle_cse_after_global_opts (void)
 
   rebuild_jump_labels (get_insns ());
   tem = cse_main (get_insns (), max_reg_num ());
-  purge_all_dead_edges ();
+  cse_cfg_altered |= purge_all_dead_edges ();
   delete_trivially_dead_insns (get_insns (), max_reg_num ());
 
   cse_not_expected = !flag_rerun_cse_after_loop;
@@ -7711,6 +7717,9 @@ rest_of_handle_cse_after_global_opts (void)
   else if (tem == 1)
     cleanup_cfg (0);
 
+  if (cse_cfg_altered && dom_info_available_p (CDI_DOMINATORS))
+    free_dominance_info (CDI_DOMINATORS);
+
   flag_cse_follow_jumps = save_cfj;
   return 0;
 }
index dc87b0c34d6e35a4265a0c3402e43732edc9c458..de582b8f3579d825deb4bb8926a4d5471eaf7d24 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-11  Ilya Enkovich  <ilya.enkovich@intel.com>
+
+       PR middle-end/70807
+       * gcc.dg/pr70807.c: New test.
+
 2016-05-10  Martin Sebor  <msebor@redhat.com>
 
        PR c++/38611
diff --git a/gcc/testsuite/gcc.dg/pr70807.c b/gcc/testsuite/gcc.dg/pr70807.c
new file mode 100644 (file)
index 0000000..9ef2a4d
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR middle-end/70807 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+typedef int INT;
+int a, b, c, d, e, f;
+void fn1() {
+  INT g;
+  if (d && a)
+    ;
+  else if (e && b)
+    ;
+  else if (!a && !b && c)
+    ;
+  else if (b && d || a && e)
+    a = 0;
+  f = g || d;
+}