From b0dd8c90ff1a4a50e21b4b2918c7484f36106947 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 23 Apr 2015 08:30:04 +0000 Subject: [PATCH] cfgexpand.c (expand_gimple_stmt_1): Use ops.code. 2015-04-23 Richard Biener * 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 | 9 +++++++++ gcc/cfgexpand.c | 2 +- gcc/cfgloop.c | 10 ++++++++++ gcc/except.c | 2 +- gcc/loop-init.c | 11 +++++++++++ 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4db6fa494be..d76faf853e9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2015-04-23 Richard Biener + + * 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 * config/rs6000/rs6000.c (rs6000_output_function_prologue): No diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index ca491a0d156..5905ddb44f7 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -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); diff --git a/gcc/cfgloop.c b/gcc/cfgloop.c index ce56b69192a..57674946bfe 100644 --- a/gcc/cfgloop.c +++ b/gcc/cfgloop.c @@ -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)) diff --git a/gcc/except.c b/gcc/except.c index 7e6591bfc55..d6095926a99 100644 --- a/gcc/except.c +++ b/gcc/except.c @@ -649,7 +649,7 @@ duplicate_eh_regions (struct function *ifun, data.label_map_data = map_data; data.eh_map = new hash_map; - 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) diff --git a/gcc/loop-init.c b/gcc/loop-init.c index c13d360fb5a..87e58ea677d 100644 --- a/gcc/loop-init.c +++ b/gcc/loop-init.c @@ -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" /* 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. */ -- 2.30.2