diff options
author | Mikhail Maltsev <maltsevm@gmail.com> | 2015-05-20 19:39:42 +0000 |
---|---|---|
committer | Mikhail Maltsev <miyuki@gcc.gnu.org> | 2015-05-20 19:39:42 +0000 |
commit | 1476d1bd020588ee81d1384354cf533c88849a3a (patch) | |
tree | 710f2e790c32c989e13feab254c623d98b5f103d /gcc/stmt.c | |
parent | fd2ef1171407340dbb09935ab535debf40f56376 (diff) | |
download | gcc-1476d1bd020588ee81d1384354cf533c88849a3a.zip gcc-1476d1bd020588ee81d1384354cf533c88849a3a.tar.gz gcc-1476d1bd020588ee81d1384354cf533c88849a3a.tar.bz2 |
Promote types of RTL expressions to more derived ones.
* bb-reorder.c (set_edge_can_fallthru_flag): Use rtx_jump_insn where
feasible.
(fix_up_fall_thru_edges): Likewise.
(fix_crossing_conditional_branches): Likewise. Promote jump targets
from to rtx_insn to rtx_code_label where feasible.
* bt-load.c (move_btr_def): Remove as-a cast of the value returned by
gen_move_insn (returned type changed to rtx_insn).
* builtins.c (expand_errno_check): Fix arguments of
do_compare_rtx_and_jump (now expects rtx_code_label).
(expand_builtin_acc_on_device): Likewise.
* cfgcleanup.c (try_simplify_condjump): Add cast when calling
invert_jump (now exprects rtx_jump_insn).
* cfgexpand.c (label_rtx_for_bb): Promote return type to rtx_code_label.
(construct_init_block): Use rtx_code_label.
* cfgrtl.c (block_label): Promote return type to rtx_code_label.
(try_redirect_by_replacing_jump): Use cast to rtx_jump_insn when
calling redirect_jump.
(patch_jump_insn): Likewise.
(redirect_branch_edge): Likewise.
(force_nonfallthru_and_redirect): Likewise.
(fixup_reorder_chain): Explicitly use rtx_jump_insn instead of rtx_insn
when suitable.
(rtl_lv_add_condition_to_bb): Update call of do_compare_rtx_and_jump.
* cfgrtl.h: Promote return type of block_label to rtx_code_label.
* config/bfin/bfin.c (hwloop_optimize): Fix call of emit_label_before.
* config/i386/i386.c (ix86_emit_cmove): Explicitly use rtx_code_label
to store the value retured by gen_label_rtx.
* config/mips/mips.c (mips16_split_long_branches): Promote rtx_insn to
rtx_jump_insn.
* config/sh/sh.c (gen_far_branch): Likewise. Fix call of invert_jump.
(split_branches): Fix calls of redirect_jump.
* dojump.c (jumpifnot): Promote argument type from rtx to rtx_code_label.
(jumpifnot_1): Likewise.
(jumpif): Likewise.
(jumpif_1): Likewise.
(do_jump_1): Likewise.
(do_jump): Likewise. Use rtx_code_label when feasible.
(do_jump_by_parts_greater_rtx): Likewise.
(do_jump_by_parts_zero_rtx): Likewise.
(do_jump_by_parts_equality_rtx): Likewise.
(do_compare_rtx_and_jump): Likewise.
* dojump.h: Update function prototypes.
* dse.c (emit_inc_dec_insn_before): Remove case (gen_move_insn now
returns rtx_insn).
* emit-rtl.c (emit_jump_insn_before_noloc): Promote return type to
rtx_jump_insn.
(emit_label_before): Likewise.
(emit_jump_insn_after_noloc): Likewise.
(emit_jump_insn_after_setloc): Likewise.
(emit_jump_insn_after): Likewise
(emit_jump_insn_before_setloc): Likewise.
(emit_jump_insn_before): Likewise.
(emit_label_before): Promote return type to rtx_code_label.
(emit_label): Likewise.
* except.c (sjlj_emit_dispatch_table): Use jump_target_rtx.
* explow.c (emit_stack_save): Use gen_move_insn_uncast instead of
gen_move_insn.
(emit_stack_restore): Likewise.
* expmed.c (emit_store_flag_force): Fix calls of do_compare_rtx_and_jump.
(do_cmp_and_jump): Likewise.
* expr.c (expand_expr_real_2): Likewise. Promote some local variables
from rtx to rtx_code_label.
(gen_move_insn_uncast): New function.
* expr.h: Update return type of gen_move_insn (promote to rtx_insn).
* function.c (convert_jumps_to_returns): Fix call of redirect_jump.
* gcse.c (pre_insert_copy_insn): Use rtx_insn instead of rtx.
* ifcvt.c (dead_or_predicable): Use rtx_jump_insn when calling
invert_jump_1 and redirect_jump_1.
* internal-fn.c (expand_arith_overflow_result_store): Fix call of
do_compare_rtx_and_jump.
(expand_addsub_overflow): Likewise.
(expand_neg_overflow): Likewise.
(expand_mul_overflow): Likewise.
* ira.c (split_live_ranges_for_shrink_wrap): Use rtx_insn for
return value of gen_move_insn.
* jump.c (redirect_jump): Promote argument from rtx to rtx_jump_insn.
* loop-doloop.c (add_test): Use rtx_code_label.
(doloop_modify): Likewise.
(doloop_optimize): Likewise.
* loop-unroll.c (compare_and_jump_seq): Promote rtx to rtx_code_label.
* lra-constraints.c (emit_spill_move): Remove cast of value returned
by gen_move_insn.
(inherit_reload_reg): Add cast when calling dump_insn_slim.
(split_reg): Likewise.
* modulo-sched.c (schedule_reg_moves): Remove cast of value returned by
gen_move_insn.
* optabs.c (expand_binop_directly): Remove casts of values returned by
maybe_gen_insn.
(expand_unop_direct): Likewise.
(expand_abs): Likewise.
(maybe_emit_unop_insn): Likewise.
(maybe_gen_insn): Promote return type to rtx_insn.
* optabs.h: Update prototype of maybe_gen_insn.
* postreload-gcse.c (eliminate_partially_redundant_load): Remove
redundant cast.
* recog.c (struct peep2_insn_data): Promote type of insn field to
rtx_insn.
(peep2_reinit_state): Use NULL instead of NULL_RTX.
(peep2_attempt): Remove casts of insn in peep2_insn_data.
(peep2_fill_buffer): Promote argument from rtx to rtx_insn
* recog.h (struct insn_gen_fn): Promote return types of function
pointers and operator ().from rtx to rtx_insn.
* reorg.c (fill_simple_delay_slots): Promote rtx_insn to rtx_jump_insn.
(fill_eager_delay_slots): Likewise.
(relax_delay_slots): Likewise.
(make_return_insns): Likewise.
(dbr_schedule): Likewise.
(optimize_skips): Likewise.
(reorg_redirect_jump): Likewise.
(fill_slots_from_thread): Likewise.
* reorg.h: Update prototypes.
* resource.c (find_dead_or_set_registers): Use dyn_cast to
rtx_jump_insn instead of check. Use it's jump_target method.
* rtl.h (rtx_jump_insn::jump_label): Define new method.
(rtx_jump_insn::jump_target): Define new method.
(rtx_jump_insn::set_jump_target): Define new method.
* rtlanal.c (tablejump_p): Promote type of one local variable.
* sched-deps.c (sched_analyze_2): Promote rtx to rtx_insn_list.
(sched_analyze_insn): Likewise.
* sched-vis.c (print_insn_with_notes): Promote rtx to rtx_insn.
(print_insn): Likewise.
* stmt.c (label_rtx): Promote return type to rtx_insn.
(force_label_rtx): Likewise.
(jump_target_rtx): Define new function.
(expand_label): Use it, get rid of one cast.
(expand_naked_return): Promote rtx to rtx_code_label.
(do_jump_if_equal): Fix do_compare_rtx_and_jump call.
(expand_case): Use rtx_code_label instread of rtx where feasible.
(expand_sjlj_dispatch_table): Likewise.
(emit_case_nodes): Likewise.
* stmt.h: Declare jump_target_rtx. Update prototypes. Fix comments.
* store-motion.c (insert_store): Make use of new return type of
gen_move_insn and remove a cast.
(replace_store_insn): Likewise.
From-SVN: r223454
Diffstat (limited to 'gcc/stmt.c')
-rw-r--r-- | gcc/stmt.c | 57 |
1 files changed, 35 insertions, 22 deletions
@@ -135,12 +135,12 @@ static void balance_case_nodes (case_node_ptr *, case_node_ptr); static int node_has_low_bound (case_node_ptr, tree); static int node_has_high_bound (case_node_ptr, tree); static int node_is_bounded (case_node_ptr, tree); -static void emit_case_nodes (rtx, case_node_ptr, rtx, int, tree); +static void emit_case_nodes (rtx, case_node_ptr, rtx_code_label *, int, tree); /* Return the rtx-label that corresponds to a LABEL_DECL, creating it if necessary. */ -rtx +rtx_insn * label_rtx (tree label) { gcc_assert (TREE_CODE (label) == LABEL_DECL); @@ -153,15 +153,15 @@ label_rtx (tree label) LABEL_PRESERVE_P (r) = 1; } - return DECL_RTL (label); + return as_a <rtx_insn *> (DECL_RTL (label)); } /* As above, but also put it on the forced-reference list of the function that contains it. */ -rtx +rtx_insn * force_label_rtx (tree label) { - rtx_insn *ref = as_a <rtx_insn *> (label_rtx (label)); + rtx_insn *ref = label_rtx (label); tree function = decl_function_context (label); gcc_assert (function); @@ -170,6 +170,14 @@ force_label_rtx (tree label) return ref; } +/* As label_rtx, but ensures (in check build), that returned value is + an existing label (i.e. rtx with code CODE_LABEL). */ +rtx_code_label * +jump_target_rtx (tree label) +{ + return as_a <rtx_code_label *> (label_rtx (label)); +} + /* Add an unconditional jump to LABEL as the next sequential instruction. */ void @@ -196,7 +204,7 @@ emit_jump (rtx label) void expand_label (tree label) { - rtx_insn *label_r = as_a <rtx_insn *> (label_rtx (label)); + rtx_code_label *label_r = jump_target_rtx (label); do_pending_stack_adjust (); emit_label (label_r); @@ -706,7 +714,7 @@ resolve_operand_name_1 (char *p, tree outputs, tree inputs, tree labels) void expand_naked_return (void) { - rtx end_label; + rtx_code_label *end_label; clear_pending_stack_adjust (); do_pending_stack_adjust (); @@ -721,12 +729,12 @@ expand_naked_return (void) /* Generate code to jump to LABEL if OP0 and OP1 are equal in mode MODE. PROB is the probability of jumping to LABEL. */ static void -do_jump_if_equal (machine_mode mode, rtx op0, rtx op1, rtx label, +do_jump_if_equal (machine_mode mode, rtx op0, rtx op1, rtx_code_label *label, int unsignedp, int prob) { gcc_assert (prob <= REG_BR_PROB_BASE); do_compare_rtx_and_jump (op0, op1, EQ, unsignedp, mode, - NULL_RTX, NULL_RTX, label, prob); + NULL_RTX, NULL, label, prob); } /* Do the insertion of a case label into case_list. The labels are @@ -883,8 +891,8 @@ expand_switch_as_decision_tree_p (tree range, static void emit_case_decision_tree (tree index_expr, tree index_type, - struct case_node *case_list, rtx default_label, - int default_prob) + case_node_ptr case_list, rtx_code_label *default_label, + int default_prob) { rtx index = expand_normal (index_expr); @@ -1142,7 +1150,7 @@ void expand_case (gswitch *stmt) { tree minval = NULL_TREE, maxval = NULL_TREE, range = NULL_TREE; - rtx default_label = NULL_RTX; + rtx_code_label *default_label = NULL; unsigned int count, uniq; int i; int ncases = gimple_switch_num_labels (stmt); @@ -1174,7 +1182,8 @@ expand_case (gswitch *stmt) do_pending_stack_adjust (); /* Find the default case target label. */ - default_label = label_rtx (CASE_LABEL (gimple_switch_default_label (stmt))); + default_label = jump_target_rtx + (CASE_LABEL (gimple_switch_default_label (stmt))); edge default_edge = EDGE_SUCC (bb, 0); int default_prob = default_edge->probability; @@ -1324,7 +1333,7 @@ expand_sjlj_dispatch_table (rtx dispatch_index, for (int i = 0; i < ncases; i++) { tree elt = dispatch_table[i]; - rtx lab = label_rtx (CASE_LABEL (elt)); + rtx_code_label *lab = jump_target_rtx (CASE_LABEL (elt)); do_jump_if_equal (index_mode, index, zero, lab, 0, -1); force_expand_binop (index_mode, sub_optab, index, CONST1_RTX (index_mode), @@ -1593,7 +1602,7 @@ node_is_bounded (case_node_ptr node, tree index_type) tests for the value 50, then this node need not test anything. */ static void -emit_case_nodes (rtx index, case_node_ptr node, rtx default_label, +emit_case_nodes (rtx index, case_node_ptr node, rtx_code_label *default_label, int default_prob, tree index_type) { /* If INDEX has an unsigned type, we must make unsigned branches. */ @@ -1621,7 +1630,8 @@ emit_case_nodes (rtx index, case_node_ptr node, rtx default_label, convert_modes (mode, imode, expand_normal (node->low), unsignedp), - label_rtx (node->code_label), unsignedp, probability); + jump_target_rtx (node->code_label), + unsignedp, probability); /* Since this case is taken at this point, reduce its weight from subtree_weight. */ subtree_prob -= prob; @@ -1663,7 +1673,8 @@ emit_case_nodes (rtx index, case_node_ptr node, rtx default_label, LT, NULL_RTX, mode, unsignedp, label_rtx (node->left->code_label), probability); - emit_case_nodes (index, node->right, default_label, default_prob, index_type); + emit_case_nodes (index, node->right, default_label, default_prob, + index_type); } /* If both children are single-valued cases with no @@ -1688,7 +1699,7 @@ emit_case_nodes (rtx index, case_node_ptr node, rtx default_label, convert_modes (mode, imode, expand_normal (node->right->low), unsignedp), - label_rtx (node->right->code_label), + jump_target_rtx (node->right->code_label), unsignedp, probability); /* See if the value matches what the left hand side @@ -1700,7 +1711,7 @@ emit_case_nodes (rtx index, case_node_ptr node, rtx default_label, convert_modes (mode, imode, expand_normal (node->left->low), unsignedp), - label_rtx (node->left->code_label), + jump_target_rtx (node->left->code_label), unsignedp, probability); } @@ -1787,7 +1798,8 @@ emit_case_nodes (rtx index, case_node_ptr node, rtx default_label, (mode, imode, expand_normal (node->right->low), unsignedp), - label_rtx (node->right->code_label), unsignedp, probability); + jump_target_rtx (node->right->code_label), + unsignedp, probability); } } @@ -1829,7 +1841,8 @@ emit_case_nodes (rtx index, case_node_ptr node, rtx default_label, (mode, imode, expand_normal (node->left->low), unsignedp), - label_rtx (node->left->code_label), unsignedp, probability); + jump_target_rtx (node->left->code_label), + unsignedp, probability); } } } @@ -2052,7 +2065,7 @@ emit_case_nodes (rtx index, case_node_ptr node, rtx default_label, mode, 1, default_label, probability); } - emit_jump (label_rtx (node->code_label)); + emit_jump (jump_target_rtx (node->code_label)); } } } |