aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyrylo Tkachov <ktkachov@nvidia.com>2024-08-09 21:16:56 +0200
committerKyrylo Tkachov <ktkachov@nvidia.com>2024-08-09 21:40:55 +0200
commit4734c1bfe837b3e70bc783dafc442de3bca43d88 (patch)
tree45199f9833ff6aecf2877c5938913c6f6b46d01e
parent9e4da946c4263a4c89d5fc365b3c97ae244c5018 (diff)
downloadgcc-4734c1bfe837b3e70bc783dafc442de3bca43d88.zip
gcc-4734c1bfe837b3e70bc783dafc442de3bca43d88.tar.gz
gcc-4734c1bfe837b3e70bc783dafc442de3bca43d88.tar.bz2
Revert "lra: emit caller-save register spills before call insn [PR116028]"
This reverts commit 3c67a0fa1dd39a3378deb854a7fef0ff7fe38004.
-rw-r--r--gcc/lra-constraints.cc28
-rw-r--r--gcc/testsuite/gcc.dg/ira-shrinkwrap-prep-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/pr10474.c2
3 files changed, 6 insertions, 26 deletions
diff --git a/gcc/lra-constraints.cc b/gcc/lra-constraints.cc
index 28c1a87..92b343f 100644
--- a/gcc/lra-constraints.cc
+++ b/gcc/lra-constraints.cc
@@ -152,9 +152,6 @@ static machine_mode curr_operand_mode[MAX_RECOG_OPERANDS];
(e.g. constant) and whose subreg is given operand of the current
insn. VOIDmode in all other cases. */
static machine_mode original_subreg_reg_mode[MAX_RECOG_OPERANDS];
-/* The nearest call insn for an insn on which split transformation
- will be done. The call insn is in the same EBB as the insn. */
-static rtx_insn *latest_call_insn;
@@ -6289,25 +6286,10 @@ split_reg (bool before_p, int original_regno, rtx_insn *insn,
after_p ? restore : NULL,
call_save_p
? "Add reg<-save" : "Add reg<-split");
- if (call_save_p && latest_call_insn != NULL)
- /* PR116028: If original_regno is a pseudo that has been assigned a
- call-save hard register, then emit the spill insn before the call
- insn 'latest_call_insn' instead of adjacent to 'insn'. If 'insn'
- and 'latest_call_insn' belong to the same EBB but to two separate
- BBs, and if 'insn' is present in the entry BB, then generating the
- spill insn in the entry BB can prevent shrink wrap from happening.
- This is because the spill insn references the stack pointer and
- hence the prolog gets generated in the entry BB itself. It is
- also more efficient to generate the spill before
- 'latest_call_insn' as the spill now occurs only in the path
- containing the call. */
- lra_process_new_insns (PREV_INSN (latest_call_insn), NULL, save,
- "Add save<-reg");
- else
- lra_process_new_insns (insn, before_p ? save : NULL,
- before_p ? NULL : save,
- call_save_p
- ? "Add save<-reg" : "Add split<-reg");
+ lra_process_new_insns (insn, before_p ? save : NULL,
+ before_p ? NULL : save,
+ call_save_p
+ ? "Add save<-reg" : "Add split<-reg");
if (nregs > 1 || original_regno < FIRST_PSEUDO_REGISTER)
/* If we are trying to split multi-register. We should check
conflicts on the next assignment sub-pass. IRA can allocate on
@@ -6791,7 +6773,6 @@ inherit_in_ebb (rtx_insn *head, rtx_insn *tail)
last_processed_bb = NULL;
CLEAR_HARD_REG_SET (potential_reload_hard_regs);
live_hard_regs = eliminable_regset | lra_no_alloc_regs;
- latest_call_insn = NULL;
/* We don't process new insns generated in the loop. */
for (curr_insn = tail; curr_insn != PREV_INSN (head); curr_insn = prev_insn)
{
@@ -7004,7 +6985,6 @@ inherit_in_ebb (rtx_insn *head, rtx_insn *tail)
last_call_for_abi[callee_abi.id ()] = calls_num;
full_and_partial_call_clobbers
|= callee_abi.full_and_partial_reg_clobbers ();
- latest_call_insn = curr_insn;
if ((cheap = find_reg_note (curr_insn,
REG_RETURNED, NULL_RTX)) != NULL_RTX
&& ((cheap = XEXP (cheap, 0)), true)
diff --git a/gcc/testsuite/gcc.dg/ira-shrinkwrap-prep-1.c b/gcc/testsuite/gcc.dg/ira-shrinkwrap-prep-1.c
index 8c15097..a95637a 100644
--- a/gcc/testsuite/gcc.dg/ira-shrinkwrap-prep-1.c
+++ b/gcc/testsuite/gcc.dg/ira-shrinkwrap-prep-1.c
@@ -26,4 +26,4 @@ bar (long a)
/* { dg-final { scan-rtl-dump "Will split live ranges of parameters" "ira" } } */
/* { dg-final { scan-rtl-dump "Split live-range of register" "ira" { xfail { ! aarch64*-*-* } } } } */
-/* { dg-final { scan-rtl-dump "Performing shrink-wrapping" "pro_and_epilogue" } } */
+/* { dg-final { scan-rtl-dump "Performing shrink-wrapping" "pro_and_epilogue" { xfail powerpc*-*-* } } } */
diff --git a/gcc/testsuite/gcc.dg/pr10474.c b/gcc/testsuite/gcc.dg/pr10474.c
index b5393d5..a4af536 100644
--- a/gcc/testsuite/gcc.dg/pr10474.c
+++ b/gcc/testsuite/gcc.dg/pr10474.c
@@ -13,4 +13,4 @@ void f(int *i)
}
/* XFAIL due to PR70681. */
-/* { dg-final { scan-rtl-dump "Performing shrink-wrapping" "pro_and_epilogue" { xfail arm*-*-* } } } */
+/* { dg-final { scan-rtl-dump "Performing shrink-wrapping" "pro_and_epilogue" { xfail arm*-*-* powerpc*-*-* } } } */