This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH 5/9] regrename: Don't run if function was separately shrink-wrapped
- From: Segher Boessenkool <segher at kernel dot crashing dot org>
- To: gcc-patches at gcc dot gnu dot org
- Cc: bschmidt at redhat dot com, Segher Boessenkool <segher at kernel dot crashing dot org>
- Date: Mon, 1 Aug 2016 01:42:42 +0000
- Subject: [PATCH 5/9] regrename: Don't run if function was separately shrink-wrapped
- Authentication-results: sourceware.org; auth=none
- References: <cover.1470015604.git.segher@kernel.crashing.org>
- References: <cover.1470015604.git.segher@kernel.crashing.org>
Unfortunately even after the previous patch there are still a few cases
where regrename creates invalid code when used together with separate
shrink-wrapping. At noreturn exits regrename thinks it can use all
callee-saved registers, but that is not true. This patch disables
regrename for functions that were separately shrink-wrapped.
2016-06-07 Segher Boessenkool <segher@kernel.crashing.org>
* regrename.c (gate): Disable regrename if shrink_wrapped_separate
is set in crtl.
---
gcc/regrename.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/gcc/regrename.c b/gcc/regrename.c
index 00a5d02..e2d2483 100644
--- a/gcc/regrename.c
+++ b/gcc/regrename.c
@@ -1956,7 +1956,12 @@ public:
/* opt_pass methods: */
virtual bool gate (function *)
{
- return (optimize > 0 && (flag_rename_registers));
+ /* regrename can decide to use callee-saved registers in places where
+ those should hold their original contents. This happens when
+ separate shrink-wrapping is used. Disable regrename in that case,
+ until this problem is fixed. */
+ return (optimize > 0 && flag_rename_registers
+ && !crtl->shrink_wrapped_separate);
}
virtual unsigned int execute (function *) { return regrename_optimize (); }
--
1.9.3