diff options
author | davem <davem@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-06-11 12:22:48 +0000 |
---|---|---|
committer | davem <davem@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-06-11 12:22:48 +0000 |
commit | 31d3e01ca0c35fc4c059db9cf503dd2413f77ea1 (patch) | |
tree | 5f5a5da6b9ff25b136d9c1acd1a495af48658efb /gcc/loop.c | |
parent | 47d65439c0ca066ed06bf13f3c6faa41607af088 (diff) | |
download | gcc-31d3e01ca0c35fc4c059db9cf503dd2413f77ea1.tar.gz |
2002-06-05 David S. Miller <davem@redhat.com>
Delete SEQUENCE rtl usage outside of reorg and ssa passes.
* rtl.h (gen_sequence, emit_insns, emit_insns_before,
emit_insns_before_scope, emit_insns_after,
emit_insns_after_scope): Delete declaration.
* ada/misc.c (insert_code_for): Use emit_insn* instead of
emit_insns_foo.
* config/alpha/alpha.c (alpha_set_memflags_1): Abort on SEQUENCE.
(alpha_set_memflags): Fix comment.
(set_frame_related_p): Use get_insns instead of gen_sequence.
* config/alpha/alpha.md (setjmp receiver splitter): Avoid
emitting no insns.
* config/arm/arm.c (arm_finalize_pic): Use get_insns instead of
gen_sequence.
(arm_gen_load_multiple, arm_gen_store_multiple): Likewise.
* config/fr30/fr30.c (fr30_move_double): Likewise.
* config/i386/i386.c (ix86_expand_int_movcc, ix86_expand_movstr):
Likewise.
* config/ia64/ia64.c (spill_restore_mem): Likewise.
* config/ia64/ia64.md (conditional move spliiter): Avoid emitting
no insns.
* config/m32r/m32r.c (gen_split_move_double): Use get_insns
instead of gen_sequence.
* config/mips/mips.c (embedded_pic_fnaddr_reg): Likewise.
(mips_expand_prologue, mips16_gp_pseudo_reg): Likewise.
* config/sh/sh.c (sh_need_epilogue): Likewise.
* config/sparc/sparc.md (current_function_calls_alloca, flat): New
attributes.
(setjmp pattern and split): Use them to avoid splitter which emits
no RTL.
* genattrtab.c (main): Emit include of function.h
* config/stormy16/stormy16.c (xstormy16_split_cbranch): Use
get_insns instead of gen_sequence.
* config/cris/cris.c (cris_split_movdx): Likewise.
* emit-rtl.c (emit_insns*): Kill.
(try_split): Expect insn list instead of SEQUENCE.
(make_jump_insn_raw, make_call_insn_raw): Fix comments.
(emit_*insn*): Reimplement to work with INSN lists and PATTERNs.
Make them abort if a SEQUENCE is given and RTL checking is
enabled.
(emit_*_scope): Don't forget to set scope on final insn.
(gen_sequence): Move from here...
* ssa.c (gen_sequence): To here as private function.
* builtins.c (expand_builtin_apply_args): Use emit_insn_foo, fix
comments.
(expand_builtin_return, expand_builtin_mathfn): Likewise.
(expand_builtin_strlen): Use get_insns instead of gen_sequence.
(expand_builtin_saveregs): Use emit_insn_foo, fix comments.
(expand_builtin_expect_jump): Use get_insns and fix comments.
* calls.c (try_to_integrate): Use emit_insn_foo.
(expand_call, emit_library_call_value_1): Likewise.
* expr.c (emit_queue): Handle insn lists instead of SEQUENCE.
(emit_move_insn_1): Use get_insns instead of gen_sequence.
(expand_expr): Use emit_insn_foo.
* cfgrtl.c (commit_one_edge_insertion): Use emit_insn_foo.
* except.c (build_post_landing_pads): Likewise.
* flow.c (attempt_auto_inc): Likewise.
* stmt.c (expand_fixup, fixup_gotos, expand_nl_handler_label,
expand_nl_goto_receivers, expand_decl_cleanup): Likewise.
* function.c (fixup_var_refs_insn): Use get_insns instead of
gen_sequence.
(fixup_var_refs_1): Likewise and expect insn list from gen_foo.
(fixup_memory_subreg): Use get_insns instead of gen_sequence.
(fixup_stack_1, purge_addressof_1, expand_main_function,
get_arg_pointer_save_area): Likewise.
(optimize_bit_field, instantiate_virtual_regs_1, assign_parms,
expand_function_end): Use emit_insn_foo.
(record_insns, keep_stack_depressed): Work with insn list instead
of SEQUENCE, fix comments.
* ifcvt.c (noce_emit_store_flag, noce_try_store_flag,
noce_try_store_flag_constants, noce_try_store_flag_inc,
noce_try_store_flag_mask, noce_emit_cmove, noce_try_cmove_arith,
noce_try_minmax, noce_try_abs): Use emit_insn_foo.
(noce_process_if_block): Use get_insns instead of gen_sequence.
* optabs.c (add_equal_note): Work with insn list, fix comments.
(expand_binop): Expect insn list from GEN_FCN(), use emit_insn_foo.
(expand_unop, expand_complex_abs, expand_unop_insn,
expand_no_conflict_block): Likewise.
(gen_move_insn): Use get_insns instead of gen_sequence.
(gen_cond_trap): Likewise.
* integrate.c (copy_rtx_and_substitute): Likewise.
(emit_initial_value_sets): Use emit_insn_foo.
* reload1.c (emit_output_reload_insns, emit_reload_insns): Likewise.
(fixup_abnormal_edges): Avoid losing REG_NOTES more intelligently
now that RTL generators give insn lists.
* sibcall.c (replace_call_placeholder): Use emit_insn_foo.
* doloop.c (doloop_modify, doloop_modify_runtime): Use get_insns
instead of gen_sequence.
(doloop_optimize): Work with insn lists instead of SEQUENCE rtl.
* explow.c (emit_stack_save, emit_stack_restore): Use get_insns
instead of gen_sequence.
* loop.c (move_movables, emit_prefetch_instructions,
gen_add_mult, check_dbra_loop, gen_load_of_final_value):
Likewise.
(loop_regs_update): Work with insn list instead of SEQUENCE rtl.
(product_cheap_p): Likewise, and add commentary about RTL wastage
here.
* lcm.c (optimize_mode_switching): Use get_insns instead of
gen_sequence.
* profile.c (gen_edge_profiler): Likewise.
* regmove.c (copy_src_to_dest): Likewise.
* reg-stack.c (compensate_edge): Likewise and fix comment.
* gcse.c (process_insert_insn): Likewise.
(insert_insn_end_bb): Work with insn list instead of SEQUENCE rtl.
* jump.c (delete_prior_computation): Update comment.
* genemit.c (gen_expand, gen_split, main): Use get_insns instead
of gen_sequence, update comments to match.
* recog.c (peephole2_optimize): Work with insn lists instead of
SEQUENCE rtl.
* sched-vis.c (print_pattern): Abort on SEQUENCE.
* unroll.c (unroll_loop, find_splittable_givs, final_giv_value):
Use get_insns instead of gen_sequence.
(copy_loop_body): Likewise and don't emit dummy NOTE.
* genrecog.c: Don't mention SEQUENCE rtl in comments.
* combine.c (try_combine): Expect insn lists from split generator.
* reorg.c (relax_delay_slots): Emit SEQUENCE into insn list by
hand.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@54497 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/loop.c')
-rw-r--r-- | gcc/loop.c | 101 |
1 files changed, 54 insertions, 47 deletions
diff --git a/gcc/loop.c b/gcc/loop.c index bc75f8ba3b8..ba93c33dcd6 100644 --- a/gcc/loop.c +++ b/gcc/loop.c @@ -1949,11 +1949,10 @@ move_movables (loop, movables, threshold, insn_count) start_sequence (); emit_move_insn (m->set_dest, m->set_src); - temp = get_insns (); - seq = gen_sequence (); + seq = get_insns (); end_sequence (); - add_label_notes (m->set_src, temp); + add_label_notes (m->set_src, seq); i1 = loop_insn_hoist (loop, seq); if (! find_reg_note (i1, REG_EQUAL, NULL_RTX)) @@ -2088,7 +2087,7 @@ move_movables (loop, movables, threshold, insn_count) abort (); if (tem != reg) emit_move_insn (reg, tem); - sequence = gen_sequence (); + sequence = get_insns (); end_sequence (); i1 = loop_insn_hoist (loop, sequence); } @@ -2109,11 +2108,10 @@ move_movables (loop, movables, threshold, insn_count) use the REG_EQUAL note. */ start_sequence (); emit_move_insn (m->set_dest, m->set_src); - temp = get_insns (); - seq = gen_sequence (); + seq = get_insns (); end_sequence (); - add_label_notes (m->set_src, temp); + add_label_notes (m->set_src, seq); i1 = loop_insn_hoist (loop, seq); if (! find_reg_note (i1, REG_EQUAL, NULL_RTX)) @@ -4154,7 +4152,7 @@ emit_prefetch_instructions (loop) loc = force_reg (Pmode, loc); emit_insn (gen_prefetch (loc, GEN_INT (info[i].write), GEN_INT (3))); - seq = gen_sequence (); + seq = get_insns (); end_sequence (); emit_insn_before (seq, before_insn); @@ -7735,7 +7733,7 @@ gen_add_mult (b, m, a, reg) result = expand_mult_add (b, reg, m, a, GET_MODE (reg), 1); if (reg != result) emit_move_insn (reg, result); - seq = gen_sequence (); + seq = get_insns (); end_sequence (); return seq; @@ -7749,24 +7747,29 @@ loop_regs_update (loop, seq) const struct loop *loop ATTRIBUTE_UNUSED; rtx seq; { + rtx insn; + /* Update register info for alias analysis. */ - if (GET_CODE (seq) == SEQUENCE) + if (seq == NULL_RTX) + return; + + if (INSN_P (seq)) { - int i; - for (i = 0; i < XVECLEN (seq, 0); ++i) + insn = seq; + while (insn != NULL_RTX) { - rtx set = single_set (XVECEXP (seq, 0, i)); + rtx set = single_set (insn); + if (set && GET_CODE (SET_DEST (set)) == REG) record_base_value (REGNO (SET_DEST (set)), SET_SRC (set), 0); + + insn = NEXT_INSN (insn); } } - else - { - if (GET_CODE (seq) == SET - && GET_CODE (SET_DEST (seq)) == REG) - record_base_value (REGNO (SET_DEST (seq)), SET_SRC (seq), 0); - } + else if (GET_CODE (seq) == SET + && GET_CODE (SET_DEST (seq)) == REG) + record_base_value (REGNO (SET_DEST (seq)), SET_SRC (seq), 0); } @@ -7889,16 +7892,20 @@ iv_add_mult_cost (b, m, a, reg) } /* Test whether A * B can be computed without - an actual multiply insn. Value is 1 if so. */ + an actual multiply insn. Value is 1 if so. + + ??? This function stinks because it generates a ton of wasted RTL + ??? and as a result fragments GC memory to no end. There are other + ??? places in the compiler which are invoked a lot and do the same + ??? thing, generate wasted RTL just to see if something is possible. */ static int product_cheap_p (a, b) rtx a; rtx b; { - int i; rtx tmp; - int win = 1; + int win, n_insns; /* If only one is constant, make it B. */ if (GET_CODE (a) == CONST_INT) @@ -7918,31 +7925,31 @@ product_cheap_p (a, b) start_sequence (); expand_mult (GET_MODE (a), a, b, NULL_RTX, 1); - tmp = gen_sequence (); + tmp = get_insns (); end_sequence (); - if (GET_CODE (tmp) == SEQUENCE) + win = 1; + if (INSN_P (tmp)) { - if (XVEC (tmp, 0) == 0) - win = 1; - else if (XVECLEN (tmp, 0) > 3) - win = 0; - else - for (i = 0; i < XVECLEN (tmp, 0); i++) - { - rtx insn = XVECEXP (tmp, 0, i); - - if (GET_CODE (insn) != INSN - || (GET_CODE (PATTERN (insn)) == SET - && GET_CODE (SET_SRC (PATTERN (insn))) == MULT) - || (GET_CODE (PATTERN (insn)) == PARALLEL - && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET - && GET_CODE (SET_SRC (XVECEXP (PATTERN (insn), 0, 0))) == MULT)) - { - win = 0; - break; - } - } + n_insns = 0; + while (tmp != NULL_RTX) + { + rtx next = NEXT_INSN (tmp); + + if (++n_insns > 3 + || GET_CODE (tmp) != INSN + || (GET_CODE (PATTERN (tmp)) == SET + && GET_CODE (SET_SRC (PATTERN (tmp))) == MULT) + || (GET_CODE (PATTERN (tmp)) == PARALLEL + && GET_CODE (XVECEXP (PATTERN (tmp), 0, 0)) == SET + && GET_CODE (SET_SRC (XVECEXP (PATTERN (tmp), 0, 0))) == MULT)) + { + win = 0; + break; + } + + tmp = next; + } } else if (GET_CODE (tmp) == SET && GET_CODE (SET_SRC (tmp)) == MULT) @@ -8433,7 +8440,7 @@ check_dbra_loop (loop, insn_count) create a sequence to hold all the insns from expand_inc. */ start_sequence (); expand_inc (reg, new_add_val); - tem = gen_sequence (); + tem = get_insns (); end_sequence (); p = loop_insn_emit_before (loop, 0, bl->biv->insn, tem); @@ -8474,7 +8481,7 @@ check_dbra_loop (loop, insn_count) emit_cmp_and_jump_insns (reg, const0_rtx, cmp_code, NULL_RTX, GET_MODE (reg), 0, XEXP (jump_label, 0)); - tem = gen_sequence (); + tem = get_insns (); end_sequence (); emit_jump_insn_before (tem, loop_end); @@ -10492,7 +10499,7 @@ gen_load_of_final_value (reg, final_value) final_value = force_operand (final_value, reg); if (final_value != reg) emit_move_insn (reg, final_value); - seq = gen_sequence (); + seq = get_insns (); end_sequence (); return seq; } |