diff options
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r-- | gcc/tree-vrp.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 9b26f17..c1ff475 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -5904,6 +5904,34 @@ find_assert_locations (void) for (i = 0; i < rpo_cnt; ++i) bb_rpo[rpo[i]] = i; + /* Pre-seed loop latch liveness from loop header PHI nodes. Due to + the order we compute liveness and insert asserts we otherwise + fail to insert asserts into the loop latch. */ + loop_p loop; + loop_iterator li; + FOR_EACH_LOOP (li, loop, 0) + { + i = loop->latch->index; + unsigned int j = single_succ_edge (loop->latch)->dest_idx; + for (gimple_stmt_iterator gsi = gsi_start_phis (loop->header); + !gsi_end_p (gsi); gsi_next (&gsi)) + { + gimple phi = gsi_stmt (gsi); + if (virtual_operand_p (gimple_phi_result (phi))) + continue; + tree arg = gimple_phi_arg_def (phi, j); + if (TREE_CODE (arg) == SSA_NAME) + { + if (live[i] == NULL) + { + live[i] = sbitmap_alloc (num_ssa_names); + bitmap_clear (live[i]); + } + bitmap_set_bit (live[i], SSA_NAME_VERSION (arg)); + } + } + } + need_asserts = false; for (i = rpo_cnt - 1; i >= 0; --i) { |