cfgexpand.c (expand_gimple_stmt_1): Use ops.code.
authorRichard Biener <rguenther@suse.de>
Thu, 23 Apr 2015 08:30:04 +0000 (08:30 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 23 Apr 2015 08:30:04 +0000 (08:30 +0000)
2015-04-23  Richard Biener  <rguenther@suse.de>

* cfgexpand.c (expand_gimple_stmt_1): Use ops.code.
* cfgloop.c (verify_loop_structure): Verify the root loop node.
* except.c (duplicate_eh_regions): Call get_eh_region_from_lp_number_fn
instead of get_eh_region_from_lp_number.
* loop-init.c (fix_loop_structure): If we removed a loop, reset
the SCEV cache.

From-SVN: r222353

gcc/ChangeLog
gcc/cfgexpand.c
gcc/cfgloop.c
gcc/except.c
gcc/loop-init.c

index 4db6fa494beef22df84a834e8518e5b2485c6d02..d76faf853e95dfc9ffc9d5d6293eb59f26ad7d7b 100644 (file)
@@ -1,3 +1,12 @@
+2015-04-23  Richard Biener  <rguenther@suse.de>
+
+       * cfgexpand.c (expand_gimple_stmt_1): Use ops.code.
+       * cfgloop.c (verify_loop_structure): Verify the root loop node.
+       * except.c (duplicate_eh_regions): Call get_eh_region_from_lp_number_fn
+       instead of get_eh_region_from_lp_number.
+       * loop-init.c (fix_loop_structure): If we removed a loop, reset
+       the SCEV cache.
+
 2015-04-23  Anton Blanchard  <anton@samba.org>
 
        * config/rs6000/rs6000.c (rs6000_output_function_prologue): No
index ca491a0d1560e1d9955085b9aa647d9ef8675c1f..5905ddb44f780f912a2f0d87258bec6750277565 100644 (file)
@@ -3413,7 +3413,7 @@ expand_gimple_stmt_1 (gimple stmt)
 
            ops.code = gimple_assign_rhs_code (assign_stmt);
            ops.type = TREE_TYPE (lhs);
-           switch (get_gimple_rhs_class (gimple_expr_code (stmt)))
+           switch (get_gimple_rhs_class (ops.code))
              {
                case GIMPLE_TERNARY_RHS:
                  ops.op2 = gimple_assign_rhs3 (assign_stmt);
index ce56b69192aa586a629c2e25203acc2b917ec958..57674946bfe7ba53a83477f7c6776f50845cf509 100644 (file)
@@ -1347,6 +1347,16 @@ verify_loop_structure (void)
   else
     verify_dominators (CDI_DOMINATORS);
 
+  /* Check the loop tree root.  */
+  if (current_loops->tree_root->header != ENTRY_BLOCK_PTR_FOR_FN (cfun)
+      || current_loops->tree_root->latch != EXIT_BLOCK_PTR_FOR_FN (cfun)
+      || (current_loops->tree_root->num_nodes
+         != (unsigned) n_basic_blocks_for_fn (cfun)))
+    {
+      error ("corrupt loop tree root");
+      err = 1;
+    }
+
   /* Check the headers.  */
   FOR_EACH_BB_FN (bb, cfun)
     if (bb_loop_header_p (bb))
index 7e6591bfc5509dc94d101fb4061ac2bae5486c13..d6095926a991c8a3d0d9b25bccf8d51d7748d65e 100644 (file)
@@ -649,7 +649,7 @@ duplicate_eh_regions (struct function *ifun,
   data.label_map_data = map_data;
   data.eh_map = new hash_map<void *, void *>;
 
-  outer_region = get_eh_region_from_lp_number (outer_lp);
+  outer_region = get_eh_region_from_lp_number_fn (cfun, outer_lp);
 
   /* Copy all the regions in the subtree.  */
   if (copy_region)
index c13d360fb5a3bc2a87e77f15434375099db97d8b..87e58ea677d7b19d1cba851bfc9d7ad8574505fc 100644 (file)
@@ -49,6 +49,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "ggc.h"
 #include "tree-ssa-loop-niter.h"
 #include "loop-unroll.h"
+#include "tree-scalar-evolution.h"
 
 \f
 /* Apply FLAGS to the loop state.  */
@@ -221,6 +222,9 @@ fix_loop_structure (bitmap changed_bbs)
 
   timevar_push (TV_LOOP_INIT);
 
+  if (dump_file && (dump_flags & TDF_DETAILS))
+    fprintf (dump_file, "fix_loop_structure: fixing up loops for function\n");
+
   /* We need exact and fast dominance info to be available.  */
   gcc_assert (dom_info_state (CDI_DOMINATORS) == DOM_OK);
 
@@ -290,6 +294,7 @@ fix_loop_structure (bitmap changed_bbs)
     }
 
   /* Finally free deleted loops.  */
+  bool any_deleted = false;
   FOR_EACH_VEC_ELT (*get_loops (cfun), i, loop)
     if (loop && loop->header == NULL)
       {
@@ -322,8 +327,14 @@ fix_loop_structure (bitmap changed_bbs)
          }
        (*get_loops (cfun))[i] = NULL;
        flow_loop_free (loop);
+       any_deleted = true;
       }
 
+  /* If we deleted loops then the cached scalar evolutions refering to
+     those loops become invalid.  */
+  if (any_deleted && scev_initialized_p ())
+    scev_reset_htab ();
+
   loops_state_clear (LOOPS_NEED_FIXUP);
 
   /* Apply flags to loops.  */