diff options
Diffstat (limited to 'gcc/tree-ssa-tail-merge.c')
-rw-r--r-- | gcc/tree-ssa-tail-merge.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c index f6c9878a0a3..a65ff31d900 100644 --- a/gcc/tree-ssa-tail-merge.c +++ b/gcc/tree-ssa-tail-merge.c @@ -207,6 +207,8 @@ along with GCC; see the file COPYING3. If not see #include "tree-eh.h" #include "tree-cfgcleanup.h" +const int ignore_edge_flags = EDGE_DFS_BACK | EDGE_EXECUTABLE; + /* Describes a group of bbs with the same successors. The successor bbs are cached in succs, and the successor edge flags are cached in succ_flags. If a bb has the EDGE_TRUE/FALSE_VALUE flags swapped compared to succ_flags, @@ -479,6 +481,8 @@ same_succ_hash (const same_succ *e) hstate.add_int (size); BB_SIZE (bb) = size; + hstate.add_int (bb->loop_father->num); + for (i = 0; i < e->succ_flags.length (); ++i) { flags = e->succ_flags[i]; @@ -568,6 +572,9 @@ same_succ::equal (const same_succ *e1, const same_succ *e2) if (BB_SIZE (bb1) != BB_SIZE (bb2)) return 0; + if (bb1->loop_father != bb2->loop_father) + return 0; + gsi1 = gsi_start_nondebug_bb (bb1); gsi2 = gsi_start_nondebug_bb (bb2); gsi_advance_fw_nondebug_nonlocal (&gsi1); @@ -695,22 +702,14 @@ find_same_succ_bb (basic_block bb, same_succ **same_p) edge_iterator ei; edge e; - if (bb == NULL - /* Be conservative with loop structure. It's not evident that this test - is sufficient. Before tail-merge, we've just called - loop_optimizer_finalize, and LOOPS_MAY_HAVE_MULTIPLE_LATCHES is now - set, so there's no guarantee that the loop->latch value is still valid. - But we assume that, since we've forced LOOPS_HAVE_SIMPLE_LATCHES at the - start of pre, we've kept that property intact throughout pre, and are - keeping it throughout tail-merge using this test. */ - || bb->loop_father->latch == bb) + if (bb == NULL) return; bitmap_set_bit (same->bbs, bb->index); FOR_EACH_EDGE (e, ei, bb->succs) { int index = e->dest->index; bitmap_set_bit (same->succs, index); - same_succ_edge_flags[index] = e->flags; + same_succ_edge_flags[index] = (e->flags & ~ignore_edge_flags); } EXECUTE_IF_SET_IN_BITMAP (same->succs, 0, j, bj) same->succ_flags.safe_push (same_succ_edge_flags[j]); @@ -809,6 +808,9 @@ static void same_succ_flush_bb (basic_block bb) { same_succ *same = BB_SAME_SUCC (bb); + if (! same) + return; + BB_SAME_SUCC (bb) = NULL; if (bitmap_single_bit_set_p (same->bbs)) same_succ_htab->remove_elt_with_hash (same, same->hashval); @@ -1239,6 +1241,7 @@ merge_stmts_p (gimple *stmt1, gimple *stmt2) case IFN_UBSAN_CHECK_SUB: case IFN_UBSAN_CHECK_MUL: case IFN_UBSAN_OBJECT_SIZE: + case IFN_UBSAN_PTR: case IFN_ASAN_CHECK: /* For these internal functions, gimple_location is an implicit parameter, which will be used explicitly after expansion. @@ -1592,9 +1595,10 @@ replace_block_by (basic_block bb1, basic_block bb2) else if (bb2->frequency && !bb1->frequency) ; else if (out_freq_sum) - e2->probability = GCOV_COMPUTE_SCALE (EDGE_FREQUENCY (e1) - + EDGE_FREQUENCY (e2), - out_freq_sum); + e2->probability = profile_probability::from_reg_br_prob_base + (GCOV_COMPUTE_SCALE (EDGE_FREQUENCY (e1) + + EDGE_FREQUENCY (e2), + out_freq_sum)); out_sum += e2->count; } bb2->frequency += bb1->frequency; |