* flow.c (add_to_mem_set_list): New function.
(init_propagate_block_info): Use it.
(mark_set_1): Likewise.
(insn_dead_p): Canonicalize memory address for dead store
comparison. Allow wider mode stores to kill narrower mode stores.
(invalidate_mems_from_autoinc): Use invalidate_mems_from_set.
(invalidate_mems_from_set): Don't handle MEMs.
From-SVN: r44441
* basic-block.h (EDGE_FREQUENCY): New macro.
* bb-reorder (fixup_reorder_chain): Set counts and frequencies
for new BB/edges.
* flow.c (find_sub_basic_blocks): Likewise.
(try_crossjump_to_edge): Likewise; use EDGE_FREQUENCY
(redirect_edge_and_branch): Use EDGE_FREQUENCY.
* predict.c (DEF_PREDICTOR): New argument FLAGS.
(HITRATE): New macro.
(PRED_FLAG_FIRST_MATCH): New constant.
(predictor_info): New field flgags.
(combine_predictions_for_insn): Use DS theory to combine
probabilities; set the edge probabilities when finished.
(estimate_probability): Avoid duplicated matches
of LOOP_BRANCH heuristics for nested loops; update comment.
* predict.def: Add flags for each prediction, set probabilities
according to B&L paper.
* predict.h (DEF_PREDICTOR): New argument FLAGS.
* profile.c (compute_branch_probabilities): Cleanup way the edge
probabilities are computed and REG_BR_PROB notes are dropped; if
values does not match, emit error.
(init_branch_prob): Do error instead of warning when profile driven
feedback is missing or corrupt.
From-SVN: r44439
* rtl.h (cleanup_barriers): Declare.
* jump.c (cleanup_barriers): New function.
* toplev.c (rest_of_compilation): Call cleanup_barriers
before loop optimizer and after bb_reorder.
* flow.c (back_edge_of_syntactic_loop_p): New.
(split_edge): Use it.
From-SVN: r44409
* basic-block.h (PROP_ALLOW_CFG_CHANGES): Define.
(PROP_FINAL): Include PROP_ALLOW_CFG_CHANGES.
(propagate_block): Update prototype.
* flow.c (update_life_info): Simplify the CFG and
recalculate the global regs which are alive when
removing dead code during a global update.
(propagate_block): Return non-zero if an INSN is
deleted.
From-SVN: r44403
* flow.c (find_sub_basic_blocks): Fix handling of the last BB in
the sequence.
(make_edges): New argument update_p; populate the edge cache if set.
(find_basic_blocks): Update make_edges invocation.
Co-Authored-By: Richard Henderson <rth@redhat.com>
From-SVN: r44335
* basic-block.h (find_sub_basic_block): Declare.
* flow.c (make_edges): New arguments MIN and MAX;
(find_sub_basic_blocks): Revamp to use make_edges
and purge_dead_edges.
(find_basic_blocks): Update call of find_sub_basic_block.
* recog.c (split_all_insns): Always expect CFG to be consistent;
call find_sub_basic_blocks in case something has changed.
* toplev.c (rest_of_compilation): Always call split_all_insns once CFG
has been built.
* basic-block.h (delete_noop_moves): Declare.
* combine.c (combine_instructions): Call it.
(recog_for_combine): Tolerate noop moves
(distribute_notes): Force refresh when register dies at noop move.
* flow.c (delete_noop_moves): Use BB structure; delete JUMP insns
too.
(life_analysis): Update delete_noop_moves call.
(set_noop_p): Move too ...
* rtlanal.c (noop_move_p): ... here.
* rtl.h (noop_move_p): Declare.
* basic-block.h (purge_all_dead_edges, purge_dead_edges): New functions.
* toplev.c (rest_of_compilation): Conditionally call purge_all_dead_edges
after combine.
* gcse.c (cprop_cc0_jump, cprop_insn): New argument "basic_block".
(cprop_jump): Likewise; call purge_dead_edges if substitution suceeded.
From-SVN: r44267
* flow.c: Grammar check and clarify a lot of comments.
(try_simplify_condjump): Rename variables to be clearer.
(try_forward_edges): Skip complex and fallthru edges.
Rearrange tests to avoid duplicate checks.
(flow_find_cross_jump): Likewise.
(outgoing_edges_match): Allow match if neither branch has
probability data. Loosen probability match to 5%.
(try_crossjump_to_edge): Hoist repeated indirection into
local variables.
(try_crossjump_bb): Don't check complex edges. Eliminate
redundant crossjump tests.
(try_optimize_cfg): Fix use of bool. Reorganize cheaper
checks before more expensive checks.
From-SVN: r44257
* basic-block.h (redirect_edge_and_branch_force,
redirect_edge_and_branch, block_label, forwarder_block_p): Declare.
* flow.c (redirect_edge_and_branch_force,
redirect_edge_and_branch, block_label, forwarder_block_p): Make global.
(redirect_edge_and_branch_force): Fix copying of lifeness information.
(block_label): Handle EXIT_BLOCK_PTR by returning NULL.
* ifcvt.c (dead_or_predictable): Take BB as an new destionation
instead of label; update CFG after transformation.
(find_if_case_1): Update call, use redirect_edge_and_branch_force
for finishing the transformation; handle even case where ELSE
does not follow THEN.
(find_if_case_2): Update call of dead_or_predictable; simplify
CFG update.
* emit-rtl.c (split_branch_probability): New global variable.
(try_split): Take care to set split_branch_probability and
create REG_BR_PROB note for new jump insns.
* md.texi (define_split): Document new feature.
* i386.c (ix86_split_fp_branch): Redistribute branch probability notes.
From-SVN: r44249
* flow.c (redirect_edge_and_branch): Bail out on complex edges.
(try_optimize_cfg): Do not remove tail recursive labels before sibcall.
* jump.c (mark_jump_label): Do not forward branches.
Co-Authored-By: Jan Hubicka <jh@suse.cz>
From-SVN: r44118
* basic-block.h (CLEANUP_PRE_SIBCALL): New constant.
* except.c (finish_eh_generation): Update call of cleanup_cfg;
do rebuild_jump_labels instead of jump_optimize
* sibcall.c (optimize_sibling_and_tail_recursive_call): Likewise.
* toplev.c (rest_of_compulation): Likewise for -Wreturn_type.
* flow.c (try_optimize_cfg): Remove unneeded code_labels.
* flow.c: Include timevar.h
(find_basic_block): Push/pop timevar;
(cleanup_cfg): Likewise.
* timevar.def (TV_CFG, TV_CLEANUP_CFG): New.
* Makefile: Add dependencies on timevar.h
* integrate.c (save_for_inline): Kill all BASIC_BLOCK notes.
(copy_insn_list): Avoid killing of BASIC_BLOCK notes.
* rtl.h (delete_trivially_dead_insns): Add new parameter.
* toplev.c (rest_of_compilation): Update calls.
* cse.c (set_live_p, insn_live_p, dead_libcall_p): Break out from ...
(delete_trivially_dead_insns): ... here; accept new argument
preserve_basic_blocks; preserve basic blocks if set.
* reg-stack.c (stack_regs_mentioned): Return 0 if
stack_regs_mentioned_data is not initialized.
(reg_to_stack): Make stack_regs_mentioned survive after the
reg-stack is completted; do not call cleanup_cfg.
* toplev.c (rest_of_compilation): Do cleanup_cfg before bb-reorder;
make cleanup_cfg after bb-reorder to output to debug file.
From-SVN: r44056
* bb-reorder.c (skip_insn_after_block): Get past the line number notes.
* flow.c (redirect_edge_and_branch_force, split_edge,
try_crossjump_to_edge): Use set_block_for_new_insns.
* bb-reorder.c (emit_jump_to_block_after): Call set_block_for_new_insns.
From-SVN: r44002
* flow.c (find_basic_blocks_1): Do not emit NOP after call.
* flow.c (outgoing_edges_match): Return early if condition reversal
failed.
From-SVN: r43965
* gcse.c, lcm.c, sched-deps.c:
s/free on sbitmap vectors/sbitmap_vector_free on sbitmap vectors/g
* flow.c (flow_loops_find): Free dom if we found no loops, since
we aren't going to save it.
* lcm.c (pre_edge_rev_lcm): Free st_antin, st_antout when we are
done.
From-SVN: r43938
* flow.c (redirect_edge_and_branch_force): New.
(can_fallthru): Ensure that basic blocks are succeeding.
(try_optimize_cfg): Do not delete basic block if it is the last one.
* flow.c (try_redirect_by_replacing_jump): Do not remove
jumps with side effects, unlink chain on fallthru edge;
set block for new jump instruction; avoid basic block to
over by line number note.
* flow.c (try_simplify_condjump): Verify that the condjump
is not always falling trought.
Re-install patch:
* flow.c (try_redirect_by_replacing_jump): Remove cc0 setter.
* flow.c (forwarder_block_p): Fix for fallthru blocks.
(try_redirect_by_replacing_jump): Update properly the count
and frequency information.
From-SVN: r43867
* basic-block.h (first_insn_after_basic_block_note): Declare.
* flow.c (first_insn_after_basic_block_note): Define. Moved
from...
* ssa.c (first_insn_after_basic_block_note): Remove.
* ssa-dce.c (find_inherently_necessary): Consider BARRIERs
necessary.
(ssa_eliminate_dead_code): Properly update the CFG and PHI
nodes when we find a dead conditional branch. Insert BARRIERs
after any blocks with no successors, but which do not have
any BARRIERs.
From-SVN: r43816
2001-06-28 Diego Novillo <dnovillo@redhat.com>
* flow.c (dump_bb): Remove unused third argument to call
to fprintf when displaying the basic block header.
From-SVN: r43649
* flow.c (mark_set_1, attempt_auto_inc, mark_used_reg,
try_pre_increment_1): compute REG_FREQ using bb->frequency.
* regclass.c (loop_cost): Kill.
(frequency): New global variable.
(record_operand_costs): Replace loop_cost by frequency.
(scan_one_insn): Likewise.
(regclass): Likewise; set frequency according to bb->frequency.
* flow.c (split_edge): Set frequency.
From-SVN: r43523
* flow.c (life_analysis): After life analysis is complete, do
an optional scan over insns looking for REG_LABEL notes that
reference a deleted label.
(propagate_block_delete_insn): Verify INOTE is a CODE_LABEL
before peeking at LABEL_NUSES.
From-SVN: r42131
* flow.c (propagate_block_delete_insn): Handle deletion of ADDR_VEC
and ADDR_DIFF_VEC insns when the proceeding CODE_LABEL was put
into the constant pool.
* jump.c (jump_optimize_1): Remove barrier successors after all
the LABEL_NUSES counds have been computed.
(delete_barrier_successors): When deleting a tablejump insn, also
delete the jump table it uses.
* varasm.c (force_const_mem): Set LABEL_PRESERVE_P when forcing a
label into memory.
From-SVN: r41662
* flow.c (proagate_one_insn): Remove useless assignment.
* jump.c (delete_insn): Tidy.
* loop.c (try_copy_prop): When deleting an instruction with a
REG_RETVAL note, delete the entire libcall sequence.
(loop_delete_insns): New function.
* unroll.c (initial_reg_note_copy): Copy INSN_LIST notes, even if
we're not substituting into them yet.
From-SVN: r41486
* gcse.c (update_ld_motion_stores): Don't use variable I for an insn.
* flow.c (set_block_for_new_insns): Remove needless cast and
properly check for unset block number.
From-SVN: r41227
2001-04-09 Andrew MacLeod <amacleod@redhat.com>
* basic-block.h (set_new_block_for_insns): New Prototype.
(set_block_num): Delete prototype.
* flow.c (set_block_num): Remove obsolete function.
(set_block_for_new_insns): Set BB for single or multiple insns.
* gcse.c (handle_avail_expr): Use set_block_for_new_insns.
(process_insn_end_bb): Use set_block_for_new_insns or
set_block_for_insn instead of set_block_num.
(pre_insert_copy_insn): Use set_block_for_new_insns.
(update_ld_motion_stores): Use set_block_for_new_insns.
(insert_insn_start_bb): Use set_block_for_new_insns.
(replace_store_insn): Use set_block_for_new_insns.
From-SVN: r41208
2001-04-03 Jakub Jelinek <jakub@redhat.com>
David S. Miller <davem@pierdol.cobaltmicro.com>
Andrew MacLeod <amacleod@redhat.com>
Use byte offsets in SUBREGs instead of words.
* alias.c (nonlocal_mentioned_p): Use subreg_regno function.
* caller-save.c (mark_set_regs): Change callers of subreg_hard_regno
to pass new argument.
(add_stored_regs): Use subreg_regno_offset function.
* calls.c (expand_call): For non-paradoxical SUBREG take endianess
into account.
(precompute_arguments): Use gen_lowpart_SUBREG.
* combine.c (try_combine): Replace explicit XEXP with SUBREG_REG.
(combine_simplify_rtx): Rework to use SUBREG_BYTE.
(simplify_set): Rework to use SUBREG_BYTE.
(expand_field_assignment): Use SUBREG_BYTE.
(make_extraction): Use SUBREG_BYTE.
(if_then_else_cond): Use SUBREG_BYTE.
(apply_distributive_law): Use SUBREG_BYTE and fixup subreg comments.
(gen_lowpart_for_combine): Compute full byte offset.
* cse.c (mention_regs): Use SUBREG_BYTE.
(remove_invalid_subreg_refs): Rework to use SUBREG_BYTE.
(canon_hash): Use SUBREG_BYTE.
(fold_rtx): Pass SUBREG_BYTE div UNITS_PER_WORD to operand_subword.
(gen_lowpart_if_possible): Formatting.
* dbxout.c (dbxout_symbol_location): Compute SUBREG hard regnos
correctly.
* dwarf2out.c (is_pseudo_reg): Fixup explicit XEXP into SUBREG_REG
(mem_loc_descriptor): Fixup explicit XEXP into SUBREG_REG
(loc_descriptor): Fixup explicit XEXP into SUBREG_REG
* dwarfout.c (is_pseudo_reg): Fixup explicit XEXP into SUBREG_REG
(output_mem_loc_descriptor): Fixup explicit XEXP into SUBREG_REG
(output_loc_descriptor): Fixup explicit XEXP into SUBREG_REG
* emit-rtl.c (gen_rtx_SUBREG): New function, used to verify
certain invariants about SUBREGs the compiler creates.
(gen_lowpart_SUBREG): New function.
(subreg_hard_regno): New function to get the final register number.
(gen_lowpart_common): Use SUBREG_BYTE.
(gen_imagpart): Spacing nits.
(subreg_realpart_p): Use SUBREG_BYTE.
(gen_highpart): Use SUBREG_BYTE.
(subreg_lowpart_p): Always compute endian corrected goal offset,
even at the byte level, then compare against that.
(constant_subword): New function, pulled out all constant cases
from operand_subword and changed second argument name to offset.
(operand_subword): Detect non REG/SUBREG/CONCAT/MEM cases early
and call constant_subword to do the work. Return const0_rtx if
looking for a word outside of OP.
(operand_subword_force): Change second arg name to offset.
* expmed.c (store_bit_field): Use SUBREG_BYTE.
(store_split_bit_field): Use SUBREG_BYTE.
(extract_bit_field): Use SUBREG_BYTE.
(extract_split_bit_field): Use SUBREG_BYTE.
(expand_shift): Use SUBREG_BYTE.
* expr.c (store_expr, expand_expr): Use gen_lowpart_SUBREG.
* final.c (alter_subreg) Use subreg_hard_regno and SUBREG_BYTE.
* flow.c (set_noop_p): Use SUBREG_BYTE.
(mark_set_1): Remove ALTER_HARD_SUBREG. Use subreg_regno_offset instead.
* function.c (fixup_var_refs_1): Fixup explicit XEXP into a SUBREG_REG.
(fixup_memory_subreg): Use SUBREG_BYTE and remove byte endian
correction code.
(optimize_bit_field): Use SUBREG_BYTE.
(purge_addressof_1): Use SUBREG_BYTE.
(purge_single_hard_subreg_set): Use subreg_regno_offset function.
(assign_params): Mark arguments SUBREG_PROMOTED_VAR_P if they are
actually promoted by the caller and PROMOTE_FOR_CALLS_ONLY is true.
* gengenrtl.c (special_rtx): Add SUBREG.
* global.c (mark_reg_store): Use SUBREG_BYTE.
(set_preference): Rework to use subreg_regno_offset and SUBREG_BYTE.
* ifcvt (noce_emit_move_insn): Use SUBREG_BYTE.
* integrate.c (copy_rtx_and_substitute): Use SUBREG_BYTE and make sure
final byte offset is congruent to subreg's mode size.
(subst_constants): Use SUBREG_BYTE.
(mark_stores): Use subreg_regno_offset function.
* jump.c (rtx_renumbered_equal_p, true_regnum): Use subreg_regno_offset
function and SUBREG_BYTE.
* local-alloc.c (combine_regs): Use subreg_regno_offset function.
(reg_is_born): Use subreg_hard_regno.
* recog.c (valid_replace_rtx_1): Use SUBREG_BYTE and remove byte
endian correction code. Don't combine subregs unless resulting
offset aligns with type. Fix subreg constant extraction for DImode.
Simplify SUBREG of VOIDmode CONST_DOUBLE.
(general_operand): Remove dead mode_altering_drug code.
(indirect_operand): Use SUBREG_BYTE.
(constrain_operands): Use subreg_regno_offset function.
* reg-stack.c (get_true_reg): Use subreg_regno_offset function.
* regmove.c (regmove_optimize): Use SUBREG_BYTE.
(optimize_reg_copy_3): Use gen_lowpart_SUBREG.
* regs.h (REG_SIZE): Allow target to override.
(REGMODE_NATURAL_SIZE): New macro which target can override.
* reload.c (reload_inner_reg_of_subreg): subreg_regno should be used
on the entire subreg rtx.
(push_reload): Use SUBREG_BYTE in comments and code.
(find_dummy_reload): Use subreg_regno_offset. Only adjust offsets
for hard registers inside subregs.
(operands_match_p): Use subreg_regno_offset.
(find_reloads): Use SUBREG_BYTE and only advance offset for subregs
containing hard regs.
(find_reload_toplev): Use SUBREG_BYTE. Remove byte endian
corrections when fixing up MEM subregs.
(find_reloads_address_1): Use SUBREG_BYTE, subreg_regno, and
subreg_regno_offset where appropriate.
(find_reloads_subreg_address): Use SUBREG_BYTE. Remove
byte endian corrections when fixing up MEM subregs.
(subst_reloads): When combining two subregs, make sure final
offset is congruent to subreg's mode size.
(find_replacement): Use SUBREG_BYTE and subreg_regno_offset.
(refers_to_regno_for_reload_p): Use subreg_regno.
(reg_overlap_mentioned_for_reload_p): Use subreg_regno_offset.
* reload1.c (eliminate_regs) Use SUBREG_BYTE. Remove byte endian
correction code for memory subreg fixups.
(forget_old_reload_1): Use subreg_regno_offset.
(choose_reload_regs): Use subreg_regno.
(emit_input_reload_insns): Use SUBREG_BYTE.
(reload_combine_note_store): Use subreg_regno_offset.
(move2add_note_store): Use subreg_regno_offset.
* resource.c (update_live_status, mark_referenced_resources): Use
subreg_regno function.
(mark_set_resources): Use subreg_regno function.
* rtl.h (SUBREG_WORD): Rename to SUBREG_BYTE.
(subreg_regno_offset, subreg_regno): Define prototypes.
(subreg_hard_regno, constant_subword, gen_rtx_SUBREG): Newi functions.
(gen_lowpart_SUBREG): Add prototype.
* rtl.texi (subreg): Update to reflect new byte offset representation.
Add mentioning of the effect that BYTES_BIG_ENDIAN has on subregs now.
* rtlanal.c (refers_to_regno_p): Use subreg_regno.
(reg_overlap_mentioned_p): Use subreg_regno.
(replace_regs); Make sure final offset of combined subreg is
congruent to size of subreg's mode.
(subreg_regno_offset): New function.
(subreg_regno): New function.
* sched-vis.c (print_value): Change SUBREG_WORD to SUBREG_BYTE.
* sdbout.c (sdbout_symbol): Compute offset using alter_subreg.
* stmt.c (expand_anon_union_decl): Use gen_lowpart_SUBREG.
* tm.texi (ALTER_HARD_SUBREG): Remove, it is now dead.
(SUBREG_REGNO_OFFSET): Describe SUBREG_REGNO_OFFSET overrides.
* config/a29k/a29k.c (gpc_reg_operand): Use subreg_regno.
(a29k_get_reloaded_address): Use SUBREG_BYTE.
(print_operand): Use SUBREG_BYTE.
* config/alpha/alpha.c (print_operand_address): Use SUBREG_BYTE.
* config/arm/arm.c (arm_reload_in_hi): Use SUBREG_BYTE.
(arm_reload_out_hi): Use SUBREG_BYTE.
* config/d30v/d30v.c (d30v_split_double): Use subreg_regno_offset
instead of SUBREG_WORD.
(d30v_print_operand_memory_reference): Use subreg_regno_offset.
* config/dsp16xx/dsp16xx.md (extendqihi2, zero_extendqihi2): Fix
SUBREG creation to use byte offset.
* config/h8300/h8300.md (Unnamed HImode zero extraction and 16bit
inverted load insns): Fix explicit rtl subregs to use byte
offsets.
* config/i370/i370.md (cmpstrsi, movstrsi, mulsi3, divsi3,
udivsi3, umodsi3): Generate SUBREGs with byte offsets.
* config/i860/i860.c (single_insn_src_p): Use SUBREG_BYTE.
* config/i860/i860.md (mulsi3_big): Fixup explicit SUBREGs in rtl
to use byte offsets.
(unnamed fmlow.dd insn): Fixup SUBREGS to use byte offsets.
* config/i960/i960.md (extendhisi2): Generate SUBREGs with byte
offsets, also make sure it is congruent to SUBREG's mode size.
(extendqisi2, extendqihi2, zero_extendhisi2, zero_extendqisi2,
unnamed ldob insn): Generate SUBREGs with byte offset.
(zero_extendqihi2): SUBREG's are byte offsets.
* config/m68hc11/m68hc11.c (m68hc11_gen_lowpart): Use SUBREG_BYTE.
(m68hc11_gen_highpart): Use SUBREG_BYTE.
* config/m68k/m68k.md (zero_extendhisi2, zero_extendqihi2,
zero-extendqisi2): Generate SUBREGs with byte offset.
(umulsidi3, mulsidi3, subreghi1ashrdi_const32,
subregsi1ashrdi_const32, subreg1lshrdi_const32): Fixup explicit
subregs in rtl to use byte offsets.
* config/m88k/m88k.md (extendsidi2): fixup subregs to use byte offset.
* config/mips/mips.c (mips_move_1word): Use subreg_regno_offset.
(mips_move_2words): Use subreg_regno_offset.
(mips_secondary_reload_class): Use subreg_regno_offset.
* config/mips/mips.md (DImode plus, minus, move, and logical op
splits): Fixup explicit subregs in rtl to use byte offsets.
* config/mn10200/mn10200.c (print_operand): Use subreg_regno function.
* config/mn10300/mn10300.c (print_operand): Use subreg_regno function.
* config/ns32k/ns32k.md (udivmoddisi4): Fix explicit subregs in
rtl to use byte offsets.
* config/pa/pa.c (emit_move_sequence): Use SUBREG_BYTE.
* config/pa/pa.md (floatunssisf2, floatunssidf2, mulsi3): fix explicit
subregs to use byte offsets.
* config/pdp11/pdp11.md (zero_extendhisi2, modhi3, modhi3+1):
Fixup explicit subregs in rtl to use byte offsets.
* config/romp/romp.c (memory_offset_in_range_p): Use SUBREG_BYTE
and remove byte endian correction code.
* config/sh/sh.c (output_movedouble): Use subreg_regno.
(gen_ashift_hi): Use SUBREG_BYTE.
(regs_used): Use subreg_regno_offset.
(machine_dependent_reorg): Use subreg_regno_offset.
* config/sh/sh.h (INDEX_REGISTER_RTX_P): Use SUBREG_BYTE.
* config/sh/sh.md (DImode and DFmode move splits): Use subreg_regno.
(movdf_i4): Subregs are byte offsets now.
* config/sparc/sparc.c (ultra_find_type): Use SUBREG_BYTE.
* config/sparc/sparc.h (ALTER_HARD_SUBREG): Removed.
(REGMODE_NATURAL_SIZE): Override.
(REG_SIZE): For SUBREG check float mode on SUBREG_REG's mode.
* config/sparc/sparc.md (TFmode move splits): Generate SUBREGs
with byte offsets.
(zero_extendhisi2, zero_extendqidi2_insn, extendhisi2,
extendqihi2, sign_extendqihi2_insn, sign_extendqisi2_insn,
extendqidi2): Generate SUBREGs with byte offsets, also make sure
it is congruent to SUBREG's mode size.
(smulsi3_highpart_v8plus): Fix explicit subregs in rtl to use byte
offsets.
(cmp_siqi_trunc, cmp_siqi_trunc_set, cmp_diqi_trunc,
cmp_diqi_trunc_set, lshrdi3_v8plus+1, lshrdi3_v8plus+2,
lshrdi3_v8plus+3, lshrdi3_v8plus+4): Use proper
SUBREG_BYTE offset for non-paradoxical subregs in patterns.
* config/v850/v850.c (print_operand, output_move_double): Use
subreg_regno function.
Co-Authored-By: Andrew MacLeod <amacleod@redhat.com>
Co-Authored-By: David S. Miller <davem@pierdol.cobaltmicro.com>
From-SVN: r41058
* flow.c (struct reg_cond_life_info): New fields orig_condition
and stores.
(init_propagate_block_info): Set new fields.
(mark_regno_cond_dead): Set and use new fields.
(flush_reg_cond_reg_1): Likewise.
(and_reg_cond, case AND): Check for redundant AND conditions.
(mark_used_reg): Delete unnecessary clears before freeing splay trees.
Set new fields.
From-SVN: r40881
* flow.c (insn_dead_p): Don't consider two memrefs equivalent
unless anti_dependence says they are.
* alias.c (objects_must_conflict): If neither has a type specified,
they must conflict.
From-SVN: r40420
* flow.c (find_sub_basic_blocks): New function.
(split_block): Be ready for basic block introduced by CODE_LABEL.
(commit_one_edge_insertion): Call find_sub_basic_block.
* flow.c (make_edges): Add edge from entry for blocks starting with
label having ALTERNATE_NAME
From-SVN: r40021
* flow.c (print_rtl_and_abort_fcn): Renamed from print_rtl_and_abort.
Call fancy_abort directly, passing args.
(print_rtl_and_abort): Now a macro, like fancy_abort.
From-SVN: r39852
* flow.c (mark_set_1, case PARALLEL): Now case; rework to allow
entry to be EXPR_LIST.
* rtlanal.c (reg_overlap_mentioned_p): Allow PARALLEL in SET to
be an EXPR_LIST (but not null, which other code doesn't allow).
(note_stores): Properly handle PARALLEL in SET.
Recursively call for top-level PARALLEL.
* sched-deps.c (sched_analyze_1): Handle EXPR_LIST in PARALLEL in SET.
* sched-rgn.c (check_live_1, update_live_1): Likewise.
From-SVN: r39118
* flow.c (propagate_on_insn): Make trying to delete a prologue
or epilogue insn an ICE, not a warning. Allow doing this if
the current function returns with stack pointer depressed.
From-SVN: r39078
* reload.c (subst_reloads): Take INSN argument. When
replacing a LABEL_REF in a JUMP_INSN, add a REG_LABEL note.
* reload.h (subst_reloads): Adjust prototype.
* reload1.c (reload_as_needed): Pass INSN to subst_reloads.
* jump.c (mark_all_labels): Canonicalize any REG_LABEL notes
present in JUMP_INSNs and copy them to JUMP_LABEL.
* flow.c (find_label_refs, find_basic_blocks_1): Skip
JUMP_INSNs and insns with REG_LABELs that are followed by
JUMP_INSNs with the same REG_LABEL.
* sched-rgn.c (is_cfg_nonregular): Likewise.
* rtlanal.c (computed_jump_p): Make it false if a REG_LABEL
note is available.
* unroll.c (unroll_loop): Look for REG_LABEL notes in
JUMP_INSNs too.
* rtl.texi (REG_LABEL): Document usage in JUMP_INSNs.
From-SVN: r38755
* flow.c (calculate_global_regs_live): Only force stack pointer
live before reload. Force pic register live before reload.
(insn_dead_p): Don't protect pic references from deletion.
From-SVN: r38027
* flow.c (make_edge): Early out, if no flags to set.
(calculate_global_regs_live): Clear out garbage only when necessary.
* simplify-rtx.c (varray_type used_regs): New.
(clear_table): Use it to only clear necessary items.
(cselib_lookup, cselib_record_set): Remember newly set items.
(cselib_update_varray_sizes, cselib_init): Initialize and grow
used_regs.
* local-alloc.c (update_equiv_regs): New local `cleared_regs'.
Move clearing of dead regs out of insn-loop.
From-SVN: r37899
* function.h (emit_status): Delete member regno_pointer_flag and
rename regno_pointer_flag_length to regno_pointer_align_length.
Delete define for REGNO_POINTER_FLAG.
* integrate.h (inline_remap): Delete member regno_pointer_flag.
Add member x_regno_reg_rtx.
* rtl.h (rtx_def): Use frame_related bit to indicate register is
a pointer in REG expressions. Define REG_POINTER macro.
* alias.c (find_base_value, find_base_term): Use REG_POINTER
instead of REGNO_POINTER_FLAG.
* combine.c (nonzero_bits, num_sign_bit_copies): Likewise.
* emit-rtl.c (gen_reg_rtx): Use regno_pointer_align_length instead
of regno_pointer_flag_length. Remove code which refers to
regno_pointer_flag.
(mark_reg_pointer): Use REG_POINTER.
(free_emit_status): Remove code which refers to regno_pointer_flag.
(init_emit, mark_emit_status): Likewise.
* flow.c (dump_flow_info): Likewise.
* function.c (preserve_temp_slots): Likewise.
* integrate.c (expand_inline_function, copy_rtx_and_substitute):
Use x_regno_reg_rtx instead of regno_pointer_flag for function
pointer determination in map.
* loop.c (strength_reduce, maybe_eliminate_biv_1): Use REG_POINTER.
* predict.c (estimate_probability): Likewise.
* regclass.c (record_address_regs, reg_scan_mark_refs): Likewise.
* unroll.c (unroll_loop): Use x_regno_reg_rtx instead of
regno_pointer_flag for function pointer determination in map.
* convex.h (RTX_COSTS): Don't test regno_pointer_flag and use
REG_POINTER.
* pa.c (hppa_legitimize_address, emit_move_sequence, basereg_operand):
Use REG_POINTER.
(restore_unscaled_index_insn_codes): Revise comment.
From-SVN: r37863
While building global lifetime information, keep track of which registers are
only conditionally set. Use this to force rescans in more cases where they
are needed.
From-SVN: r37801
* flow.c (invalidate_mems_from_set): Split out from ...
(mark_set_1): ... here.
(try_pre_increment_1): Use it. Use propagate_block_delete_insn
instead of turning insn into a NOTE_INSN_DELETED.
From-SVN: r37356
* flow.c (init_propagate_block_info): Protect the rtx stored in
mem_set_list from modification by find_auto_inc.
(mark_set_1): Likewise.
From-SVN: r37330
* flow.c (verify_local_live_at_start): Back out last change.
* combine.c (distribute_notes): When parts of a hard reg are
neither set nor referenced in PLACE, search backwards for a
place to put a REG_UNUSED note; if none found, ask for flow
info refresh.
From-SVN: r37284
* flow.c (life_analysis): Only turn off PROP_LOG_LINKS and
PROP_AUTOINC at -O0. Don't collect alias info at -O0.
(init_propagate_block_info): Don't kill memory stores at -O0.
(mark_set_1, mark_used_regs): Likewise.
From-SVN: r35571
* flow.c (find_auto_inc): Verify that we've got a REG before
peeking at its regno. Fail, don't abort if we can't find
the increment of the desired register.
From-SVN: r35443
* rtl.h (enum reg_note): Add REG_MAYBE_DEAD.
* rtl.c (reg_note_name): Add REG_MAYBE_DEAD.
* flow.c (propagate_one_insn): Allow deletion of prologue/epilogue
insns if they have a REG_MAYBE_DEAD note attached.
* config/rs6000/rs6000.c (rs6000_maybe_dead): New function.
(rs6000_emit_load_toc_table): TOC loads may go dead.
From-SVN: r35414
* flow.c (clear_log_links): Nuke global_live_at_start and
global_live_at_end data, since if the log_links stuff is invalid
so is global_live_at_*.
From-SVN: r35396
* Makefile.in (ssa.o): Updated header files in dependences.
* basic-block.h: Added compute_immediate_postdominators declaration.
* config/i386/i386.h (CONVERT_HARD_REGISTER_TO_SSA_P): Added
definition.
* flow.c (compute_immediate_dominators): Updated comment.
(compute_immediate_postdominators): Added definition.
* rtl.h (HARD_REGISTER_P): Added definition.
* ssa.c: Include additional header files.
(assert): Added definition.
(ssa_rename_to_lookup): Added to reimplement ssa_rename_to to
include select hard registers.
(ssa_rename_to_insert): Likewise.
(ssa_rename_from_initialize): Likewise.
(ssa_rename_from_lookup): Likewise.
(original_register): Likewise.
(ssa_rename_from_insert): Added to reimplement ssa_rename_from to
include select hard reigsters.
(ssa_rename_from_traverse): Likewise.
(ssa_rename_from_free): Likewise.
(ssa_rename_from_print): Likewise.
(ssa_rename_from_print_1): Likewise.
(ssa_rename_from_hash_function): Likewise.
(ssa_rename_from_equal): Likewise.
(ssa_rename_from_delete): Likewise.
(simplify_to_immediate_dominators): Removed in favor of
flow.c:compute_immediate_dominators.
(find_evaluations_1): Modified to work with hard registers.
(insert_phi_node): Likewise.
(insert_phi_nodes): Likewise.
(struct rename_set_data): Updated prev_reg comment.
(create_delayed_rename): Modified to work with hard registers.
(RENAME_NO_RTX): Updated comment.
(apply_delayed_renames): Modified to work with hard registers.
(rename_insn_1): Likewise and added handling of CLOBBER rtls.
(rename_block): Updated to use revised ssa_rename_to interface.
(rename_registers): Updated to use revised ssa_rename_to and
ssa_rename_from interface.
(convert_to_ssa): Revised to use compute_immediate_dominators and
deal with hard registers.
(make_regs_equivalent_over_bad_edges): Modified to work with hard
registers. Added check for illegal unification of hard register.
(make_equivalent_phi_alternatives_equivalent): Modified to work
with hard registers.
(compute_conservative_reg_partition): Likewise.
(coalesce_if_unconflicting): Modified to work with hard registers
and check for conflicting hard registers.
(mark_phi_and_copy_regs): Revised loop to work only on pseudo
registers.
(rename_equivalent_regs_in_insn): Modified to work with hard
registers.
(record_canonical_element_1): Added definition.
(check_hard_regs_in_partition): Added definition.
(convert_from_ssa): Added data structure deallocation and check
for illegal hard register unification.
(conflict_hard_regs_p): Added definition.
* toplev.c (rest_of_compilation): Added comment.
From-SVN: r35384
* flow.c (libcall_dead_p): Use single_set to verify the insn
has only one set and get for analysis.
(propagate_one_insn): Don't pass the PATTERN of the insn.
From-SVN: r35091
* flow.c (mark_used_regs): Revert last change.
(life_analysis): Remove PROP_AUTOINC if running after reload.
(propagate_one_insn): PROP_AUTOINC is always off after reload.
From-SVN: r34499
* flow.c (propagate_block): Move initialization of mem_set_list ...
(init_propagate_block_info): ... here. Also track blocks with
no successors; don't scan insns if ! PROP_SCAN_DEAD_CODE.
From-SVN: r34310
* flow.c (commit_one_edge_insertion): Be prepared for a return
insn to be inserted on the edge with a normal jump.
* jump.c (jump_optimize_1): Don't look to create return isns.
* flow.c (flow_delete_insn): Don't adjust reference count of notes.
* jump.c (jump_optimize_1): Likewise.
(returnjump_p): Verify the argument is a JUMP_INSN.
* rtl.def (NOTE): Add 5th element for NOTE_INSN_DELETED_LABEL.
From-SVN: r33950
* Makefile.in (final.o): Depend on BASIC_BLOCK_H.
* final.c (final_end_function): Use app_disable. Rearrange note
handling into a switch. Emit deleted labels.
(output_asm_label): Generate label strings for deleted labels.
* flow.c (tail_recursion_label_list): New.
(find_basic_blocks_1): Set label_value_list directly. Collect list
of tail recursion labels from call_placeholders. Don't add deleted
labels to the label value list.
(cleanup_cfg): Use free_EXPR_LIST_list.
(flow_delete_insn_chain): Turn non-removable labels into notes.
(flow_delete_block): Don't disable deleting the block because of
a non-removable label.
(tail_recursion_label_p): New.
(merge_blocks_move_predecessor_nojumps): Don't disable the merge
because of a label.
(merge_blocks_move_successor_nojumps): Likewise. Also move a
jump table.
(merge_blocks): Disable a merge because of tail recursion labels.
* ifcvt.c (merge_if_block): Don't disable a merge because of a label.
Use a more accurate measure of not merging the join block.
(find_if_block): Don't disable conversion because of a label.
(find_if_case_1, find_if_case_2): Likewise.
* jump.c (duplicate_loop_exit_test): Preserve the kind of list
element when copying.
(squeeze_notes): Also leave EH notes.
(mark_jump_label): Ignore deleted labels. Use an INSN_LIST for
REG_LABEL notes.
(delete_insn): Preserve LABEL_NAME in NOTE_SOURCE_FILE when
deleting a label.
* print-rtl.c (print_rtx): Print NOTE_SOURCE_FILE for
NOTE_INSN_DELETED_LABEL. Print `[# deleted]' for a label_ref
referring to a deleted label. Convert tail handling to a switch.
* rtl.def (CODE_LABEL): Rearrange elements to be compatible with NOTE
for NOTE_INSN_DELETED_LABEL.
(NOTE): Fix commentary.
* rtl.h (REG_LABEL): Update commentary wrt INSN_LIST.
(REG_CC_SETTER, REG_CC_USER, REG_LIBCALL): Likewise.
(CODE_LABEL_NUMBER, LABEL_NAME): Update index.
(LABEL_NUSES, LABEL_REFS): Likewise.
* unroll.c (copy_loop_body): Don't copy NOTE_INSN_DELETED_LABEL.
From-SVN: r33876
* flow.c (find_basic_blocks_1): Do not delete the first
bb_note we run across.
(create_basic_block): Use reorder_insns to move an existing
bb_note to the correct place.
From-SVN: r33814
Tue May 2 00:20:30 2000 Jason Eckhardt <jle@cygnus.com>
* flow.c (verify_flow_info): Added two more sanity checks. The
first checks that the blocks are numbered consecutively. The second
checks that n_basic_blocks is actually equal to the number of
basic blocks in the insn chain.
From-SVN: r33632
* flow.c (struct propagate_block_info): Remove new_dead, new_live;
add new_set.
(propagate_one_insn): Clear it. Don't update reg_live here.
(init_propagate_block_info): Update for pbi member changes.
(free_propagate_block_info): Likewise.
(mark_set_1): Know that zero_extract, sign_extract, and
strict_low_part don't kill their argument. Alter hard subregs.
Update new_set for non-CLOBBER sets. Update reg_live.
(find_auto_inc): Update reg_live, not new_dead.
(mark_used_reg): Update reg_live, not new_live. Examine new_set
to determine if the reg in question was set this insn. Only update
reg info with PROP_REG_INFO.
From-SVN: r33478
* flow.c (update_life_info): Consider blocks null to mean the
universal set.
(calculate_global_regs_live): Likewise.
(life_analysis): Do that instead of collecting all_blocks.
From-SVN: r33469
* flow.c (mark_set_1): New arguments code and flags; update all
callers. Track regno_first and regno_last; do HARD_REGNO_NREGS
test in one place. Tidy flags tests. Don't bias REG_N_REFS by
loop_depth when optimizing for size. Do new_dead update after
emitting REG_UNUSED notes. Merge mark_set_reg code.
(mark_set_reg): Remove.
(propagate_one_insn): Use mark_set_1 for call-clobbered registers;
arrange to not emit REG_UNUSED notes.
From-SVN: r33462
* flow.c (propagate_one_insn): Break out from propagate_block.
(init_propagate_block_info): Likewise.
(free_propagate_block_info): Likewise.
(propagate_block): Use them. Export.
* basic-block.h: Declare them all.
From-SVN: r33460
* flow.c (count_basic_blocks, find_basic_blocks_1): Remove last change.
* optabs.c (emit_libcall_block): If have REG_EHG_REGION, update
region number to -1.
From-SVN: r33164
* flow.c (count_basic_blocks): Remove unused var PREV_CALL.
Never have a LIBCALL end a basic block.
(find_basic_blocks_1): Likewise.
Reorganize CALL_INSN cases.
From-SVN: r33154
* flow.c (struct propagate_block_info): Add new_dead, new_live.
(propagate_block): Initialize them. Use them in parallel instead
of one tmp variable, ie revert much of the 0408 and 0407 functional
changes, but keep the structural changes.
(mark_set_regs): Take new_dead from propagate_block_info instead.
(mark_set_1, mark_set_reg): Likewise.
(mark_used_regs): Likewise with new_live.
(mark_used_reg): Likewise. Revert 0408 change.
From-SVN: r33089