[gcc r17-2382] Revert "x86: Rewrite ix86_find_max_used_stack_alignment"

"H.J. Lu via Gcc-cvs" <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:210be97619bbfce4425d9df139954672cfbb9724

commit r17-2382-g210be97619bbfce4425d9df139954672cfbb9724
Author: H.J. Lu <[email protected]>
Date:   Tue Jul 14 05:25:45 2026 +0800

    Revert "x86: Rewrite ix86_find_max_used_stack_alignment"
    
    Revert
    
    commit e754b70fe5470b975d31887fa5647f1c92d6522d
    Author:     H.J. Lu <[email protected]>
    AuthorDate: Tue Apr 7 23:16:38 2026 +0800
    Commit:     H.J. Lu <[email protected]>
    CommitDate: Mon Jul 6 16:11:45 2026 +0800
    
        x86: Rewrite ix86_find_max_used_stack_alignment
    
    to fix PR target/126202.
    
    gcc/
    
            PR target/126202
            * alias.cc (static_reg_base_value): Revert commit e754b70fe54.
            (find_base_term): Likewise.
            * alias.h (find_base_term): Likewise.
            * function.cc (thread_prologue_and_epilogue_insns): Likewise.
            * rtl.h (static_reg_base_value): Likewise.
            * config/i386/i386.cc (stack_access_data): Likewise.
            (ix86_find_all_reg_uses_1): Likewise.
            (ix86_find_all_reg_uses): Likewise.
            (ix86_access_stack_p): Likewise.
            (ix86_need_alignment_p_2): Likewise.
            (ix86_need_alignment_p_1): Likewise.
            (ix86_need_alignment_p): Likewise.
            (ix86_update_stack_alignment): Likewise.
            (ix86_find_max_used_stack_alignment): Likewise.
            (ix86_update_stack_alignment_2): Removed.
            (ix86_update_stack_alignment_1): Likewise.
    
    gcc/testsuite/
    
            PR target/126202
            * g++.target/i386/pr126202-1.C: New test.
            * gcc.target/i386/pr126202-1.c: Likewise.
    
    Signed-off-by: H.J. Lu <[email protected]>

Diff:
---
 gcc/alias.cc                               |   5 +-
 gcc/alias.h                                |   1 -
 gcc/config/i386/i386.cc                    | 399 ++++++++++++++++++++---------
 gcc/function.cc                            |   6 -
 gcc/rtl.h                                  |   2 -
 gcc/testsuite/g++.target/i386/pr126202-1.C |  71 +++++
 gcc/testsuite/gcc.target/i386/pr126202-1.c |  29 +++
 7 files changed, 381 insertions(+), 132 deletions(-)

diff --git a/gcc/alias.cc b/gcc/alias.cc
index 3048a1e23547..abba2dd9f820 100644
--- a/gcc/alias.cc
+++ b/gcc/alias.cc
@@ -232,6 +232,9 @@ static GTY((deletable)) vec<rtx, va_gc> *old_reg_base_value;
 #define UNIQUE_BASE_VALUE_FP	-3
 #define UNIQUE_BASE_VALUE_HFP	-4
 
+#define static_reg_base_value \
+  (this_target_rtl->x_static_reg_base_value)
+
 #define REG_BASE_VALUE(X)					\
   (REGNO (X) < vec_safe_length (reg_base_value)			\
    ? (*reg_base_value)[REGNO (X)] : 0)
@@ -2062,7 +2065,7 @@ find_base_term (rtx x, vec<std::pair<cselib_val *,
 /* Wrapper around the worker above which removes locs from visited VALUEs
    to avoid visiting them multiple times.  We unwind that changes here.  */
 
-rtx
+static rtx
 find_base_term (rtx x)
 {
   auto_vec<std::pair<cselib_val *, struct elt_loc_list *>, 32> visited_vals;
diff --git a/gcc/alias.h b/gcc/alias.h
index 1e43111f5807..4bd49bb0fa46 100644
--- a/gcc/alias.h
+++ b/gcc/alias.h
@@ -42,7 +42,6 @@ int compare_base_decls (tree, tree);
 bool refs_same_for_tbaa_p (tree, tree);
 bool mems_same_for_tbaa_p (rtx, rtx);
 bool view_converted_memref_p (tree);
-extern rtx find_base_term (rtx);
 
 /* This alias set can be used to force a memory to conflict with all
    other memories, creating a barrier across which no memory reference
diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index 31a057e81cd9..b137f5c22dc7 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -8584,135 +8584,221 @@ output_probe_stack_range (rtx reg, rtx end)
   return "";
 }
 
-/* Update the maximum stack slot alignment from memory alignment if
-   OP is stack memory.  */
+/* Data passed to ix86_update_stack_alignment.  */
+struct stack_access_data
+{
+  /* The stack access register.  */
+  const_rtx reg;
+  /* Pointer to stack alignment.  */
+  unsigned int *stack_alignment;
+};
+
+/* Return true if OP references an argument passed on stack.  */
+
+static bool
+ix86_argument_passed_on_stack_p (const_rtx op)
+{
+  tree mem_expr = MEM_EXPR (op);
+  if (mem_expr)
+    {
+      tree var = get_base_address (mem_expr);
+      return TREE_CODE (var) == PARM_DECL;
+    }
+  return false;
+}
+
+/* Update the maximum stack slot alignment from memory alignment in PAT.  */
 
 static void
-ix86_update_stack_alignment_2 (const_rtx op, unsigned int &alignment)
+ix86_update_stack_alignment (rtx, const_rtx pat, void *data)
 {
-  unsigned int mem_align = MEM_ALIGN (op);
-  if (mem_align <= alignment)
-    return;
+  /* This insn may reference stack slot.  Update the maximum stack slot
+     alignment if the memory is referenced by the stack access register. */
+  stack_access_data *p = (stack_access_data *) data;
+
+  subrtx_iterator::array_type array;
+  FOR_EACH_SUBRTX (iter, array, pat, ALL)
+    {
+      auto op = *iter;
+      if (MEM_P (op))
+	{
+	  /* NB: Ignore arguments passed on stack since caller is
+	     responsible to align the outgoing stack for arguments
+	     passed on stack.  */
+	  if (reg_mentioned_p (p->reg, XEXP (op, 0))
+	      && !ix86_argument_passed_on_stack_p (op))
+	    {
+	      unsigned int alignment = MEM_ALIGN (op);
+
+	      if (alignment > *p->stack_alignment)
+		*p->stack_alignment = alignment;
+	      break;
+	    }
+	  else
+	    iter.skip_subrtxes ();
+	}
+    }
+}
 
-  /* Skip if OP is a memory operand with CONST_INT in
+/* Helper function for ix86_find_all_reg_uses.  */
 
-     (set (mem/v:SI (const_int 0 [0]) [14 MEM[(int *)0B]+0 S4 A256])
-	  (const_int 0 [0]))
+static void
+ix86_find_all_reg_uses_1 (HARD_REG_SET &regset,
+			  rtx set, unsigned int regno,
+			  auto_bitmap &worklist)
+{
+  rtx dest = SET_DEST (set);
 
-     or SYMBOLIC_CONST in
+  if (!REG_P (dest))
+    return;
 
-     (set (reg:SI 0 ax [orig:118 _2 ] [118])
-	  (sign_extend:SI (mem/c:QI (symbol_ref:DI ("c") [flags 0x2] <var_decl 0x7fffe960de40 c>) [0 c+0 S1 A8])))
-   */
-  rtx x = XEXP (op, 0);
-  if (CONST_INT_P (x) || SYMBOLIC_CONST (x))
+  /* Reject non-Pmode modes.  */
+  if (GET_MODE (dest) != Pmode)
+    return;
+
+  unsigned int dst_regno = REGNO (dest);
+
+  if (TEST_HARD_REG_BIT (regset, dst_regno))
     return;
 
-  /* Skip if OP is function result on stack in
+  const_rtx src = SET_SRC (set);
 
-     (set (mem/c:TI (reg/f:SI 0 ax [orig:99 .result_ptr ] [99]) [2 <retval>+0 S16 A128])
-	  (reg:TI 20 xmm0 [orig:100 x ] [100]))
-  */
-  tree result_decl = DECL_RESULT (current_function_decl);
-  if (result_decl && DECL_RTL_SET_P (result_decl))
+  subrtx_iterator::array_type array;
+  FOR_EACH_SUBRTX (iter, array, src, ALL)
     {
-      rtx result_rtl = DECL_RTL (result_decl);
-      if (MEM_P (result_rtl) && XEXP (result_rtl, 0) == x)
-	return;
-    }
+      auto op = *iter;
 
-  /* All stack is in the generic address space.  Skip
+      if (MEM_P (op))
+	iter.skip_subrtxes ();
 
-     (mem:DI (reg:DI 2 cx [103]) [4 MEM[(<address-space-1> __int128 *)0B]+0 S8 A128 AS1])
+      if (REG_P (op) && REGNO (op) == regno)
+	{
+	  /* Add this register to register set.  */
+	  add_to_hard_reg_set (&regset, Pmode, dst_regno);
+	  bitmap_set_bit (worklist, dst_regno);
+	  break;
+	}
+    }
+}
 
-     from from gcc.target/i386/apx-ndd-seg-1.c.  */
-  if (MEM_ADDR_SPACE (op) != ADDR_SPACE_GENERIC)
-    return;
+/* Find all registers defined with register REGNO.  */
 
-  rtx base = find_base_term (x);
-  if (base)
+static void
+ix86_find_all_reg_uses (HARD_REG_SET &regset,
+			unsigned int regno, auto_bitmap &worklist)
+{
+  for (df_ref ref = DF_REG_USE_CHAIN (regno);
+       ref != NULL;
+       ref = DF_REF_NEXT_REG (ref))
     {
-      /* Update ALIGNMENT if RTL points-to says OP accesses stack.  */
-      if (base == static_reg_base_value[STACK_POINTER_REGNUM]
-	  || base == static_reg_base_value[FRAME_POINTER_REGNUM])
-	alignment = mem_align;
-      return;
-    }
+      if (DF_REF_IS_ARTIFICIAL (ref))
+	continue;
 
-  /* RTL points-to isn't available.  */
-  bool ok;
-  struct ix86_address parts;
-  ok = ix86_decompose_address (x, &parts);
-  gcc_assert (ok);
+      rtx_insn *insn = DF_REF_INSN (ref);
 
-  /* Skip if displacement is SYMBOLIC_CONST in
+      if (!NONJUMP_INSN_P (insn))
+	continue;
 
-     (set (mem:V16QI (plus:SI (reg:SI 2 cx [orig:105 niters_vector_mult_vf.6 ] [105])
-			      (symbol_ref:SI ("perm") [flags 0x2] <var_decl 0x7fffe9613130 perm>)) [0 MEM <vector(16) char> [(char *)vectp_perm.21_69]+0 S16 A256])
-	  (reg:V16QI 20 xmm0 [orig:179 vect__13.18_68 ] [179]))
+      unsigned int ref_regno = DF_REF_REGNO (ref);
 
-     from gcc.target/i386/pr109780-1.c.  */
-  if (parts.disp && SYMBOLIC_CONST (parts.disp))
-    return;
+      rtx set = single_set (insn);
+      if (set)
+	{
+	  ix86_find_all_reg_uses_1 (regset, set,
+				    ref_regno, worklist);
+	  continue;
+	}
 
-  tree mem_expr = MEM_EXPR (op);
-  if (mem_expr)
-    {
-      tree var = get_base_address (mem_expr);
+      rtx pat = PATTERN (insn);
+      if (GET_CODE (pat) != PARALLEL)
+	continue;
 
-      if (TREE_CODE (var) == MEM_REF
-	  || TREE_CODE (var) == TARGET_MEM_REF)
+      for (int i = 0; i < XVECLEN (pat, 0); i++)
 	{
-	   tree ptr = TREE_OPERAND (var, 0);
-	   if (TREE_CODE (ptr) == BIT_AND_EXPR)
-	     ptr = TREE_OPERAND (ptr, 0);
+	  rtx exp = XVECEXP (pat, 0, i);
 
-	   /* Skip if OP is a memory operand of non-local reference in
+	  if (GET_CODE (exp) == SET)
+	    ix86_find_all_reg_uses_1 (regset, exp,
+				      ref_regno, worklist);
+	}
+    }
+}
+
+/* Return true if the hard register REGNO used for a stack access is
+   defined in a basic block that dominates the block where it is used.  */
 
-	      (set (mem:V4DI (reg:DI 0 ax [orig:112 ivtmp.23 ] [112]) [1 MEM <vector(4) unsigned long> [(_BitInt(2048) *)_34]+0 S32 A256])
-		   (reg:V4DI 20 xmm0 [117]))
+static bool
+ix86_access_stack_p (unsigned int regno, basic_block bb,
+		     HARD_REG_SET &set_up_by_prologue,
+		     HARD_REG_SET &prologue_used,
+		     auto_bitmap reg_dominate_bbs_known[],
+		     auto_bitmap reg_dominate_bbs[])
+{
+  if (bitmap_bit_p (reg_dominate_bbs_known[regno], bb->index))
+    return bitmap_bit_p (reg_dominate_bbs[regno], bb->index);
+
+  bitmap_set_bit (reg_dominate_bbs_known[regno], bb->index);
+
+  /* Get all BBs which set REGNO and dominate the current BB from all
+     DEFs of REGNO.  */
+  for (df_ref def = DF_REG_DEF_CHAIN (regno);
+       def;
+       def = DF_REF_NEXT_REG (def))
+    if (!DF_REF_IS_ARTIFICIAL (def)
+	&& !DF_REF_FLAGS_IS_SET (def, DF_REF_MAY_CLOBBER)
+	&& !DF_REF_FLAGS_IS_SET (def, DF_REF_MUST_CLOBBER))
+      {
+	basic_block set_bb = DF_REF_BB (def);
+	if (dominated_by_p (CDI_DOMINATORS, bb, set_bb))
+	  {
+	    rtx_insn *insn = DF_REF_INSN (def);
+	    /* Return true if INSN requires stack.  */
+	    if (requires_stack_frame_p (insn, prologue_used,
+					set_up_by_prologue))
+	      {
+		bitmap_set_bit (reg_dominate_bbs[regno], bb->index);
+		return true;
+	      }
+	  }
+      }
 
-	      from gcc.target/i386/pr124098.c.  */
-	   if (!ptr_deref_may_alias_auto_p (ptr)
-	       /* An access based on an incoming pointer cannot point to
-		  local stack as in
+  /* When we get here, REGNO used in the current BB doesn't access
+     stack.  */
+  return false;
+}
 
-		  (set (reg:V2DI 20 xmm0 [orig:103 MEM[(const __m128i * {ref-all})s_1(D) & 4294967280B] ] [103])
-		       (mem:V2DI (reg:SI 0 ax [102]) [0 MEM[(const __m128i * {ref-all})s_1(D) & 4294967280B]+0 S16 A128]))
+/* Return true if OP isn't a memory operand with SYMBOLIC_CONST and
+   needs alignment > ALIGNMENT.  */
 
-		  from gcc.target/i386/pr53907.  */
-	       || (TREE_CODE (ptr) == SSA_NAME
-		   && SSA_NAME_IS_DEFAULT_DEF (ptr)
-		   && TREE_CODE (SSA_NAME_VAR (ptr)) == PARM_DECL))
-	     return;
-	}
-      /* Skip if OP isn't a local stack variable in
+static bool
+ix86_need_alignment_p_2 (const_rtx op, unsigned int alignment)
+{
+  bool need_alignment = MEM_ALIGN (op) > alignment;
+  tree mem_expr = MEM_EXPR (op);
+  if (!mem_expr)
+    return need_alignment;
 
-	 (set (mem/c:DI (plus:DI (reg/f:DI 1 dx [157])
-				 (reg:DI 0 ax [98])) [2 __gcov8.foo.strub.0[0]+0 S8 A256])
-	      (ior:DI (mem/c:DI (plus:DI (reg/f:DI 1 dx [157])
-				(reg:DI 0 ax [98])) [2 __gcov8.foo.strub.0[0]+0 S8 A256])
-		      (const_int 1 [0x1])))
+  tree var = get_base_address (mem_expr);
+  if (!VAR_P (var) || !DECL_RTL_SET_P (var))
+    return need_alignment;
 
-	 from gcc.target/i386/pr123210.c.  */
-      else if (VAR_P (var)
-	       && !auto_var_in_fn_p (var, current_function_decl))
-	return;
-    }
+  rtx x = DECL_RTL (var);
+  if (!MEM_P (x))
+    return need_alignment;
 
-  alignment = mem_align;
+  x = XEXP (x, 0);
+  return !SYMBOLIC_CONST (x) && need_alignment;
 }
 
-/* Update the maximum stack slot alignment from memory alignment if
-   SET references stack memory.  */
+/* Return true if SET needs alignment > ALIGNMENT.  */
 
-static void
-ix86_update_stack_alignment_1 (rtx set, unsigned int &alignment)
+static bool
+ix86_need_alignment_p_1 (rtx set, unsigned int alignment)
 {
   rtx dest = SET_DEST (set);
 
   if (MEM_P (dest))
-    return ix86_update_stack_alignment_2 (dest, alignment);
+    return ix86_need_alignment_p_2 (dest, alignment);
 
   const_rtx src = SET_SRC (set);
 
@@ -8722,31 +8808,35 @@ ix86_update_stack_alignment_1 (rtx set, unsigned int &alignment)
       auto op = *iter;
 
       if (MEM_P (op))
-	return ix86_update_stack_alignment_2 (op, alignment);
+	return ix86_need_alignment_p_2 (op, alignment);
     }
+
+  return false;
 }
 
-/* Update the maximum stack slot alignment from memory alignment if
-   INSN references stack memory.  */
+/* Return true if INSN needs alignment > ALIGNMENT.  */
 
-static void
-ix86_update_stack_alignment (rtx_insn *insn, unsigned int &alignment)
+static bool
+ix86_need_alignment_p (rtx_insn *insn, unsigned int alignment)
 {
   rtx set = single_set (insn);
   if (set)
-    return ix86_update_stack_alignment_1 (set, alignment);
+    return ix86_need_alignment_p_1 (set, alignment);
 
   rtx pat = PATTERN (insn);
   if (GET_CODE (pat) != PARALLEL)
-    return;
+    return false;
 
   for (int i = 0; i < XVECLEN (pat, 0); i++)
     {
       rtx exp = XVECEXP (pat, 0, i);
 
-      if (GET_CODE (exp) == SET)
-	ix86_update_stack_alignment_1 (exp, alignment);
+      if (GET_CODE (exp) == SET
+	  && ix86_need_alignment_p_1 (exp, alignment))
+	return true;
     }
+
+  return false;
 }
 
 /* Set stack_frame_required to false if stack frame isn't required.
@@ -8767,38 +8857,103 @@ ix86_find_max_used_stack_alignment (unsigned int &stack_alignment,
   add_to_hard_reg_set (&set_up_by_prologue, Pmode,
 		       HARD_FRAME_POINTER_REGNUM);
 
-  cfun->machine->stack_frame_required = false;
-
-  /* The preferred stack alignment is the minimum stack alignment.  */
-  if (check_stack_slot
-      && stack_alignment > crtl->preferred_stack_boundary)
-    stack_alignment = crtl->preferred_stack_boundary;
+  bool require_stack_frame = false;
 
   FOR_EACH_BB_FN (bb, cfun)
     {
       rtx_insn *insn;
       FOR_BB_INSNS (bb, insn)
-	if (NONDEBUG_INSN_P (insn))
+	if (NONDEBUG_INSN_P (insn)
+	    && requires_stack_frame_p (insn, prologue_used,
+				       set_up_by_prologue))
 	  {
-	    if (!cfun->machine->stack_frame_required
-		&& requires_stack_frame_p (insn, prologue_used,
-					   set_up_by_prologue))
-	      {
-		/* Set stack_frame_required before calling
-		   ix86_update_stack_alignment.  */
-		cfun->machine->stack_frame_required = true;
+	    require_stack_frame = true;
+	    break;
+	  }
+    }
 
-		/* Stop if we don't need to check stack slot.  */
-		if (!check_stack_slot)
-		  break;
-	      }
+  cfun->machine->stack_frame_required = require_stack_frame;
 
-	    if (!check_stack_slot || !NONJUMP_INSN_P (insn))
-	      continue;
+  /* Stop if we don't need to check stack slot.  */
+  if (!check_stack_slot)
+    return;
 
-	    ix86_update_stack_alignment (insn, stack_alignment);
-	  }
+  /* The preferred stack alignment is the minimum stack alignment.  */
+  if (stack_alignment > crtl->preferred_stack_boundary)
+    stack_alignment = crtl->preferred_stack_boundary;
+
+  HARD_REG_SET stack_slot_access;
+  CLEAR_HARD_REG_SET (stack_slot_access);
+
+  /* Stack slot can be accessed by stack pointer, frame pointer or
+     registers defined by stack pointer or frame pointer.  */
+  auto_bitmap worklist;
+
+  add_to_hard_reg_set (&stack_slot_access, Pmode, STACK_POINTER_REGNUM);
+  bitmap_set_bit (worklist, STACK_POINTER_REGNUM);
+
+  if (frame_pointer_needed)
+    {
+      add_to_hard_reg_set (&stack_slot_access, Pmode,
+			   HARD_FRAME_POINTER_REGNUM);
+      bitmap_set_bit (worklist, HARD_FRAME_POINTER_REGNUM);
     }
+
+  /* Registers on HARD_STACK_SLOT_ACCESS always access stack.  */
+  HARD_REG_SET hard_stack_slot_access = stack_slot_access;
+
+  calculate_dominance_info (CDI_DOMINATORS);
+
+  unsigned int regno;
+
+  do
+    {
+      regno = bitmap_clear_first_set_bit (worklist);
+      ix86_find_all_reg_uses (stack_slot_access, regno, worklist);
+    }
+  while (!bitmap_empty_p (worklist));
+
+  hard_reg_set_iterator hrsi;
+  stack_access_data data;
+
+  auto_bitmap reg_dominate_bbs_known[FIRST_PSEUDO_REGISTER];
+  auto_bitmap reg_dominate_bbs[FIRST_PSEUDO_REGISTER];
+
+  data.stack_alignment = &stack_alignment;
+
+  EXECUTE_IF_SET_IN_HARD_REG_SET (stack_slot_access, 0, regno, hrsi)
+    {
+      for (df_ref ref = DF_REG_USE_CHAIN (regno);
+	   ref != NULL;
+	   ref = DF_REF_NEXT_REG (ref))
+	{
+	  if (DF_REF_IS_ARTIFICIAL (ref))
+	    continue;
+
+	  rtx_insn *insn = DF_REF_INSN (ref);
+
+	  if (!NONJUMP_INSN_P (insn))
+	    continue;
+
+	  /* Call ix86_access_stack_p only if INSN needs alignment >
+	     STACK_ALIGNMENT.  */
+	  if (ix86_need_alignment_p (insn, stack_alignment)
+	      && (TEST_HARD_REG_BIT (hard_stack_slot_access, regno)
+		  || ix86_access_stack_p (regno, BLOCK_FOR_INSN (insn),
+					  set_up_by_prologue,
+					  prologue_used,
+					  reg_dominate_bbs_known,
+					  reg_dominate_bbs)))
+	    {
+	      /* Update stack alignment if REGNO is used for stack
+		 access.  */
+	      data.reg = DF_REF_REG (ref);
+	      note_stores (insn, ix86_update_stack_alignment, &data);
+	    }
+	}
+    }
+
+  free_dominance_info (CDI_DOMINATORS);
 }
 
 /* Finalize stack_realign_needed and frame_pointer_needed flags, which
diff --git a/gcc/function.cc b/gcc/function.cc
index 2f3c6355e5ee..5ade058d724c 100644
--- a/gcc/function.cc
+++ b/gcc/function.cc
@@ -6091,9 +6091,6 @@ make_epilogue_seq (void)
 void
 thread_prologue_and_epilogue_insns (void)
 {
-  /* We need alias.  */
-  init_alias_analysis ();
-
   df_analyze ();
 
   /* Can't deal with multiple successors of the entry block at the
@@ -6326,9 +6323,6 @@ thread_prologue_and_epilogue_insns (void)
       df_update_entry_block_defs ();
       df_update_exit_block_uses ();
     }
-
-  /* Clean up.  */
-  end_alias_analysis ();
 }
 
 /* Reposition the prologue-end and epilogue-begin notes after
diff --git a/gcc/rtl.h b/gcc/rtl.h
index b8aeba423a3c..e0311189db46 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -4022,8 +4022,6 @@ extern struct target_rtl *this_target_rtl;
   (this_target_rtl->x_top_of_stack)
 #define mode_mem_attrs \
   (this_target_rtl->x_mode_mem_attrs)
-#define static_reg_base_value \
-  (this_target_rtl->x_static_reg_base_value)
 
 /* All references to certain hard regs, except those created
    by allocating pseudo regs into them (when that's possible),
diff --git a/gcc/testsuite/g++.target/i386/pr126202-1.C b/gcc/testsuite/g++.target/i386/pr126202-1.C
new file mode 100644
index 000000000000..95d463bf0173
--- /dev/null
+++ b/gcc/testsuite/g++.target/i386/pr126202-1.C
@@ -0,0 +1,71 @@
+/* { dg-do compile { target pie } } */
+/* { dg-options "-O3 -std=gnu++20 -march=znver5 -fPIE" } */
+
+typedef int fixed16_16;
+struct vec2_fixed
+{
+  fixed16_16 x, z;
+} s_polygonUv[32];
+struct vec3_fixed
+{
+  fixed16_16 x, y, z;
+};
+template <typename> struct allocator_traits;
+template <typename> class allocator;
+template <typename _Tp> struct allocator_traits<allocator<_Tp>>
+{
+  using value_type = _Tp;
+  using pointer = _Tp *;
+  template <typename _Up> using rebind_alloc = allocator<_Up>;
+};
+template <typename _Alloc> struct __alloc_traits : allocator_traits<_Alloc>
+{
+  typedef allocator_traits<_Alloc> _Base_type;
+  typedef _Base_type::value_type reference;
+  template <typename _Tp> struct rebind
+  {
+    typedef typename _Base_type::rebind_alloc<_Tp> other;
+  };
+};
+template <typename _Tp, typename _Alloc> struct _Vector_base
+{
+  typedef __alloc_traits<_Alloc>::template rebind<_Tp>::other _Tp_alloc_type;
+  struct
+  {
+    __alloc_traits<_Tp_alloc_type>::pointer _M_start;
+  } _M_impl;
+};
+template <typename _Tp, typename _Alloc = allocator<_Tp>>
+struct vector : _Vector_base<_Tp, _Alloc>
+{
+  __alloc_traits<typename _Vector_base<_Tp, _Alloc>::_Tp_alloc_type>::reference
+  operator[] (int __n)
+  {
+    return *(this->_M_impl._M_start + __n);
+  }
+};
+extern int vertexCount, s_polygonIntensity_0;
+struct JmPolygon
+{
+  int *indices;
+};
+extern vector<vec3_fixed> s_verticesVS;
+extern vector<fixed16_16> s_vertexIntensity;
+extern vec3_fixed s_polygonVerticesVS[2];
+extern JmPolygon *robj3d_setupPolygon_polygon;
+void
+robj3d_setupPolygon ()
+{
+  for (int v = 0; v < vertexCount; v++)
+    s_polygonVerticesVS[v]
+        = s_verticesVS[robj3d_setupPolygon_polygon->indices[v]];
+  vec2_fixed *uv = (vec2_fixed *)robj3d_setupPolygon_polygon;
+  vec2_fixed zero{};
+  for (int v = 0; v < vertexCount; v++)
+    s_polygonUv[v] = uv[v];
+  for (int v = 0; v < vertexCount; v++)
+    s_polygonUv[v] = zero;
+  for (int v;;)
+    s_polygonIntensity_0
+        = s_vertexIntensity[robj3d_setupPolygon_polygon->indices[v]];
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr126202-1.c b/gcc/testsuite/gcc.target/i386/pr126202-1.c
new file mode 100644
index 000000000000..7a2b5b7be150
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr126202-1.c
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-march=x86-64 -mavx -O2 -fno-strict-overflow" } */
+
+typedef long __m128i __attribute__ ((__vector_size__ (16)));
+__m128i _mm_store_si128___B;
+typedef long __m256i __attribute__ ((__vector_size__ (32)));
+int vpx_quantize_b_avx___trans_tmp_6, vpx_quantize_b_avx_index;
+void
+_mm256_store_si256 (__m256i *__P, __m256i __A)
+{
+  *__P = __A;
+}
+void
+store_tran_low (int *b)
+{
+  *(__m128i *)b = _mm_store_si128___B;
+}
+void
+vpx_quantize_b_avx (int, long, int, int *qcoeff_ptr, int, short,
+                    short *eob_ptr)
+{
+  __m256i __trans_tmp_5 = {};
+  if (vpx_quantize_b_avx___trans_tmp_6)
+    _mm256_store_si256 ((__m256i *)(qcoeff_ptr
+				    + vpx_quantize_b_avx_index + 8),
+                        __trans_tmp_5);
+  store_tran_low (qcoeff_ptr + vpx_quantize_b_avx_index + 8);
+  *eob_ptr = 0;
+}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.