https://gcc.gnu.org/g:4b1a2878ba3241ec5c0a1bf05ff47bfcd09c3711

commit r15-6654-g4b1a2878ba3241ec5c0a1bf05ff47bfcd09c3711
Author: Andrew Pinski <quic_apin...@quicinc.com>
Date:   Fri Nov 15 20:22:02 2024 -0800

    cfgexpand: Factor out getting the stack decl index
    
    This is the first patch in improving this code.
    Since there are a few places which get the index and they
    check the same thing, let's factor that out into one function.
    
    Bootstrapped and tested on x86_64-linux-gnu.
    
    gcc/ChangeLog:
    
            * cfgexpand.cc (INVALID_STACK_INDEX): New defined.
            (decl_stack_index): New function.
            (visit_op): Use decl_stack_index.
            (visit_conflict): Likewise.
            (add_scope_conflicts_1): Likewise.
    
    Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>

Diff:
---
 gcc/cfgexpand.cc | 62 +++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 37 insertions(+), 25 deletions(-)

diff --git a/gcc/cfgexpand.cc b/gcc/cfgexpand.cc
index abab385293a5..cdebb00cd792 100644
--- a/gcc/cfgexpand.cc
+++ b/gcc/cfgexpand.cc
@@ -337,6 +337,8 @@ static unsigned stack_vars_alloc;
 static unsigned stack_vars_num;
 static hash_map<tree, unsigned> *decl_to_stack_part;
 
+#define INVALID_STACK_INDEX ((unsigned)-1)
+
 /* Conflict bitmaps go on this obstack.  This allows us to destroy
    all of them in one big sweep.  */
 static bitmap_obstack stack_var_bitmap_obstack;
@@ -525,6 +527,27 @@ stack_var_conflict_p (unsigned x, unsigned y)
   return bitmap_bit_p (a->conflicts, y);
 }
 
+/* Returns the DECL's index into the stack_vars array.
+   If the DECL does not exist return INVALID_STACK_INDEX.  */
+static unsigned
+decl_stack_index (tree decl)
+{
+  if (!decl)
+    return INVALID_STACK_INDEX;
+  if (!DECL_P (decl))
+    return INVALID_STACK_INDEX;
+  if (DECL_RTL_IF_SET (decl) != pc_rtx)
+    return INVALID_STACK_INDEX;
+  unsigned *v = decl_to_stack_part->get (decl);
+  if (!v)
+    return INVALID_STACK_INDEX;
+
+  unsigned indx = *v;
+  gcc_checking_assert (indx != INVALID_STACK_INDEX);
+  gcc_checking_assert (indx < stack_vars_num);
+  return indx;
+}
+
 /* Callback for walk_stmt_ops.  If OP is a decl touched by add_stack_var
    enter its partition number into bitmap DATA.  */
 
@@ -533,14 +556,9 @@ visit_op (gimple *, tree op, tree, void *data)
 {
   bitmap active = (bitmap)data;
   op = get_base_address (op);
-  if (op
-      && DECL_P (op)
-      && DECL_RTL_IF_SET (op) == pc_rtx)
-    {
-      unsigned *v = decl_to_stack_part->get (op);
-      if (v)
-       bitmap_set_bit (active, *v);
-    }
+  unsigned idx = decl_stack_index (op);
+  if (idx != INVALID_STACK_INDEX)
+    bitmap_set_bit (active, idx);
   return false;
 }
 
@@ -553,20 +571,15 @@ visit_conflict (gimple *, tree op, tree, void *data)
 {
   bitmap active = (bitmap)data;
   op = get_base_address (op);
-  if (op
-      && DECL_P (op)
-      && DECL_RTL_IF_SET (op) == pc_rtx)
+  unsigned num = decl_stack_index (op);
+  if (num != INVALID_STACK_INDEX
+      && bitmap_set_bit (active, num))
     {
-      unsigned *v = decl_to_stack_part->get (op);
-      if (v && bitmap_set_bit (active, *v))
-       {
-         unsigned num = *v;
-         bitmap_iterator bi;
-         unsigned i;
-         gcc_assert (num < stack_vars_num);
-         EXECUTE_IF_SET_IN_BITMAP (active, 0, i, bi)
-           add_stack_var_conflict (num, i);
-       }
+      bitmap_iterator bi;
+      unsigned i;
+      gcc_assert (num < stack_vars_num);
+      EXECUTE_IF_SET_IN_BITMAP (active, 0, i, bi)
+       add_stack_var_conflict (num, i);
     }
   return false;
 }
@@ -638,15 +651,14 @@ add_scope_conflicts_1 (basic_block bb, bitmap work, bool 
for_conflict)
       if (gimple_clobber_p (stmt))
        {
          tree lhs = gimple_assign_lhs (stmt);
-         unsigned *v;
          /* Handle only plain var clobbers.
             Nested functions lowering and C++ front-end inserts clobbers
             which are not just plain variables.  */
          if (!VAR_P (lhs))
            continue;
-         if (DECL_RTL_IF_SET (lhs) == pc_rtx
-             && (v = decl_to_stack_part->get (lhs)))
-           bitmap_clear_bit (work, *v);
+         unsigned indx = decl_stack_index (lhs);
+         if (indx != INVALID_STACK_INDEX)
+           bitmap_clear_bit (work, indx);
        }
       else if (!is_gimple_debug (stmt))
        {

Reply via email to