diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2019-10-01 08:55:50 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2019-10-01 08:55:50 +0000 |
commit | 17d184e5c4896264c27c27d125a6c1f8462d9d37 (patch) | |
tree | 1dca9c9172cc83f10975cf111475bbf1c2327df6 /gcc/rtlanal.c | |
parent | bb6ce448fc194cca8e51aea274a1b2408c7746c3 (diff) | |
download | gcc-17d184e5c4896264c27c27d125a6c1f8462d9d37.zip gcc-17d184e5c4896264c27c27d125a6c1f8462d9d37.tar.gz gcc-17d184e5c4896264c27c27d125a6c1f8462d9d37.tar.bz2 |
Remove clobber_high
The AArch64 SVE tlsdesc patterns were the main motivating reason
for clobber_high. It's no longer needed now that the patterns use
calls instead.
At the time, one of the possible future uses for clobber_high was for
asm statements. However, the current code wouldn't handle that case
without modification, so I think we might as well remove it for now.
We can always reapply it in future if it turns out to be useful again.
2019-10-01 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* rtl.def (CLOBBER_HIGH): Delete.
* doc/rtl.texi (clobber_high): Remove documentation.
* rtl.h (SET_DEST): Remove CLOBBER_HIGH from the list of codes.
(reg_is_clobbered_by_clobber_high): Delete.
(gen_hard_reg_clobber_high): Likewise.
* alias.c (record_set): Remove CLOBBER_HIGH handling.
* cfgexpand.c (expand_gimple_stmt): Likewise.
* combine-stack-adj.c (single_set_for_csa): Likewise.
* combine.c (find_single_use_1, set_nonzero_bits_and_sign_copies)
(can_combine_p, is_parallel_of_n_reg_sets, try_combine)
(record_dead_and_set_regs_1, reg_dead_at_p_1): Likewise.
* cse.c (invalidate_reg): Remove clobber_high parameter.
(invalidate): Update call accordingly.
(canonicalize_insn): Remove CLOBBER_HIGH handling.
(invalidate_from_clobbers, invalidate_from_sets_and_clobbers)
(count_reg_usage, insn_live_p): Likewise.
* cselib.h (cselib_invalidate_rtx): Remove sett argument.
* cselib.c (cselib_invalidate_regno, cselib_invalidate_rtx): Likewise.
(cselib_invalidate_rtx_note_stores): Update call accordingly.
(cselib_expand_value_rtx_1): Remove CLOBBER_HIGH handling.
(cselib_invalidate_regno, cselib_process_insn): Likewise.
* dce.c (deletable_insn_p, mark_nonreg_stores_1): Likewise.
(mark_nonreg_stores_2): Likewise.
* df-scan.c (df_find_hard_reg_defs, df_uses_record): Likewise.
(df_get_call_refs): Likewise.
* dwarf2out.c (mem_loc_descriptor): Likewise.
* emit-rtl.c (verify_rtx_sharing): Likewise.
(copy_insn_1, copy_rtx_if_shared_1): Likewise.
(hard_reg_clobbers_high, gen_hard_reg_clobber_high): Delete.
* genconfig.c (walk_insn_part): Remove CLOBBER_HIGH handling.
* genemit.c (gen_exp, gen_insn): Likewise.
* genrecog.c (validate_pattern, remove_clobbers): Likewise.
* haifa-sched.c (haifa_classify_rtx): Likewise.
* ira-build.c (create_insn_allocnos): Likewise.
* ira-costs.c (scan_one_insn): Likewise.
* ira.c (equiv_init_movable_p, memref_referenced_p): Likewise.
(rtx_moveable_p, interesting_dest_for_shprep): Likewise.
* jump.c (mark_jump_label_1): Likewise.
* lra-int.h (lra_insn_reg::clobber_high): Delete.
* lra-eliminations.c (lra_eliminate_regs_1): Remove CLOBBER_HIGH
handling.
(mark_not_eliminable): Likewise.
* lra-lives.c (process_bb_lives): Likewise.
* lra.c (new_insn_reg): Remove clobber_high parameter.
(collect_non_operand_hard_regs): Likewise. Update call to new
insn_reg. Remove CLOBBER_HIGH handling.
(lra_set_insn_recog_data): Remove CLOBBER_HIGH handling. Update call
to collect_non_operand_hard_regs.
(add_regs_to_insn_regno_info): Remove CLOBBER_HIGH handling.
Update call to new_insn_reg.
(lra_update_insn_regno_info): Remove CLOBBER_HIGH handling.
* postreload.c (reload_cse_simplify, reload_combine_note_use)
(move2add_note_store): Likewise.
* print-rtl.c (print_pattern): Likewise.
* recog.c (store_data_bypass_p_1, store_data_bypass_p): Likewise.
(if_test_bypass_p): Likewise.
* regcprop.c (kill_clobbered_value, kill_set_value): Likewise.
* reginfo.c (reg_scan_mark_refs): Likewise.
* reload1.c (maybe_fix_stack_asms, eliminate_regs_1): Likewise.
(elimination_effects, mark_not_eliminable, scan_paradoxical_subregs)
(forget_old_reloads_1): Likewise.
* reorg.c (find_end_label, try_merge_delay_insns, redundant_insn)
(own_thread_p, fill_simple_delay_slots, fill_slots_from_thread)
(dbr_schedule): Likewise.
* resource.c (update_live_status, mark_referenced_resources)
(mark_set_resources): Likewise.
* rtl.c (copy_rtx): Likewise.
* rtlanal.c (reg_referenced_p, set_of_1, single_set_2, noop_move_p)
(note_pattern_stores): Likewise.
(reg_is_clobbered_by_clobber_high): Delete.
* sched-deps.c (sched_analyze_reg, sched_analyze_insn): Remove
CLOBBER_HIGH handling.
From-SVN: r276393
Diffstat (limited to 'gcc/rtlanal.c')
-rw-r--r-- | gcc/rtlanal.c | 48 |
1 files changed, 3 insertions, 45 deletions
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 6adef47..720aa09 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -1216,10 +1216,6 @@ reg_referenced_p (const_rtx x, const_rtx body) return 1; return 0; - case CLOBBER_HIGH: - gcc_assert (REG_P (XEXP (body, 0))); - return 0; - case COND_EXEC: if (reg_overlap_mentioned_p (x, COND_EXEC_TEST (body))) return 1; @@ -1442,11 +1438,7 @@ set_of_1 (rtx x, const_rtx pat, void *data1) { struct set_of_data *const data = (struct set_of_data *) (data1); if (rtx_equal_p (x, data->pat) - || (GET_CODE (pat) == CLOBBER_HIGH - && REGNO(data->pat) == REGNO(XEXP (pat, 0)) - && reg_is_clobbered_by_clobber_high (data->pat, XEXP (pat, 0))) - || (GET_CODE (pat) != CLOBBER_HIGH && !MEM_P (x) - && reg_overlap_mentioned_p (data->pat, x))) + || (!MEM_P (x) && reg_overlap_mentioned_p (data->pat, x))) data->found = pat; } @@ -1533,7 +1525,6 @@ single_set_2 (const rtx_insn *insn, const_rtx pat) { case USE: case CLOBBER: - case CLOBBER_HIGH: break; case SET: @@ -1687,9 +1678,7 @@ noop_move_p (const rtx_insn *insn) { rtx tem = XVECEXP (pat, 0, i); - if (GET_CODE (tem) == USE - || GET_CODE (tem) == CLOBBER - || GET_CODE (tem) == CLOBBER_HIGH) + if (GET_CODE (tem) == USE || GET_CODE (tem) == CLOBBER) continue; if (GET_CODE (tem) != SET || ! set_noop_p (tem)) @@ -1923,9 +1912,7 @@ note_pattern_stores (const_rtx x, if (GET_CODE (x) == COND_EXEC) x = COND_EXEC_CODE (x); - if (GET_CODE (x) == SET - || GET_CODE (x) == CLOBBER - || GET_CODE (x) == CLOBBER_HIGH) + if (GET_CODE (x) == SET || GET_CODE (x) == CLOBBER) { rtx dest = SET_DEST (x); @@ -6658,32 +6645,3 @@ tls_referenced_p (const_rtx x) return true; return false; } - -/* Return true if reg REGNO with mode REG_MODE would be clobbered by the - clobber_high operand in CLOBBER_HIGH_OP. */ - -bool -reg_is_clobbered_by_clobber_high (unsigned int regno, machine_mode reg_mode, - const_rtx clobber_high_op) -{ - unsigned int clobber_regno = REGNO (clobber_high_op); - machine_mode clobber_mode = GET_MODE (clobber_high_op); - unsigned char regno_nregs = hard_regno_nregs (regno, reg_mode); - - /* Clobber high should always span exactly one register. */ - gcc_assert (REG_NREGS (clobber_high_op) == 1); - - /* Clobber high needs to match with one of the registers in X. */ - if (clobber_regno < regno || clobber_regno >= regno + regno_nregs) - return false; - - gcc_assert (reg_mode != BLKmode && clobber_mode != BLKmode); - - if (reg_mode == VOIDmode) - return clobber_mode != VOIDmode; - - /* Clobber high will clobber if its size might be greater than the size of - register regno. */ - return maybe_gt (exact_div (GET_MODE_SIZE (reg_mode), regno_nregs), - GET_MODE_SIZE (clobber_mode)); -} |