diff options
Diffstat (limited to 'gcc/ifcvt.c')
-rw-r--r-- | gcc/ifcvt.c | 248 |
1 files changed, 169 insertions, 79 deletions
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index fe3806066b1..2b10e18628e 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -84,9 +84,6 @@ static int cond_exec_changed_p; /* True if life data ok at present. */ static bool life_data_ok; -/* The post-dominator relation on the original block numbers. */ -static dominance_info post_dominators; - /* Forward references. */ static int count_bb_insns (basic_block); static rtx first_active_insn (basic_block); @@ -123,6 +120,7 @@ mark_loop_exit_edges (void) edge e; flow_loops_find (&loops, LOOP_TREE); + free_dominance_info (CDI_DOMINATORS); if (loops.num > 1) { @@ -148,14 +146,14 @@ static int count_bb_insns (basic_block bb) { int count = 0; - rtx insn = bb->head; + rtx insn = BB_HEAD (bb); while (1) { if (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == INSN) count++; - if (insn == bb->end) + if (insn == BB_END (bb)) break; insn = NEXT_INSN (insn); } @@ -168,18 +166,18 @@ count_bb_insns (basic_block bb) static rtx first_active_insn (basic_block bb) { - rtx insn = bb->head; + rtx insn = BB_HEAD (bb); if (GET_CODE (insn) == CODE_LABEL) { - if (insn == bb->end) + if (insn == BB_END (bb)) return NULL_RTX; insn = NEXT_INSN (insn); } while (GET_CODE (insn) == NOTE) { - if (insn == bb->end) + if (insn == BB_END (bb)) return NULL_RTX; insn = NEXT_INSN (insn); } @@ -195,8 +193,8 @@ first_active_insn (basic_block bb) static rtx last_active_insn (basic_block bb, int skip_use_p) { - rtx insn = bb->end; - rtx head = bb->head; + rtx insn = BB_END (bb); + rtx head = BB_HEAD (bb); while (GET_CODE (insn) == NOTE || GET_CODE (insn) == JUMP_INSN @@ -407,13 +405,13 @@ cond_exec_process_if_block (ce_if_block_t * ce_info, /* Find the conditional jump to the ELSE or JOIN part, and isolate the test. */ - test_expr = cond_exec_get_condition (test_bb->end); + test_expr = cond_exec_get_condition (BB_END (test_bb)); if (! test_expr) return FALSE; /* If the conditional jump is more than just a conditional jump, then we can not do conditional execution conversion on this block. */ - if (! onlyjump_p (test_bb->end)) + if (! onlyjump_p (BB_END (test_bb))) return FALSE; /* Collect the bounds of where we're to search, skipping any labels, jumps @@ -440,7 +438,7 @@ cond_exec_process_if_block (ce_if_block_t * ce_info, true_expr = test_expr; - false_code = reversed_comparison_code (true_expr, test_bb->end); + false_code = reversed_comparison_code (true_expr, BB_END (test_bb)); if (false_code != UNKNOWN) false_expr = gen_rtx_fmt_ee (false_code, GET_MODE (true_expr), XEXP (true_expr, 0), XEXP (true_expr, 1)); @@ -452,12 +450,12 @@ cond_exec_process_if_block (ce_if_block_t * ce_info, conditional execution register from a comparison, it can do so here. */ IFCVT_MODIFY_TESTS (ce_info, true_expr, false_expr); - /* See if the conversion failed */ + /* See if the conversion failed. */ if (!true_expr || !false_expr) goto fail; #endif - true_prob_val = find_reg_note (test_bb->end, REG_BR_PROB, NULL_RTX); + true_prob_val = find_reg_note (BB_END (test_bb), REG_BR_PROB, NULL_RTX); if (true_prob_val) { true_prob_val = XEXP (true_prob_val, 0); @@ -491,11 +489,11 @@ cond_exec_process_if_block (ce_if_block_t * ce_info, /* If the conditional jump is more than just a conditional jump, then we can not do conditional execution conversion on this block. */ - if (! onlyjump_p (bb->end)) + if (! onlyjump_p (BB_END (bb))) goto fail; /* Find the conditional jump and isolate the test. */ - t = cond_exec_get_condition (bb->end); + t = cond_exec_get_condition (BB_END (bb)); if (! t) goto fail; @@ -521,7 +519,7 @@ cond_exec_process_if_block (ce_if_block_t * ce_info, #ifdef IFCVT_MODIFY_MULTIPLE_TESTS IFCVT_MODIFY_MULTIPLE_TESTS (ce_info, bb, t, f); - /* See if the conversion failed */ + /* See if the conversion failed. */ if (!t || !f) goto fail; #endif @@ -563,7 +561,7 @@ cond_exec_process_if_block (ce_if_block_t * ce_info, } #ifdef IFCVT_MODIFY_FINAL - /* Do any machine dependent final modifications */ + /* Do any machine dependent final modifications. */ IFCVT_MODIFY_FINAL (ce_info); #endif @@ -602,6 +600,7 @@ struct noce_if_info }; static rtx noce_emit_store_flag (struct noce_if_info *, rtx, int, int); +static int noce_try_move (struct noce_if_info *); static int noce_try_store_flag (struct noce_if_info *); static int noce_try_addcc (struct noce_if_info *); static int noce_try_store_flag_constants (struct noce_if_info *); @@ -674,7 +673,9 @@ noce_emit_store_flag (struct noce_if_info *if_info, rtx x, int reversep, || code == GEU || code == GTU), normalize); } -/* Emit instruction to move an rtx into STRICT_LOW_PART. */ +/* Emit instruction to move an rtx, possibly into STRICT_LOW_PART. + X is the destination/target and Y is the value to copy. */ + static void noce_emit_move_insn (rtx x, rtx y) { @@ -697,6 +698,60 @@ noce_emit_move_insn (rtx x, rtx y) GET_MODE_BITSIZE (inmode)); } +/* Unshare sequence SEQ produced by if conversion. We care to mark + all arguments that may be shared with outer instruction stream. */ +static void +unshare_ifcvt_sequence (struct noce_if_info *if_info, rtx seq) +{ + set_used_flags (if_info->x); + set_used_flags (if_info->cond); + unshare_all_rtl_in_chain (seq); +} + +/* Convert "if (a != b) x = a; else x = b" into "x = a" and + "if (a == b) x = a; else x = b" into "x = b". */ + +static int +noce_try_move (struct noce_if_info *if_info) +{ + rtx cond = if_info->cond; + enum rtx_code code = GET_CODE (cond); + rtx y, seq; + + if (code != NE && code != EQ) + return FALSE; + + /* This optimization isn't valid if either A or B could be a NaN + or a signed zero. */ + if (HONOR_NANS (GET_MODE (if_info->x)) + || HONOR_SIGNED_ZEROS (GET_MODE (if_info->x))) + return FALSE; + + /* Check whether the operands of the comparison are A and in + either order. */ + if ((rtx_equal_p (if_info->a, XEXP (cond, 0)) + && rtx_equal_p (if_info->b, XEXP (cond, 1))) + || (rtx_equal_p (if_info->a, XEXP (cond, 1)) + && rtx_equal_p (if_info->b, XEXP (cond, 0)))) + { + y = (code == EQ) ? if_info->a : if_info->b; + + /* Avoid generating the move if the source is the destination. */ + if (! rtx_equal_p (if_info->x, y)) + { + start_sequence (); + noce_emit_move_insn (if_info->x, y); + seq = get_insns (); + unshare_ifcvt_sequence (if_info, seq); + end_sequence (); + emit_insn_before_setloc (seq, if_info->jump, + INSN_LOCATOR (if_info->insn_a)); + } + return TRUE; + } + return FALSE; +} + /* Convert "if (test) x = 1; else x = 0". Only try 0 and STORE_FLAG_VALUE here. Other combinations will be @@ -731,6 +786,7 @@ noce_try_store_flag (struct noce_if_info *if_info) noce_emit_move_insn (if_info->x, target); seq = get_insns (); + unshare_ifcvt_sequence (if_info, seq); end_sequence (); emit_insn_before_setloc (seq, if_info->jump, INSN_LOCATOR (if_info->insn_a)); @@ -861,6 +917,7 @@ noce_try_store_flag_constants (struct noce_if_info *if_info) noce_emit_move_insn (if_info->x, target); seq = get_insns (); + unshare_ifcvt_sequence (if_info, seq); end_sequence (); if (seq_contains_jump (seq)) @@ -898,9 +955,11 @@ noce_try_addcc (struct noce_if_info *if_info) { start_sequence (); target = emit_conditional_add (if_info->x, code, - XEXP (cond, 0), XEXP (cond, 1), + XEXP (cond, 0), + XEXP (cond, 1), VOIDmode, - if_info->b, XEXP (if_info->a, 1), + if_info->b, + XEXP (if_info->a, 1), GET_MODE (if_info->x), (code == LTU || code == GEU || code == LEU || code == GTU)); @@ -910,6 +969,7 @@ noce_try_addcc (struct noce_if_info *if_info) noce_emit_move_insn (if_info->x, target); seq = get_insns (); + unshare_ifcvt_sequence (if_info, seq); end_sequence (); emit_insn_before_setloc (seq, if_info->jump, INSN_LOCATOR (if_info->insn_a)); @@ -948,6 +1008,7 @@ noce_try_addcc (struct noce_if_info *if_info) noce_emit_move_insn (if_info->x, target); seq = get_insns (); + unshare_ifcvt_sequence (if_info, seq); end_sequence (); if (seq_contains_jump (seq)) @@ -991,7 +1052,8 @@ noce_try_store_flag_mask (struct noce_if_info *if_info) reversep, -1); if (target) target = expand_simple_binop (GET_MODE (if_info->x), AND, - if_info->x, target, if_info->x, 0, + if_info->x, + target, if_info->x, 0, OPTAB_WIDEN); if (target) @@ -1000,6 +1062,7 @@ noce_try_store_flag_mask (struct noce_if_info *if_info) noce_emit_move_insn (if_info->x, target); seq = get_insns (); + unshare_ifcvt_sequence (if_info, seq); end_sequence (); if (seq_contains_jump (seq)) @@ -1097,6 +1160,7 @@ noce_try_cmove (struct noce_if_info *if_info) noce_emit_move_insn (if_info->x, target); seq = get_insns (); + unshare_ifcvt_sequence (if_info, seq); end_sequence (); emit_insn_before_setloc (seq, if_info->jump, INSN_LOCATOR (if_info->insn_a)); @@ -1214,7 +1278,9 @@ noce_try_cmove_arith (struct noce_if_info *if_info) if (is_mem) { tmp = gen_reg_rtx (GET_MODE (b)); - tmp = emit_insn (gen_rtx_SET (VOIDmode, tmp, b)); + tmp = emit_insn (gen_rtx_SET (VOIDmode, + tmp, + b)); } else if (! insn_b) goto end_seq_and_fail; @@ -1259,6 +1325,7 @@ noce_try_cmove_arith (struct noce_if_info *if_info) noce_emit_move_insn (x, target); tmp = get_insns (); + unshare_ifcvt_sequence (if_info, tmp); end_sequence (); emit_insn_before_setloc (tmp, if_info->jump, INSN_LOCATOR (if_info->insn_a)); return TRUE; @@ -1504,6 +1571,7 @@ noce_try_minmax (struct noce_if_info *if_info) noce_emit_move_insn (if_info->x, target); seq = get_insns (); + unshare_ifcvt_sequence (if_info, seq); end_sequence (); if (seq_contains_jump (seq)) @@ -1559,7 +1627,7 @@ noce_try_abs (struct noce_if_info *if_info) { rtx insn, note = NULL; for (insn = earliest; - insn != if_info->test_bb->head; + insn != BB_HEAD (if_info->test_bb); insn = PREV_INSN (insn)) if (INSN_P (insn) && ((note = find_reg_note (insn, REG_EQUAL, c)) @@ -1606,7 +1674,7 @@ noce_try_abs (struct noce_if_info *if_info) target = expand_abs_nojump (GET_MODE (if_info->x), b, if_info->x, 1); - /* ??? It's a quandry whether cmove would be better here, especially + /* ??? It's a quandary whether cmove would be better here, especially for integers. Perhaps combine will clean things up. */ if (target && negate) target = expand_simple_unop (GET_MODE (target), NEG, target, if_info->x, 0); @@ -1621,6 +1689,7 @@ noce_try_abs (struct noce_if_info *if_info) noce_emit_move_insn (if_info->x, target); seq = get_insns (); + unshare_ifcvt_sequence (if_info, seq); end_sequence (); if (seq_contains_jump (seq)) @@ -1758,7 +1827,7 @@ noce_process_if_block (struct ce_if_block * ce_info) } /* If this is not a standard conditional jump, we can't parse it. */ - jump = test_bb->end; + jump = BB_END (test_bb); cond = noce_get_condition (jump, &if_info.cond_earliest); if (! cond) return FALSE; @@ -1874,8 +1943,8 @@ noce_process_if_block (struct ce_if_block * ce_info) { rtx note; - if (else_bb && insn_b == else_bb->end) - else_bb->end = PREV_INSN (insn_b); + if (else_bb && insn_b == BB_END (else_bb)) + BB_END (else_bb) = PREV_INSN (insn_b); reorder_insns (insn_b, insn_b, PREV_INSN (jump)); /* If there was a REG_EQUAL note, delete it since it may have been @@ -1894,6 +1963,27 @@ noce_process_if_block (struct ce_if_block * ce_info) goto success; } + /* Disallow the "if (...) x = a;" form (with an implicit "else x = x;") + for most optimizations if writing to x may trap, i.e. its a memory + other than a static var or a stack slot. */ + if (! set_b + && GET_CODE (orig_x) == MEM + && ! MEM_NOTRAP_P (orig_x) + && rtx_addr_can_trap_p (XEXP (orig_x, 0))) + { + if (HAVE_conditional_move) + { + if (noce_try_cmove (&if_info)) + goto success; + if (! HAVE_conditional_execution + && noce_try_cmove_arith (&if_info)) + goto success; + } + return FALSE; + } + + if (noce_try_move (&if_info)) + goto success; if (noce_try_store_flag (&if_info)) goto success; if (noce_try_minmax (&if_info)) @@ -1940,11 +2030,13 @@ noce_process_if_block (struct ce_if_block * ce_info) if (orig_x != x) { start_sequence (); - noce_emit_move_insn (copy_rtx (orig_x), x); + noce_emit_move_insn (orig_x, x); insn_b = get_insns (); + set_used_flags (orig_x); + unshare_all_rtl_in_chain (insn_b); end_sequence (); - emit_insn_after_setloc (insn_b, test_bb->end, INSN_LOCATOR (insn_a)); + emit_insn_after_setloc (insn_b, BB_END (test_bb), INSN_LOCATOR (insn_a)); } /* Merge the blocks! */ @@ -2011,8 +2103,8 @@ merge_if_block (struct ce_if_block * ce_info) { bb = fallthru; fallthru = block_fallthru (bb); - if (post_dominators) - delete_from_dominance_info (post_dominators, bb); + if (dom_computed[CDI_POST_DOMINATORS] >= DOM_NO_FAST_QUERY) + delete_from_dominance_info (CDI_POST_DOMINATORS, bb); merge_blocks (combo_bb, bb); num_true_changes++; } @@ -2028,8 +2120,8 @@ merge_if_block (struct ce_if_block * ce_info) if (combo_bb->global_live_at_end) COPY_REG_SET (combo_bb->global_live_at_end, then_bb->global_live_at_end); - if (post_dominators) - delete_from_dominance_info (post_dominators, then_bb); + if (dom_computed[CDI_POST_DOMINATORS] >= DOM_NO_FAST_QUERY) + delete_from_dominance_info (CDI_POST_DOMINATORS, then_bb); merge_blocks (combo_bb, then_bb); num_true_changes++; } @@ -2039,8 +2131,8 @@ merge_if_block (struct ce_if_block * ce_info) get their addresses taken. */ if (else_bb) { - if (post_dominators) - delete_from_dominance_info (post_dominators, else_bb); + if (dom_computed[CDI_POST_DOMINATORS] >= DOM_NO_FAST_QUERY) + delete_from_dominance_info (CDI_POST_DOMINATORS, else_bb); merge_blocks (combo_bb, else_bb); num_true_changes++; } @@ -2050,7 +2142,7 @@ merge_if_block (struct ce_if_block * ce_info) if (! join_bb) { - rtx last = combo_bb->end; + rtx last = BB_END (combo_bb); /* The outgoing edge for the current COMBO block should already be correct. Verify this. */ @@ -2096,8 +2188,8 @@ merge_if_block (struct ce_if_block * ce_info) COPY_REG_SET (combo_bb->global_live_at_end, join_bb->global_live_at_end); - if (post_dominators) - delete_from_dominance_info (post_dominators, join_bb); + if (dom_computed[CDI_POST_DOMINATORS] >= DOM_NO_FAST_QUERY) + delete_from_dominance_info (CDI_POST_DOMINATORS, join_bb); merge_blocks (combo_bb, join_bb); num_true_changes++; } @@ -2177,7 +2269,7 @@ find_if_header (basic_block test_bb, int pass) && find_cond_trap (test_bb, then_edge, else_edge)) goto success; - if (post_dominators + if (dom_computed[CDI_POST_DOMINATORS] >= DOM_NO_FAST_QUERY && (! HAVE_conditional_execution || reload_completed)) { if (find_if_case_1 (test_bb, then_edge, else_edge)) @@ -2241,8 +2333,8 @@ block_jumps_and_fallthru_p (basic_block cur_bb, basic_block target_bb) together for conditional execution support. ??? we should support conditional execution support across calls for IA-64 some day, but for now it makes the code simpler. */ - end = cur_bb->end; - insn = cur_bb->head; + end = BB_END (cur_bb); + insn = BB_HEAD (cur_bb); while (insn != NULL_RTX) { @@ -2373,7 +2465,7 @@ find_if_block (struct ce_if_block * ce_info) if (then_succ != NULL_EDGE && (then_succ->succ_next != NULL_EDGE || (then_succ->flags & EDGE_COMPLEX) - || (flow2_completed && tablejump_p (then_bb->end, NULL, NULL)))) + || (flow2_completed && tablejump_p (BB_END (then_bb), NULL, NULL)))) return FALSE; /* If the THEN block has no successors, conditional execution can still @@ -2386,11 +2478,11 @@ find_if_block (struct ce_if_block * ce_info) { if (else_bb->pred->pred_next == NULL_EDGE) { - rtx last_insn = then_bb->end; + rtx last_insn = BB_END (then_bb); while (last_insn && GET_CODE (last_insn) == NOTE - && last_insn != then_bb->head) + && last_insn != BB_HEAD (then_bb)) last_insn = PREV_INSN (last_insn); if (last_insn @@ -2421,7 +2513,7 @@ find_if_block (struct ce_if_block * ce_info) && else_bb->pred->pred_next == NULL_EDGE && else_succ->succ_next == NULL_EDGE && ! (else_succ->flags & EDGE_COMPLEX) - && ! (flow2_completed && tablejump_p (else_bb->end, NULL, NULL))) + && ! (flow2_completed && tablejump_p (BB_END (else_bb), NULL, NULL))) join_bb = else_succ->dest; /* Otherwise it is not an IF-THEN or IF-THEN-ELSE combination. */ @@ -2435,15 +2527,15 @@ find_if_block (struct ce_if_block * ce_info) fprintf (rtl_dump_file, "\nIF-THEN%s block found, pass %d, start block %d [insn %d], then %d [%d]", (else_bb) ? "-ELSE" : "", ce_info->pass, - test_bb->index, (test_bb->head) ? (int)INSN_UID (test_bb->head) : -1, - then_bb->index, (then_bb->head) ? (int)INSN_UID (then_bb->head) : -1); + test_bb->index, (BB_HEAD (test_bb)) ? (int)INSN_UID (BB_HEAD (test_bb)) : -1, + then_bb->index, (BB_HEAD (then_bb)) ? (int)INSN_UID (BB_HEAD (then_bb)) : -1); if (else_bb) fprintf (rtl_dump_file, ", else %d [%d]", - else_bb->index, (else_bb->head) ? (int)INSN_UID (else_bb->head) : -1); + else_bb->index, (BB_HEAD (else_bb)) ? (int)INSN_UID (BB_HEAD (else_bb)) : -1); fprintf (rtl_dump_file, ", join %d [%d]", - join_bb->index, (join_bb->head) ? (int)INSN_UID (join_bb->head) : -1); + join_bb->index, (BB_HEAD (join_bb)) ? (int)INSN_UID (BB_HEAD (join_bb)) : -1); if (ce_info->num_multiple_test_blocks > 0) fprintf (rtl_dump_file, ", %d %s block%s last test %d [%d]", @@ -2451,8 +2543,8 @@ find_if_block (struct ce_if_block * ce_info) (ce_info->and_and_p) ? "&&" : "||", (ce_info->num_multiple_test_blocks == 1) ? "" : "s", ce_info->last_test_bb->index, - ((ce_info->last_test_bb->head) - ? (int)INSN_UID (ce_info->last_test_bb->head) + ((BB_HEAD (ce_info->last_test_bb)) + ? (int)INSN_UID (BB_HEAD (ce_info->last_test_bb)) : -1)); fputc ('\n', rtl_dump_file); @@ -2513,7 +2605,7 @@ find_cond_trap (basic_block test_bb, edge then_edge, edge else_edge) } /* If this is not a standard conditional jump, we can't parse it. */ - jump = test_bb->end; + jump = BB_END (test_bb); cond = noce_get_condition (jump, &cond_earliest); if (! cond) return FALSE; @@ -2537,7 +2629,8 @@ find_cond_trap (basic_block test_bb, edge then_edge, edge else_edge) } /* Attempt to generate the conditional trap. */ - seq = gen_cond_trap (code, XEXP (cond, 0), XEXP (cond, 1), + seq = gen_cond_trap (code, XEXP (cond, 0), + XEXP (cond, 1), TRAP_CODE (PATTERN (trap))); if (seq == NULL) return FALSE; @@ -2551,8 +2644,8 @@ find_cond_trap (basic_block test_bb, edge then_edge, edge else_edge) remove_edge (trap_bb == then_bb ? then_edge : else_edge); if (trap_bb->pred == NULL) { - if (post_dominators) - delete_from_dominance_info (post_dominators, trap_bb); + if (dom_computed[CDI_POST_DOMINATORS] >= DOM_NO_FAST_QUERY) + delete_from_dominance_info (CDI_POST_DOMINATORS, trap_bb); delete_block (trap_bb); } @@ -2603,7 +2696,7 @@ block_has_only_trap (basic_block bb) /* The only instruction in the THEN block must be the trap. */ trap = first_active_insn (bb); - if (! (trap == bb->end + if (! (trap == BB_END (bb) && GET_CODE (PATTERN (trap)) == TRAP_IF && TRAP_CONDITION (PATTERN (trap)) == const_true_rtx)) return NULL_RTX; @@ -2736,8 +2829,8 @@ find_if_case_1 (basic_block test_bb, edge then_edge, edge else_edge) new_bb = redirect_edge_and_branch_force (FALLTHRU_EDGE (test_bb), else_bb); then_bb_index = then_bb->index; - if (post_dominators) - delete_from_dominance_info (post_dominators, then_bb); + if (dom_computed[CDI_POST_DOMINATORS] >= DOM_NO_FAST_QUERY) + delete_from_dominance_info (CDI_POST_DOMINATORS, then_bb); delete_block (then_bb); /* Make rest of code believe that the newly created block is the THEN_BB @@ -2746,8 +2839,8 @@ find_if_case_1 (basic_block test_bb, edge then_edge, edge else_edge) { new_bb->index = then_bb_index; BASIC_BLOCK (then_bb_index) = new_bb; - if (post_dominators) - add_to_dominance_info (post_dominators, new_bb); + if (dom_computed[CDI_POST_DOMINATORS] >= DOM_NO_FAST_QUERY) + add_to_dominance_info (CDI_POST_DOMINATORS, new_bb); } /* We've possibly created jump to next insn, cleanup_cfg will solve that later. */ @@ -2785,11 +2878,11 @@ find_if_case_2 (basic_block test_bb, edge then_edge, edge else_edge) return FALSE; /* ELSE is predicted or SUCC(ELSE) postdominates THEN. */ - note = find_reg_note (test_bb->end, REG_BR_PROB, NULL_RTX); + note = find_reg_note (BB_END (test_bb), REG_BR_PROB, NULL_RTX); if (note && INTVAL (XEXP (note, 0)) >= REG_BR_PROB_BASE / 2) ; else if (else_succ->dest->index < 0 - || dominated_by_p (post_dominators, then_bb, + || dominated_by_p (CDI_POST_DOMINATORS, then_bb, else_succ->dest)) ; else @@ -2816,8 +2909,8 @@ find_if_case_2 (basic_block test_bb, edge then_edge, edge else_edge) then_bb->global_live_at_start, else_bb->global_live_at_end, BITMAP_IOR); - if (post_dominators) - delete_from_dominance_info (post_dominators, else_bb); + if (dom_computed[CDI_POST_DOMINATORS] >= DOM_NO_FAST_QUERY) + delete_from_dominance_info (CDI_POST_DOMINATORS, else_bb); delete_block (else_bb); num_true_changes++; @@ -2852,11 +2945,11 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb, { rtx head, end, jump, earliest, old_dest, new_label = NULL_RTX; - jump = test_bb->end; + jump = BB_END (test_bb); /* Find the extent of the real code in the merge block. */ - head = merge_bb->head; - end = merge_bb->end; + head = BB_HEAD (merge_bb); + end = BB_END (merge_bb); if (GET_CODE (head) == CODE_LABEL) head = NEXT_INSN (head); @@ -2886,8 +2979,8 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb, if (HAVE_conditional_execution) { /* In the conditional execution case, we have things easy. We know - the condition is reversible. We don't have to check life info, - becase we're going to conditionally execute the code anyway. + the condition is reversible. We don't have to check life info + because we're going to conditionally execute the code anyway. All that's left is making sure the insns involved can actually be predicated. */ @@ -3076,8 +3169,8 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb, /* Move the insns out of MERGE_BB to before the branch. */ if (head != NULL) { - if (end == merge_bb->end) - merge_bb->end = PREV_INSN (head); + if (end == BB_END (merge_bb)) + BB_END (merge_bb) = PREV_INSN (head); if (squeeze_notes (&head, &end)) return TRUE; @@ -3122,11 +3215,9 @@ if_convert (int x_life_data_ok) free_basic_block_vars (1); /* Compute postdominators if we think we'll use them. */ - post_dominators = NULL; if (HAVE_conditional_execution || life_data_ok) - { - post_dominators = calculate_dominance_info (CDI_POST_DOMINATORS); - } + calculate_dominance_info (CDI_POST_DOMINATORS); + if (life_data_ok) clear_bb_flags (); @@ -3163,8 +3254,7 @@ if_convert (int x_life_data_ok) fprintf (rtl_dump_file, "\n\n========== no more changes\n"); #endif - if (post_dominators) - free_dominance_info (post_dominators); + free_dominance_info (CDI_POST_DOMINATORS); if (rtl_dump_file) fflush (rtl_dump_file); |