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, &region, &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;

Reply via email to