Created attachment 39900 [details] preprocessed source that triggers ICE /home/jcmvbkbc/ws/tensilica/crosstool/crosstool-NG/.build/xtensa-dc233c_call0-linux-uclibc/build/build-cc-gcc-core-pass-2/./gcc/xgcc -B/home/jcmvbkbc/ws/tensilica/crosstool/crosstool-NG/.build/xtensa-dc233c_call0-l inux-uclibc/build/build-cc-gcc-core-pass-2/./gcc/ -B/home/jcmvbkbc/ws/tensilica/crosstool/crosstool-NG/.build/xtensa-dc233c_call0-linux-uclibc/buildtools/xtensa-dc233c_call0-linux-uclibc/bin/ -B/home/jcmvbkbc/ws/tensilica/cro sstool/crosstool-NG/.build/xtensa-dc233c_call0-linux-uclibc/buildtools/xtensa-dc233c_call0-linux-uclibc/lib/ -isystem /home/jcmvbkbc/ws/tensilica/crosstool/crosstool-NG/.build/xtensa-dc233c_call0-linux-uclibc/buildtools/xtens a-dc233c_call0-linux-uclibc/include -isystem /home/jcmvbkbc/ws/tensilica/crosstool/crosstool-NG/.build/xtensa-dc233c_call0-linux-uclibc/buildtools/xtensa-dc233c_call0-linux-uclibc/sys-include -mlongcalls -mauto-litpools -g -Os -O2 -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -isystem ./include -fPIC -g -DIN_LIBGCC2 -fbuilding-libgc c -fno-stack-protector -fPIC -I. -I. -I../.././gcc -I/home/jcmvbkbc/ws/tensilica/crosstool/crosstool-NG/.build/src/gcc-6.1.0/libgcc -I/home/jcmvbkbc/ws/tensilica/crosstool/crosstool-NG/.build/src/gcc-6.1.0/libgcc/. -I/home/ jcmvbkbc/ws/tensilica/crosstool/crosstool-NG/.build/src/gcc-6.1.0/libgcc/../gcc -I/home/jcmvbkbc/ws/tensilica/crosstool/crosstool-NG/.build/src/gcc-6.1.0/libgcc/../include -DHAVE_CC_TLS -o _mulsc3.o -MT _mulsc3.o -MD -MP -M F _mulsc3.dep -DL_mulsc3 -c /home/jcmvbkbc/ws/tensilica/crosstool/crosstool-NG/.build/src/gcc-6.1.0/libgcc/libgcc2.c -fvisibility=hidden -DHIDE_EXPORTS [ALL ] /home/jcmvbkbc/ws/tensilica/crosstool/crosstool-NG/.build/src/gcc-6.1.0/libgcc/libgcc2.c: In function '__mulsc3': [ERROR] /home/jcmvbkbc/ws/tensilica/crosstool/crosstool-NG/.build/src/gcc-6.1.0/libgcc/libgcc2.c:1992:1: error: unrecognizable insn: [ALL ] } [ALL ] ^ [ALL ] (jump_insn 1361 1360 1362 55 (parallel [ [ALL ] (return) [ALL ] (use (reg:SI 0 a0)) [ALL ] ]) /home/jcmvbkbc/ws/tensilica/crosstool/crosstool-NG/.build/src/gcc-6.1.0/libgcc/libgcc2.c:1992 -1 [ALL ] (expr_list:REG_DEAD (reg:SI 0 a0) [ALL ] (nil)) [ALL ] -> return) [ERROR] /home/jcmvbkbc/ws/tensilica/crosstool/crosstool-NG/.build/src/gcc-6.1.0/libgcc/libgcc2.c:1992:1: internal compiler error: in extract_insn, at recog.c:2287 The configuration is for call0 ABI.
It started failing after the following commit: commit 32e90dc6a0cda452b426b370326e315ac6f10f02 Author: edlinger <edlinger@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Wed Jul 1 16:10:30 2015 +0000 gcc/ChangeLog: 2015-07-01 Bernd Edlinger <bernd.edlinger@hotmail.de> PR rtl-optimization/61047 * rtlanal.c (get_initial_register_offset): New function. (rtx_addr_can_trap_p_1): Check offsets of stack references. testsuite/ChangeLog: 2015-07-01 Bernd Edlinger <bernd.edlinger@hotmail.de> PR rtl-optimization/61047 * gcc.c-torture/execute/20150611-1.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@225260 138bc75d-0d04-0410-961f-82ee72b054a4
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.
Created attachment 39936 [details] tentative patch
Author: jcmvbkbc Date: Tue Nov 1 17:16:33 2016 New Revision: 241748 URL: https://gcc.gnu.org/viewcvs?rev=241748&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. 2016-11-01 Max Filippov <jcmvbkbc@gmail.com> gcc/ * 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: trunk/gcc/ChangeLog trunk/gcc/config/xtensa/xtensa-protos.h trunk/gcc/config/xtensa/xtensa.c trunk/gcc/config/xtensa/xtensa.h trunk/gcc/config/xtensa/xtensa.md
Fix committed to trunk.
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 <jcmvbkbc@gmail.com> gcc/ Backport from mainline 2016-11-01 Max Filippov <jcmvbkbc@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