]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Revert "RA: Implement reuse of equivalent memory for caller saves optimization"
authorVladimir N. Makarov <vmakarov@redhat.com>
Wed, 8 Feb 2023 13:25:10 +0000 (08:25 -0500)
committerVladimir N. Makarov <vmakarov@redhat.com>
Wed, 8 Feb 2023 13:28:32 +0000 (08:28 -0500)
This reverts commit f661c0bb6371f355966a67b5ce71398e80792948.

gcc/ira.cc
gcc/ira.h
gcc/lra-constraints.cc
gcc/testsuite/gcc.target/i386/pr103541.c [deleted file]

index c6ee46286bc7326b2f56cf7b8130f0491aafa353..66df03e8a596a0b35856c210590f299525108018 100644 (file)
@@ -3070,8 +3070,6 @@ validate_equiv_mem_from_store (rtx dest, const_rtx set ATTRIBUTE_UNUSED,
     info->equiv_mem_modified = true;
 }
 
-static int equiv_init_varies_p (rtx x);
-
 enum valid_equiv { valid_none, valid_combine, valid_reload };
 
 /* Verify that no store between START and the death of REG invalidates
@@ -3115,8 +3113,7 @@ validate_equiv_mem (rtx_insn *start, rtx reg, rtx memref)
             been changed and all hell breaks loose.  */
          ret = valid_combine;
          if (!MEM_READONLY_P (memref)
-             && (!RTL_CONST_OR_PURE_CALL_P (insn)
-                 || equiv_init_varies_p (XEXP (memref, 0))))
+             && !RTL_CONST_OR_PURE_CALL_P (insn))
            return valid_none;
        }
 
@@ -3769,18 +3766,7 @@ update_equiv_regs (void)
                {
                  replacement = copy_rtx (SET_SRC (set));
                  if (validity == valid_reload)
-                   {
-                     note = set_unique_reg_note (insn, REG_EQUIV, replacement);
-                   }
-                 else
-                   {
-                     /* We still can use this equivalence for caller save
-                        optimization in LRA.  Mark this.  */
-                     ira_reg_equiv[regno].caller_save_p = true;
-                     ira_reg_equiv[regno].init_insns
-                       = gen_rtx_INSN_LIST (VOIDmode, insn,
-                                            ira_reg_equiv[regno].init_insns);
-                   }
+                   note = set_unique_reg_note (insn, REG_EQUIV, replacement);
                }
            }
 
@@ -4170,7 +4156,7 @@ setup_reg_equiv (void)
                   legitimate, we ignore such REG_EQUIV notes.  */
                if (memory_operand (x, VOIDmode))
                  {
-                   ira_reg_equiv[i].defined_p = !ira_reg_equiv[i].caller_save_p;
+                   ira_reg_equiv[i].defined_p = true;
                    ira_reg_equiv[i].memory = x;
                    continue;
                  }
index 3d35025a46e120dfab6dfb4abe15dacf9c771dc4..58b50dbe8a228e86c8b59565edf2aed563b89fd9 100644 (file)
--- a/gcc/ira.h
+++ b/gcc/ira.h
@@ -175,11 +175,8 @@ extern struct target_ira *this_target_ira;
 /* Major structure describing equivalence info for a pseudo.  */
 struct ira_reg_equiv_s
 {
-  /* True if we can use this as a general equivalence.  */
+  /* True if we can use this equivalence.  */
   bool defined_p;
-  /* True if we can use this equivalence only for caller save/restore
-     location.  */
-  bool caller_save_p;
   /* True if the usage of the equivalence is profitable.  */
   bool profitable_p;
   /* Equiv. memory, constant, invariant, and initializing insns of
index dd4f68bbfc0de5caaff4143db20266772cc83638..7bffbc07ee2331cd7bd6ad3d075e0c6a3c83a00b 100644 (file)
@@ -5771,17 +5771,14 @@ choose_split_class (enum reg_class allocno_class,
   return best_cl;
 }
 
-/* Copy any equivalence information from ORIGINAL_REGNO to NEW_REGNO.  It only
-   makes sense to call this function if NEW_REGNO is always equal to
-   ORIGINAL_REGNO.  Set up defined_p flag when caller_save_p flag is set up and
-   CALL_SAVE_P is true.  */
+/* Copy any equivalence information from ORIGINAL_REGNO to NEW_REGNO.
+   It only makes sense to call this function if NEW_REGNO is always
+   equal to ORIGINAL_REGNO.  */
 
 static void
-lra_copy_reg_equiv (unsigned int new_regno, unsigned int original_regno,
-                   bool call_save_p)
+lra_copy_reg_equiv (unsigned int new_regno, unsigned int original_regno)
 {
-  if (!ira_reg_equiv[original_regno].defined_p
-      && !(call_save_p && ira_reg_equiv[original_regno].caller_save_p))
+  if (!ira_reg_equiv[original_regno].defined_p)
     return;
 
   ira_expand_reg_equiv ();
@@ -5961,7 +5958,7 @@ split_reg (bool before_p, int original_regno, rtx_insn *insn,
      rematerializing the original value instead of spilling to the stack.  */
   if (!HARD_REGISTER_NUM_P (original_regno)
       && mode == PSEUDO_REGNO_MODE (original_regno))
-    lra_copy_reg_equiv (new_regno, original_regno, call_save_p);
+    lra_copy_reg_equiv (new_regno, original_regno);
   lra_reg_info[new_regno].restore_rtx = regno_reg_rtx[original_regno];
   bitmap_set_bit (&lra_split_regs, new_regno);
   if (to != NULL)
diff --git a/gcc/testsuite/gcc.target/i386/pr103541.c b/gcc/testsuite/gcc.target/i386/pr103541.c
deleted file mode 100644 (file)
index 72b257d..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/* PR rtl-optimization/103541 */
-/* { dg-do compile  { target x86_64-*-* } } */
-/* { dg-options "-O2" } */
-
-float a;
-__attribute__((const)) float foo (float);
-
-float
-test()
-{
-        return a + foo(a) + a;
-}
-
-/* { dg-final { scan-assembler-not "\\\(%rsp\\\)" } } */