https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78118
--- Comment #6 from jcmvbkbc at gcc dot gnu.org --- Author: jcmvbkbc Date: Wed May 31 00:05:01 2017 New Revision: 248713 URL: https://gcc.gnu.org/viewcvs?rev=248713&root=gcc&view=rev Log: xtensa: Fix PR target/78118 It started failing after the following commit: 32e90dc6a0cda45 ("PR rtl-optimization/61047"). The change that made xtensa backend go ICE looks completely unrelated, and indeed, the issue is caused by the side effect of compute_frame_size() function call hidden in the INITIAL_ELIMINATION_OFFSET macro. This call updates the value of the xtensa_current_frame_size static variable, used in "return" instruction predicate. Prior to the change the value of xtensa_current_frame_size was set to 0 after the end of epilogue generation, which enabled the "return" instruction for the CALL0 ABI, but after the change the additional INITIAL_ELIMINATION_OFFSET calls make xtensa_current_frame_size non-zero and "return" pattern unavailable. Get rid of the global xtensa_current_frame_size and xtensa_callee_save_size variables by moving them into the machine_function structure. Implement predicate for the "return" pattern as a function. Don't communicate completion of epilogue generation through zeroing of xtensa_current_frame_size, add explicit epilogue_done variable to the machine_function structure. Don't update stack frame layout after the completion of reload. 2017-05-30 Max Filippov <jcmvb...@gmail.com> gcc/ Backport from mainline 2016-11-01 Max Filippov <jcmvb...@gmail.com> * config/xtensa/xtensa-protos.h (xtensa_use_return_instruction_p): New prototype. * config/xtensa/xtensa.c (xtensa_current_frame_size, xtensa_callee_save_size): Remove. (struct machine_function): Add new fields: current_frame_size, callee_save_size, frame_laid_out and epilogue_done. (compute_frame_size, xtensa_expand_prologue, xtensa_expand_epilogue): Replace xtensa_callee_save_size with cfun->machine->callee_save_size and xtensa_current_frame_size with cfun->machine->current_frame_size. (compute_frame_size): Update cfun->machine->frame_laid_out and don't update frame layout after reload completion. (xtensa_expand_epilogue): Set cfun->machine->epilogue_done instead of zeroing xtensa_current_frame_size. (xtensa_use_return_instruction_p): New function. * config/xtensa/xtensa.h (xtensa_current_frame_size): Remove declaration. (INITIAL_ELIMINATION_OFFSET): Use return value of compute_frame_size instead of xtensa_current_frame_size value. * config/xtensa/xtensa.md ("return" pattern): Use new predicate function xtensa_use_return_instruction_p instead of inline code. Modified: branches/gcc-6-branch/gcc/ChangeLog branches/gcc-6-branch/gcc/config/xtensa/xtensa-protos.h branches/gcc-6-branch/gcc/config/xtensa/xtensa.c branches/gcc-6-branch/gcc/config/xtensa/xtensa.h branches/gcc-6-branch/gcc/config/xtensa/xtensa.md