https://gcc.gnu.org/g:d4fe93080eadfafe64e91c7963c41c49b797f354
commit r17-5241-gd4fe93080eadfafe64e91c7963c41c49b797f354 Author: Trevor Saunders <[email protected]> Date: Wed Oct 14 14:28:22 2026 +0200 use rtx_sequence more gcc/ChangeLog: * emit-rtl.cc (reset_all_used_flags): Walk sequences with rtx_sequence. (verify_rtl_sharing): Likewise. (get_first_nonnote_insn): Likewise. * except.cc (get_eh_region_and_lp_from_rtx): Likewise. (can_throw_external): Likewise. (insn_nothrow_p): Likewise. (convert_to_eh_region_ranges): Likewise. * final.cc (shorten_branches): Likewise. Diff: --- gcc/emit-rtl.cc | 25 +++++++++++++------------ gcc/except.cc | 50 +++++++++++++++++++------------------------------- gcc/final.cc | 10 ++++------ 3 files changed, 36 insertions(+), 49 deletions(-) diff --git a/gcc/emit-rtl.cc b/gcc/emit-rtl.cc index e33cfa62538f..d91995a40592 100644 --- a/gcc/emit-rtl.cc +++ b/gcc/emit-rtl.cc @@ -3159,18 +3159,18 @@ reset_all_used_flags (void) if (INSN_P (p)) { rtx pat = PATTERN (p); - if (GET_CODE (pat) != SEQUENCE) - reset_insn_used_flags (p); - else + if (rtx_sequence *seq = dyn_cast<rtx_sequence *> (pat)) { gcc_assert (REG_NOTES (p) == NULL); - for (int i = 0; i < XVECLEN (pat, 0); i++) + for (int i = 0; i < seq->len (); i++) { - rtx insn = XVECEXP (pat, 0, i); + rtx insn = seq->element (i); if (INSN_P (insn)) reset_insn_used_flags (insn); } } + else + reset_insn_used_flags (p); } } @@ -3202,15 +3202,15 @@ verify_rtl_sharing (void) if (INSN_P (p)) { rtx pat = PATTERN (p); - if (GET_CODE (pat) != SEQUENCE) - verify_insn_sharing (p); - else - for (int i = 0; i < XVECLEN (pat, 0); i++) + if (rtx_sequence *seq = dyn_cast<rtx_sequence *> (pat)) + for (int i = 0; i < seq->len (); i++) { - rtx insn = XVECEXP (pat, 0, i); + rtx insn = seq->element (i); if (INSN_P (insn)) verify_insn_sharing (insn); } + else + verify_insn_sharing (p); } reset_all_used_flags (); @@ -3557,9 +3557,10 @@ get_first_nonnote_insn (void) continue; else { + rtx_sequence *seq; if (NONJUMP_INSN_P (insn) - && GET_CODE (PATTERN (insn)) == SEQUENCE) - insn = as_a <rtx_sequence *> (PATTERN (insn))->insn (0); + && (seq = dyn_cast<rtx_sequence *> (PATTERN (insn)))) + insn = seq->insn (0); } } diff --git a/gcc/except.cc b/gcc/except.cc index e3b864573361..c0287ea4e7c8 100644 --- a/gcc/except.cc +++ b/gcc/except.cc @@ -1820,45 +1820,35 @@ static bool get_eh_region_and_lp_from_rtx (const_rtx insn, eh_region *pr, eh_landing_pad *plp) { - eh_landing_pad lp = NULL; - eh_region r = NULL; - bool ret = false; rtx note; int lp_nr; + *pr = nullptr; + *plp = nullptr; if (! INSN_P (insn)) - goto egress; + return false; - if (NONJUMP_INSN_P (insn) - && GET_CODE (PATTERN (insn)) == SEQUENCE) - insn = XVECEXP (PATTERN (insn), 0, 0); + rtx_sequence *seq = dyn_cast<rtx_sequence *> (PATTERN (insn)); + if (NONJUMP_INSN_P (insn) && seq) + insn = seq->insn (0); note = find_reg_note (insn, REG_EH_REGION, NULL_RTX); if (!note) - { - ret = !insn_could_throw_p (insn); - goto egress; - } + return !insn_could_throw_p (insn); lp_nr = INTVAL (XEXP (note, 0)); if (lp_nr == 0 || lp_nr == INT_MIN) - { - ret = true; - goto egress; - } + return true; if (lp_nr < 0) - r = (*cfun->eh->region_array)[-lp_nr]; + *pr = (*cfun->eh->region_array)[-lp_nr]; else { - lp = (*cfun->eh->lp_array)[lp_nr]; - r = lp->region; + *plp = (*cfun->eh->lp_array)[lp_nr]; + *pr = (*plp)->region; } - egress: - *plp = lp; - *pr = r; - return ret; + return false; } /* Return the landing pad to which INSN may go, or NULL if it does not @@ -1907,10 +1897,9 @@ can_throw_external (const_rtx insn) if (! INSN_P (insn)) return false; - if (NONJUMP_INSN_P (insn) - && GET_CODE (PATTERN (insn)) == SEQUENCE) + rtx_sequence *seq = dyn_cast<rtx_sequence *> (PATTERN (insn)); + if (NONJUMP_INSN_P (insn) && seq) { - rtx_sequence *seq = as_a <rtx_sequence *> (PATTERN (insn)); int i, n = seq->len (); for (i = 0; i < n; i++) @@ -1951,10 +1940,9 @@ insn_nothrow_p (const_rtx insn) if (! INSN_P (insn)) return true; - if (NONJUMP_INSN_P (insn) - && GET_CODE (PATTERN (insn)) == SEQUENCE) + rtx_sequence *seq = dyn_cast<rtx_sequence *> (PATTERN (insn)); + if (NONJUMP_INSN_P (insn) && seq) { - rtx_sequence *seq = as_a <rtx_sequence *> (PATTERN (insn)); int i, n = seq->len (); for (i = 0; i < n; i++) @@ -2608,9 +2596,9 @@ convert_to_eh_region_ranges (void) rtx_code_label *this_landing_pad; insn = iter; - if (NONJUMP_INSN_P (insn) - && GET_CODE (PATTERN (insn)) == SEQUENCE) - insn = XVECEXP (PATTERN (insn), 0, 0); + rtx_sequence *seq = dyn_cast<rtx_sequence *> (PATTERN (insn)); + if (NONJUMP_INSN_P (insn) && seq) + insn = seq->element (0); nothrow = get_eh_region_and_lp_from_rtx (insn, ®ion, &lp); if (nothrow) diff --git a/gcc/final.cc b/gcc/final.cc index f437e97e27e2..0204332ee34b 100644 --- a/gcc/final.cc +++ b/gcc/final.cc @@ -1283,15 +1283,13 @@ shorten_branches (rtx_insn *first) if (! (varying_length[uid])) { + rtx_sequence *seq; if (NONJUMP_INSN_P (insn) - && GET_CODE (PATTERN (insn)) == SEQUENCE) + && (seq = dyn_cast<rtx_sequence *> (PATTERN (insn)))) { - int i; - - body = PATTERN (insn); - for (i = 0; i < XVECLEN (body, 0); i++) + for (int i = 0; i < seq->len (); i++) { - rtx inner_insn = XVECEXP (body, 0, i); + rtx_insn *inner_insn = seq->insn (i); int inner_uid = INSN_UID (inner_insn); INSN_ADDRESSES (inner_uid) = insn_current_address;
