This pushes a bunch of changes from my dev tree to trunk. Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
Richard. 2015-04-22 Richard Biener <rguent...@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. Index: gcc/cfgexpand.c =================================================================== --- gcc/cfgexpand.c (revision 222320) +++ gcc/cfgexpand.c (working copy) @@ -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: gcc/cfgloop.c =================================================================== --- gcc/cfgloop.c (revision 222320) +++ gcc/cfgloop.c (working copy) @@ -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: gcc/except.c =================================================================== --- gcc/except.c (revision 222320) +++ gcc/except.c (working copy) @@ -649,7 +649,7 @@ duplicate_eh_regions (struct function *i 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: gcc/loop-init.c =================================================================== --- gcc/loop-init.c (revision 222320) +++ gcc/loop-init.c (working copy) @@ -49,6 +49,7 @@ along with GCC; see the file COPYING3. #include "ggc.h" #include "tree-ssa-loop-niter.h" #include "loop-unroll.h" +#include "tree-scalar-evolution.h" /* 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. */