diff options
author | David S. Miller <davem@redhat.com> | 2002-06-11 05:22:48 -0700 |
---|---|---|
committer | David S. Miller <davem@gcc.gnu.org> | 2002-06-11 05:22:48 -0700 |
commit | 2f937369fa50dfd2f5af11b18d30c5489451072c (patch) | |
tree | 5f5a5da6b9ff25b136d9c1acd1a495af48658efb /gcc/function.c | |
parent | 43cf10b56ceb4bb309c6aac698845eebf734d351 (diff) | |
download | gcc-2f937369fa50dfd2f5af11b18d30c5489451072c.zip gcc-2f937369fa50dfd2f5af11b18d30c5489451072c.tar.gz gcc-2f937369fa50dfd2f5af11b18d30c5489451072c.tar.bz2 |
Delete SEQUENCE rtl usage outside of reorg and ssa passes.
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.
From-SVN: r54497
Diffstat (limited to 'gcc/function.c')
-rw-r--r-- | gcc/function.c | 136 |
1 files changed, 72 insertions, 64 deletions
diff --git a/gcc/function.c b/gcc/function.c index 96c2563..56c66c6 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -1867,7 +1867,7 @@ fixup_var_refs_insn (insn, var, promoted_mode, unsignedp, toplevel, no_share) start_sequence (); convert_move (replacements->new, replacements->old, unsignedp); - seq = gen_sequence (); + seq = get_insns (); end_sequence (); } else @@ -1949,7 +1949,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements, no_share) start_sequence (); new_insn = emit_insn (gen_rtx_SET (VOIDmode, y, sub)); - seq = gen_sequence (); + seq = get_insns (); end_sequence (); if (recog_memoized (new_insn) < 0) @@ -1960,7 +1960,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements, no_share) sub = force_operand (sub, y); if (sub != y) emit_insn (gen_move_insn (y, sub)); - seq = gen_sequence (); + seq = get_insns (); end_sequence (); } @@ -2390,7 +2390,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements, no_share) no other function that to do X. */ pat = gen_move_insn (SET_DEST (x), SET_SRC (x)); - if (GET_CODE (pat) == SEQUENCE) + if (NEXT_INSN (pat) != NULL_RTX) { last = emit_insn_before (pat, insn); @@ -2408,7 +2408,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements, no_share) delete_insn (last); } else - PATTERN (insn) = pat; + PATTERN (insn) = PATTERN (pat); return; } @@ -2434,7 +2434,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements, no_share) return; pat = gen_move_insn (SET_DEST (x), SET_SRC (x)); - if (GET_CODE (pat) == SEQUENCE) + if (NEXT_INSN (pat) != NULL_RTX) { last = emit_insn_before (pat, insn); @@ -2452,7 +2452,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements, no_share) delete_insn (last); } else - PATTERN (insn) = pat; + PATTERN (insn) = PATTERN (pat); return; } @@ -2543,7 +2543,7 @@ fixup_memory_subreg (x, insn, promoted_mode, uncritical) rtx mem = SUBREG_REG (x); rtx addr = XEXP (mem, 0); enum machine_mode mode = GET_MODE (x); - rtx result; + rtx result, seq; /* Paradoxical SUBREGs are usually invalid during RTL generation. */ if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (mem)) && ! uncritical) @@ -2563,8 +2563,10 @@ fixup_memory_subreg (x, insn, promoted_mode, uncritical) start_sequence (); result = adjust_address (mem, mode, offset); - emit_insn_before (gen_sequence (), insn); + seq = get_insns (); end_sequence (); + + emit_insn_before (seq, insn); return result; } @@ -2654,7 +2656,7 @@ fixup_stack_1 (x, insn) start_sequence (); temp = copy_to_reg (ad); - seq = gen_sequence (); + seq = get_insns (); end_sequence (); emit_insn_before (seq, insn); return replace_equiv_address (x, temp); @@ -2765,7 +2767,7 @@ optimize_bit_field (body, insn, equiv_mem) memref = adjust_address (memref, mode, offset); insns = get_insns (); end_sequence (); - emit_insns_before (insns, insn); + emit_insn_before (insns, insn); /* Store this memory reference where we found the bit field reference. */ @@ -2833,7 +2835,7 @@ optimize_bit_field (body, insn, equiv_mem) special; just let the optimization be suppressed. */ if (apply_change_group () && seq) - emit_insns_before (seq, insn); + emit_insn_before (seq, insn); } } } @@ -3066,7 +3068,7 @@ purge_addressof_1 (loc, insn, force, store, ht) && ! validate_replace_rtx (x, sub, insn)) abort (); - insns = gen_sequence (); + insns = get_insns (); end_sequence (); emit_insn_before (insns, insn); return true; @@ -3177,7 +3179,7 @@ purge_addressof_1 (loc, insn, force, store, ht) end_sequence (); goto give_up; } - seq = gen_sequence (); + seq = get_insns (); end_sequence (); emit_insn_before (seq, insn); compute_insns_for_mem (p ? NEXT_INSN (p) : get_insns (), @@ -3191,7 +3193,7 @@ purge_addressof_1 (loc, insn, force, store, ht) might have created. */ unshare_all_rtl_again (get_insns ()); - seq = gen_sequence (); + seq = get_insns (); end_sequence (); p = emit_insn_after (seq, insn); if (NEXT_INSN (insn)) @@ -3216,7 +3218,7 @@ purge_addressof_1 (loc, insn, force, store, ht) goto give_up; } - seq = gen_sequence (); + seq = get_insns (); end_sequence (); emit_insn_before (seq, insn); compute_insns_for_mem (p ? NEXT_INSN (p) : get_insns (), @@ -3821,7 +3823,7 @@ instantiate_virtual_regs_1 (loc, object, extra_insns) seq = get_insns (); end_sequence (); - emit_insns_before (seq, object); + emit_insn_before (seq, object); SET_DEST (x) = new; if (! validate_change (object, &SET_SRC (x), temp, 0) @@ -3933,7 +3935,7 @@ instantiate_virtual_regs_1 (loc, object, extra_insns) seq = get_insns (); end_sequence (); - emit_insns_before (seq, object); + emit_insn_before (seq, object); if (! validate_change (object, loc, temp, 0) && ! validate_replace_rtx (x, temp, object)) abort (); @@ -4087,7 +4089,7 @@ instantiate_virtual_regs_1 (loc, object, extra_insns) seq = get_insns (); end_sequence (); - emit_insns_before (seq, object); + emit_insn_before (seq, object); if (! validate_change (object, loc, temp, 0) && ! validate_replace_rtx (x, temp, object)) abort (); @@ -5084,7 +5086,7 @@ assign_parms (fndecl) /* Output all parameter conversion instructions (possibly including calls) now that all parameters have been copied out of hard registers. */ - emit_insns (conversion_insns); + emit_insn (conversion_insns); last_parm_insn = get_last_insn (); @@ -6422,7 +6424,7 @@ expand_main_function () /* Enlist allocate_dynamic_stack_space to pick up the pieces. */ tmp = force_reg (Pmode, const0_rtx); allocate_dynamic_stack_space (tmp, NULL_RTX, BIGGEST_ALIGNMENT); - seq = gen_sequence (); + seq = get_insns (); end_sequence (); for (tmp = get_last_insn (); tmp; tmp = PREV_INSN (tmp)) @@ -6843,7 +6845,7 @@ expand_function_end (filename, line, end_bindings) end_sequence (); /* Put those insns at entry to the containing function (this one). */ - emit_insns_before (seq, tail_recursion_reentry); + emit_insn_before (seq, tail_recursion_reentry); } /* If we are doing stack checking and this function makes calls, @@ -6861,7 +6863,7 @@ expand_function_end (filename, line, end_bindings) GEN_INT (STACK_CHECK_MAX_FRAME_SIZE)); seq = get_insns (); end_sequence (); - emit_insns_before (seq, tail_recursion_reentry); + emit_insn_before (seq, tail_recursion_reentry); break; } } @@ -7067,7 +7069,7 @@ expand_function_end (filename, line, end_bindings) start_sequence (); clobber_return_register (); - seq = gen_sequence (); + seq = get_insns (); end_sequence (); after = emit_insn_after (seq, clobber_after); @@ -7113,7 +7115,7 @@ get_arg_pointer_save_area (f) have to check it and fix it if necessary. */ start_sequence (); emit_move_insn (validize_mem (ret), virtual_incoming_args_rtx); - seq = gen_sequence (); + seq = get_insns (); end_sequence (); push_topmost_sequence (); @@ -7124,35 +7126,38 @@ get_arg_pointer_save_area (f) return ret; } -/* Extend a vector that records the INSN_UIDs of INSNS (either a - sequence or a single insn). */ +/* Extend a vector that records the INSN_UIDs of INSNS + (a list of one or more insns). */ static void record_insns (insns, vecp) rtx insns; varray_type *vecp; { - if (GET_CODE (insns) == SEQUENCE) - { - int len = XVECLEN (insns, 0); - int i = VARRAY_SIZE (*vecp); + int i, len; + rtx tmp; - VARRAY_GROW (*vecp, i + len); - while (--len >= 0) - { - VARRAY_INT (*vecp, i) = INSN_UID (XVECEXP (insns, 0, len)); - ++i; - } + tmp = insns; + len = 0; + while (tmp != NULL_RTX) + { + len++; + tmp = NEXT_INSN (tmp); } - else + + i = VARRAY_SIZE (*vecp); + VARRAY_GROW (*vecp, i + len); + tmp = insns; + while (tmp != NULL_RTX) { - int i = VARRAY_SIZE (*vecp); - VARRAY_GROW (*vecp, i + 1); - VARRAY_INT (*vecp, i) = INSN_UID (insns); + VARRAY_INT (*vecp, i) = INSN_UID (tmp); + i++; + tmp = NEXT_INSN (tmp); } } -/* Determine how many INSN_UIDs in VEC are part of INSN. */ +/* Determine how many INSN_UIDs in VEC are part of INSN. Because we can + be running after reorg, SEQUENCE rtl is possible. */ static int contains (insn, vec) @@ -7264,20 +7269,21 @@ struct epi_info static void handle_epilogue_set PARAMS ((rtx, struct epi_info *)); static void emit_equiv_load PARAMS ((struct epi_info *)); -/* Modify SEQ, a SEQUENCE that is part of the epilogue, to no modifications - to the stack pointer. Return the new sequence. */ +/* Modify INSN, a list of one or more insns that is part of the epilogue, to + no modifications to the stack pointer. Return the new list of insns. */ static rtx -keep_stack_depressed (seq) - rtx seq; +keep_stack_depressed (insns) + rtx insns; { - int i, j; + int j; struct epi_info info; + rtx insn, next; /* If the epilogue is just a single instruction, it ust be OK as is. */ - if (GET_CODE (seq) != SEQUENCE) - return seq; + if (NEXT_INSN (insns) == NULL_RTX) + return insns; /* Otherwise, start a sequence, initialize the information we have, and process all the insns we were given. */ @@ -7287,13 +7293,16 @@ keep_stack_depressed (seq) info.sp_offset = 0; info.equiv_reg_src = 0; - for (i = 0; i < XVECLEN (seq, 0); i++) + insn = insns; + next = NULL_RTX; + while (insn != NULL_RTX) { - rtx insn = XVECEXP (seq, 0, i); + next = NEXT_INSN (insn); if (!INSN_P (insn)) { add_insn (insn); + insn = next; continue; } @@ -7329,6 +7338,7 @@ keep_stack_depressed (seq) { emit_equiv_load (&info); add_insn (insn); + insn = next; continue; } else if (GET_CODE (retaddr) == MEM @@ -7429,11 +7439,13 @@ keep_stack_depressed (seq) info.sp_equiv_reg = info.new_sp_equiv_reg; info.sp_offset = info.new_sp_offset; + + insn = next; } - seq = gen_sequence (); + insns = get_insns (); end_sequence (); - return seq; + return insns; } /* SET is a SET from an insn in the epilogue. P is a pointer to the epi_info @@ -7548,12 +7560,10 @@ thread_prologue_and_epilogue_insns (f) emit_insn (seq); /* Retain a map of the prologue insns. */ - if (GET_CODE (seq) != SEQUENCE) - seq = get_insns (); record_insns (seq, &prologue); prologue_end = emit_note (NULL, NOTE_INSN_PROLOGUE_END); - seq = gen_sequence (); + seq = get_insns (); end_sequence (); /* Can't deal with multiple successors of the entry block @@ -7712,11 +7722,9 @@ thread_prologue_and_epilogue_insns (f) emit_jump_insn (seq); /* Retain a map of the epilogue insns. */ - if (GET_CODE (seq) != SEQUENCE) - seq = get_insns (); record_insns (seq, &epilogue); - seq = gen_sequence (); + seq = get_insns (); end_sequence (); insert_insn_on_edge (seq, e); @@ -7745,13 +7753,13 @@ epilogue_done: seq = gen_sibcall_epilogue (); end_sequence (); + /* Retain a map of the epilogue insns. Used in life analysis to + avoid getting rid of sibcall epilogue insns. Do this before we + actually emit the sequence. */ + record_insns (seq, &sibcall_epilogue); + i = PREV_INSN (insn); newinsn = emit_insn_before (seq, insn); - - /* Retain a map of the epilogue insns. Used in life analysis to - avoid getting rid of sibcall epilogue insns. */ - record_insns (GET_CODE (seq) == SEQUENCE - ? seq : newinsn, &sibcall_epilogue); } #endif |