aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/xtensa
diff options
context:
space:
mode:
authorTakayuki 'January June' Suwa <jjsuwa_sys3175@yahoo.co.jp>2024-07-20 05:35:33 +0900
committerMax Filippov <jcmvbkbc@gmail.com>2024-07-29 23:09:22 -0700
commit8ebb1d79ea16f37214c33d853061d3c9cf5e7f46 (patch)
tree26dcd9db6c78790f2461ae47024df79f80326265 /gcc/config/xtensa
parentbc1fda00d5f20e2f3e77a50b2822562b6e0040b2 (diff)
downloadgcc-8ebb1d79ea16f37214c33d853061d3c9cf5e7f46.zip
gcc-8ebb1d79ea16f37214c33d853061d3c9cf5e7f46.tar.gz
gcc-8ebb1d79ea16f37214c33d853061d3c9cf5e7f46.tar.bz2
xtensa: Fix the regression introduce by r15-959-gbe9b3f4375e7
It is not wrong but also not optimal to specify that sibcalls require register A0 in RTX generation pass, by misleading DFA into thinking it is being used in function body. It would be better to specify it in pro_and_epilogue as with 'return' insn in order to avoid incorrect removing load that restores A0 in subsequent passes, but since it is not possible to modify each sibcall there, as a workaround we will preface it with a 'use' as before. This patch effectively reverts commit r15-959-gbe9b3f4375e7 gcc/ChangeLog: * config/xtensa/xtensa-protos.h (xtensa_expand_call): Remove the third argument. * config/xtensa/xtensa.cc (xtensa_expand_call): Remove the third argument and the code that uses it. * config/xtensa/xtensa.md (call, call_value, sibcall, sibcall_value): Remove each Boolean constant specified in the third argument of xtensa_expand_call. (sibcall_epilogue): Add emitting '(use A0_REG)' after calling xtensa_expand_epilogue.
Diffstat (limited to 'gcc/config/xtensa')
-rw-r--r--gcc/config/xtensa/xtensa-protos.h2
-rw-r--r--gcc/config/xtensa/xtensa.cc10
-rw-r--r--gcc/config/xtensa/xtensa.md9
3 files changed, 7 insertions, 14 deletions
diff --git a/gcc/config/xtensa/xtensa-protos.h b/gcc/config/xtensa/xtensa-protos.h
index 8f645e8..3646cea 100644
--- a/gcc/config/xtensa/xtensa-protos.h
+++ b/gcc/config/xtensa/xtensa-protos.h
@@ -53,7 +53,7 @@ extern void xtensa_expand_atomic (enum rtx_code, rtx, rtx, rtx, bool);
extern void xtensa_emit_loop_end (rtx_insn *, rtx *);
extern char *xtensa_emit_branch (bool, rtx *);
extern char *xtensa_emit_movcc (bool, bool, bool, rtx *);
-extern void xtensa_expand_call (int, rtx *, bool);
+extern void xtensa_expand_call (int, rtx *);
extern char *xtensa_emit_call (int, rtx *);
extern char *xtensa_emit_sibcall (int, rtx *);
extern bool xtensa_tls_referenced_p (rtx);
diff --git a/gcc/config/xtensa/xtensa.cc b/gcc/config/xtensa/xtensa.cc
index 772150c..1ccd42b 100644
--- a/gcc/config/xtensa/xtensa.cc
+++ b/gcc/config/xtensa/xtensa.cc
@@ -2297,7 +2297,7 @@ xtensa_emit_movcc (bool inverted, bool isfp, bool isbool, rtx *operands)
void
-xtensa_expand_call (int callop, rtx *operands, bool sibcall_p)
+xtensa_expand_call (int callop, rtx *operands)
{
rtx call;
rtx_insn *call_insn;
@@ -2339,14 +2339,6 @@ xtensa_expand_call (int callop, rtx *operands, bool sibcall_p)
CALL_INSN_FUNCTION_USAGE (call_insn) =
gen_rtx_EXPR_LIST (Pmode, clob, CALL_INSN_FUNCTION_USAGE (call_insn));
}
- else if (sibcall_p)
- {
- /* Sibling call requires a return address to the caller, similar to
- "return" insn. */
- rtx use = gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode, A0_REG));
- CALL_INSN_FUNCTION_USAGE (call_insn) =
- gen_rtx_EXPR_LIST (Pmode, use, CALL_INSN_FUNCTION_USAGE (call_insn));
- }
}
diff --git a/gcc/config/xtensa/xtensa.md b/gcc/config/xtensa/xtensa.md
index 376d0f7..a3b99dc 100644
--- a/gcc/config/xtensa/xtensa.md
+++ b/gcc/config/xtensa/xtensa.md
@@ -2597,7 +2597,7 @@
(match_operand 1 "" ""))]
""
{
- xtensa_expand_call (0, operands, false);
+ xtensa_expand_call (0, operands);
DONE;
})
@@ -2618,7 +2618,7 @@
(match_operand 2 "" "")))]
""
{
- xtensa_expand_call (1, operands, false);
+ xtensa_expand_call (1, operands);
DONE;
})
@@ -2639,7 +2639,7 @@
(match_operand 1 "" ""))]
"!TARGET_WINDOWED_ABI"
{
- xtensa_expand_call (0, operands, true);
+ xtensa_expand_call (0, operands);
DONE;
})
@@ -2660,7 +2660,7 @@
(match_operand 2 "" "")))]
"!TARGET_WINDOWED_ABI"
{
- xtensa_expand_call (1, operands, true);
+ xtensa_expand_call (1, operands);
DONE;
})
@@ -2777,6 +2777,7 @@
"!TARGET_WINDOWED_ABI"
{
xtensa_expand_epilogue ();
+ emit_use (gen_rtx_REG (SImode, A0_REG));
DONE;
})