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 <seg...@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