re PR debug/66691 (ICE on valid code at -O3 with -g enabled in simplify_subreg, at...
[gcc.git] / gcc / tree-loop-distribution.c
index 1d47c4e678290e37c2edc2b795a2435334257194..19523b941d2a52de888d61103cf33f0e5af5d7d0 100644 (file)
@@ -44,15 +44,14 @@ along with GCC; see the file COPYING3.  If not see
 #include "config.h"
 #include "system.h"
 #include "coretypes.h"
+#include "alias.h"
+#include "symtab.h"
+#include "options.h"
 #include "tree.h"
+#include "fold-const.h"
 #include "predict.h"
-#include "vec.h"
-#include "hashtab.h"
-#include "hash-set.h"
-#include "machmode.h"
 #include "tm.h"
 #include "hard-reg-set.h"
-#include "input.h"
 #include "function.h"
 #include "dominance.h"
 #include "cfg.h"
@@ -61,7 +60,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "tree-ssa-alias.h"
 #include "internal-fn.h"
 #include "gimple-expr.h"
-#include "is-a.h"
 #include "gimple.h"
 #include "gimple-iterator.h"
 #include "gimplify-me.h"
@@ -1355,15 +1353,14 @@ pg_add_dependence_edges (struct graph *rdg, vec<loop_p> loops, int dir,
   for (int ii = 0; drs1.iterate (ii, &dr1); ++ii)
     for (int jj = 0; drs2.iterate (jj, &dr2); ++jj)
       {
+       data_reference_p saved_dr1 = dr1;
        int this_dir = 1;
        ddr_p ddr;
        /* Re-shuffle data-refs to be in dominator order.  */
        if (rdg_vertex_for_stmt (rdg, DR_STMT (dr1))
            > rdg_vertex_for_stmt (rdg, DR_STMT (dr2)))
          {
-           data_reference_p tem = dr1;
-           dr1 = dr2;
-           dr2 = tem;
+           std::swap (dr1, dr2);
            this_dir = -this_dir;
          }
        ddr = initialize_data_dependence_relation (dr1, dr2, loops);
@@ -1374,9 +1371,7 @@ pg_add_dependence_edges (struct graph *rdg, vec<loop_p> loops, int dir,
          {
            if (DDR_REVERSED_P (ddr))
              {
-               data_reference_p tem = dr1;
-               dr1 = dr2;
-               dr2 = tem;
+               std::swap (dr1, dr2);
                this_dir = -this_dir;
              }
            /* Known dependences can still be unordered througout the
@@ -1400,6 +1395,8 @@ pg_add_dependence_edges (struct graph *rdg, vec<loop_p> loops, int dir,
          dir = this_dir;
        else if (dir != this_dir)
          return 2;
+       /* Shuffle "back" dr1.  */
+       dr1 = saved_dr1;
       }
   return dir;
 }
@@ -1828,6 +1825,9 @@ out:
 
   if (changed)
     {
+      /* Cached scalar evolutions now may refer to wrong or non-existing
+        loops.  */
+      scev_reset_htab ();
       mark_virtual_operands_for_renaming (fun);
       rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
     }