https://gcc.gnu.org/g:6921c93d205203b239bf36cecc2258d202419ac6

commit r15-7635-g6921c93d205203b239bf36cecc2258d202419ac6
Author: H.J. Lu <hjl.to...@gmail.com>
Date:   Thu Feb 20 15:23:15 2025 +0800

    Revert "x86: Properly find the maximum stack slot alignment"
    
    This reverts commit 11902be7a57c0ccf03786aa0255fffaf0f54dbf9.

Diff:
---
 gcc/config/i386/i386.cc                    | 177 ++++-------------------------
 gcc/testsuite/g++.target/i386/pr109780-1.C |  72 ------------
 gcc/testsuite/gcc.target/i386/pr109093-1.c |  33 ------
 gcc/testsuite/gcc.target/i386/pr109780-1.c |  14 ---
 gcc/testsuite/gcc.target/i386/pr109780-2.c |  21 ----
 gcc/testsuite/gcc.target/i386/pr109780-3.c |  46 --------
 6 files changed, 21 insertions(+), 342 deletions(-)

diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index fafd4a511a3c..3128973ba79c 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -8466,107 +8466,6 @@ output_probe_stack_range (rtx reg, rtx end)
   return "";
 }
 
-/* Update the maximum stack slot alignment from memory alignment in
-   PAT.  */
-
-static void
-ix86_update_stack_alignment (rtx, const_rtx pat, void *data)
-{
-  /* This insn may reference stack slot.  Update the maximum stack slot
-     alignment.  */
-  subrtx_iterator::array_type array;
-  FOR_EACH_SUBRTX (iter, array, pat, ALL)
-    if (MEM_P (*iter))
-      {
-       unsigned int alignment = MEM_ALIGN (*iter);
-       unsigned int *stack_alignment
-         = (unsigned int *) data;
-       if (alignment > *stack_alignment)
-         *stack_alignment = alignment;
-       break;
-      }
-}
-
-/* Helper function for ix86_find_all_reg_use.  */
-
-static void
-ix86_find_all_reg_use_1 (rtx set, HARD_REG_SET &stack_slot_access,
-                        auto_bitmap &worklist)
-{
-  rtx dest = SET_DEST (set);
-  if (!REG_P (dest))
-    return;
-
-  rtx src = SET_SRC (set);
-  if (MEM_P (src) || CONST_SCALAR_INT_P (src))
-    return;
-
-  if (TEST_HARD_REG_BIT (stack_slot_access, REGNO (dest)))
-    return;
-
-  /* Add this register to stack_slot_access.  */
-  add_to_hard_reg_set (&stack_slot_access, Pmode, REGNO (dest));
-  bitmap_set_bit (worklist, REGNO (dest));
-}
-
-/* Find all registers defined with REG.  */
-
-static void
-ix86_find_all_reg_use (HARD_REG_SET &stack_slot_access,
-                      unsigned int reg, auto_bitmap &worklist)
-{
-  for (df_ref ref = DF_REG_USE_CHAIN (reg);
-       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;
-
-      rtx set = single_set (insn);
-      if (set)
-       ix86_find_all_reg_use_1 (set, stack_slot_access, worklist);
-
-      rtx pat = PATTERN (insn);
-      if (GET_CODE (pat) != PARALLEL)
-       continue;
-
-      for (int i = 0; i < XVECLEN (pat, 0); i++)
-       {
-         rtx exp = XVECEXP (pat, 0, i);
-         switch (GET_CODE (exp))
-           {
-           case ASM_OPERANDS:
-           case CLOBBER:
-           case PREFETCH:
-           case USE:
-             break;
-           case UNSPEC:
-           case UNSPEC_VOLATILE:
-             for (int j = XVECLEN (exp, 0) - 1; j >= 0; j--)
-               {
-                 rtx x = XVECEXP (exp, 0, j);
-                 if (GET_CODE (x) == SET)
-                   ix86_find_all_reg_use_1 (x, stack_slot_access,
-                                            worklist);
-               }
-             break;
-           case SET:
-             ix86_find_all_reg_use_1 (exp, stack_slot_access,
-                                      worklist);
-             break;
-           default:
-             gcc_unreachable ();
-             break;
-           }
-       }
-    }
-}
-
 /* Set stack_frame_required to false if stack frame isn't required.
    Update STACK_ALIGNMENT to the largest alignment, in bits, of stack
    slot used if stack frame is required and CHECK_STACK_SLOT is true.  */
@@ -8585,6 +8484,10 @@ ix86_find_max_used_stack_alignment (unsigned int 
&stack_alignment,
   add_to_hard_reg_set (&set_up_by_prologue, Pmode,
                       HARD_FRAME_POINTER_REGNUM);
 
+  /* The preferred stack alignment is the minimum stack alignment.  */
+  if (stack_alignment > crtl->preferred_stack_boundary)
+    stack_alignment = crtl->preferred_stack_boundary;
+
   bool require_stack_frame = false;
 
   FOR_EACH_BB_FN (bb, cfun)
@@ -8596,65 +8499,27 @@ ix86_find_max_used_stack_alignment (unsigned int 
&stack_alignment,
                                       set_up_by_prologue))
          {
            require_stack_frame = true;
-           break;
+
+           if (check_stack_slot)
+             {
+               /* Find the maximum stack alignment.  */
+               subrtx_iterator::array_type array;
+               FOR_EACH_SUBRTX (iter, array, PATTERN (insn), ALL)
+                 if (MEM_P (*iter)
+                     && (reg_mentioned_p (stack_pointer_rtx,
+                                          *iter)
+                         || reg_mentioned_p (frame_pointer_rtx,
+                                             *iter)))
+                   {
+                     unsigned int alignment = MEM_ALIGN (*iter);
+                     if (alignment > stack_alignment)
+                       stack_alignment = alignment;
+                   }
+             }
          }
     }
 
   cfun->machine->stack_frame_required = require_stack_frame;
-
-  /* Stop if we don't need to check stack slot.  */
-  if (!check_stack_slot)
-    return;
-
-  /* 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);
-    }
-
-  unsigned int reg;
-
-  do
-    {
-      reg = bitmap_clear_first_set_bit (worklist);
-      ix86_find_all_reg_use (stack_slot_access, reg, worklist);
-    }
-  while (!bitmap_empty_p (worklist));
-
-  hard_reg_set_iterator hrsi;
-
-  EXECUTE_IF_SET_IN_HARD_REG_SET (stack_slot_access, 0, reg, hrsi)
-    for (df_ref ref = DF_REG_USE_CHAIN (reg);
-        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;
-
-       note_stores (insn, ix86_update_stack_alignment,
-                    &stack_alignment);
-      }
 }
 
 /* Finalize stack_realign_needed and frame_pointer_needed flags, which
diff --git a/gcc/testsuite/g++.target/i386/pr109780-1.C 
b/gcc/testsuite/g++.target/i386/pr109780-1.C
deleted file mode 100644
index 7e3eabdec947..000000000000
--- a/gcc/testsuite/g++.target/i386/pr109780-1.C
+++ /dev/null
@@ -1,72 +0,0 @@
-/* { dg-do compile } */
-/* { dg-require-effective-target c++17 } */
-/* { dg-options "-O2 -mavx2 -mtune=haswell" } */
-
-template <typename _Tp> struct remove_reference {
-  using type = __remove_reference(_Tp);
-};
-template <typename T> struct MaybeStorageBase {
-  T val;
-  struct Union {
-    ~Union();
-  } mStorage;
-};
-template <typename T> struct MaybeStorage : MaybeStorageBase<T> {
-  char mIsSome;
-};
-template <typename T, typename U = typename remove_reference<T>::type>
-constexpr MaybeStorage<U> Some(T &&);
-template <typename T, typename U> constexpr MaybeStorage<U> Some(T &&aValue) {
-  return {aValue};
-}
-template <class> struct Span {
-  int operator[](long idx) {
-    int *__trans_tmp_4;
-    if (__builtin_expect(idx, 0))
-      *(int *)__null = false;
-    __trans_tmp_4 = storage_.data();
-    return __trans_tmp_4[idx];
-  }
-  struct {
-    int *data() { return data_; }
-    int *data_;
-  } storage_;
-};
-struct Variant {
-  template <typename RefT> Variant(RefT) {}
-};
-long from_i, from___trans_tmp_9;
-namespace js::intl {
-struct DecimalNumber {
-  Variant string_;
-  unsigned long significandStart_;
-  unsigned long significandEnd_;
-  bool zero_ = false;
-  bool negative_;
-  template <typename CharT> DecimalNumber(CharT string) : string_(string) {}
-  template <typename CharT>
-  static MaybeStorage<DecimalNumber> from(Span<const CharT>);
-  void from();
-};
-} // namespace js::intl
-void js::intl::DecimalNumber::from() {
-  Span<const char16_t> __trans_tmp_3;
-  from(__trans_tmp_3);
-}
-template <typename CharT>
-MaybeStorage<js::intl::DecimalNumber>
-js::intl::DecimalNumber::from(Span<const CharT> chars) {
-  DecimalNumber number(chars);
-  if (auto ch = chars[from_i]) {
-    from_i++;
-    number.negative_ = ch == '-';
-  }
-  while (from___trans_tmp_9 && chars[from_i])
-    ;
-  if (chars[from_i])
-    while (chars[from_i - 1])
-      number.zero_ = true;
-  return Some(number);
-}
-
-/* { dg-final { scan-assembler-not "and\[lq\]?\[^\\n\]*-32,\[^\\n\]*sp" } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr109093-1.c 
b/gcc/testsuite/gcc.target/i386/pr109093-1.c
deleted file mode 100644
index 58a7b006c8ae..000000000000
--- a/gcc/testsuite/gcc.target/i386/pr109093-1.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* { dg-do run  { target avx2_runtime } }  */
-/* { dg-options "-O2 -mavx2 -mtune=znver1 -ftrivial-auto-var-init=zero 
-fno-stack-protector" } */
-
-int a, b, c, d;
-char e, f = 1;
-short g, h, i;
-
-__attribute__ ((weak))
-void
-run (void)
-{
-  short j;
-
-  for (; g >= 0; --g)
-    {
-      int *k[10];
-
-      for (d = 0; d < 10; d++)
-       k[d] = &b;
-
-      c = *k[1];
-
-      for (; a;)
-       j = i - c / f || (e ^= h);
-    }
-}
-
-int
-main (void)
-{
-  run ();
-  return 0;
-}
diff --git a/gcc/testsuite/gcc.target/i386/pr109780-1.c 
b/gcc/testsuite/gcc.target/i386/pr109780-1.c
deleted file mode 100644
index 6b06947f2a54..000000000000
--- a/gcc/testsuite/gcc.target/i386/pr109780-1.c
+++ /dev/null
@@ -1,14 +0,0 @@
-/* { dg-do compile } */
-/* { dg-options "-O3 -march=skylake" } */
-
-char perm[64];
-
-void
-__attribute__((noipa))
-foo (int n)
-{
-  for (int i = 0; i < n; ++i)
-    perm[i] = i;
-}
-
-/* { dg-final { scan-assembler-not "and\[lq\]?\[^\\n\]*-32,\[^\\n\]*sp" } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr109780-2.c 
b/gcc/testsuite/gcc.target/i386/pr109780-2.c
deleted file mode 100644
index 152da06c6ad1..000000000000
--- a/gcc/testsuite/gcc.target/i386/pr109780-2.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* { dg-do compile } */
-/* { dg-options "-O3 -march=skylake" } */
-
-#define N 9
-
-void
-f (double x, double y, double *res)
-{
-  y = -y;
-  for (int i = 0; i < N; ++i)
-    {
-      double tmp = y;
-      y = x;
-      x = tmp;
-      res[i] = i;
-    }
-  res[N] = y * y;
-  res[N + 1] = x;
-}
-
-/* { dg-final { scan-assembler-not "and\[lq\]?\[^\\n\]*-32,\[^\\n\]*sp" } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr109780-3.c 
b/gcc/testsuite/gcc.target/i386/pr109780-3.c
deleted file mode 100644
index a3a770a80e39..000000000000
--- a/gcc/testsuite/gcc.target/i386/pr109780-3.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* { dg-do run  { target avx2_runtime } }  */
-/* { dg-options "-O2 -mavx2 -mtune=znver1 -fno-stack-protector 
-fno-stack-clash-protection" } */
-
-char a;
-static int b, c, f;
-char *d = &a;
-static char *e = &a;
-
-__attribute__ ((weak))
-void
-g (int h, int i)
-{
-  int j = 1;
-  for (; c != -3; c = c - 1)
-    {
-      int k[10];
-      f = 0;
-      for (; f < 10; f++)
-        k[f] = 0;
-      *d = k[1];
-      if (i < *d)
-        {
-          *e = h;
-          for (; j < 9; j++)
-            {
-              b = 1;
-              for (; b < 7; b++)
-                ;
-            }
-        }
-    }
-}
-
-__attribute__ ((weak))
-void
-run (void)
-{
-  g (1, 1);
-}
-
-int
-main (void)
-{
-  run ();
-  return 0;
-}

Reply via email to