Bug 78118 - xtensa: ICE in gcc-6.1.0/libgcc/libgcc2.c:1992:1: error: unrecognizable insn
Summary: xtensa: ICE in gcc-6.1.0/libgcc/libgcc2.c:1992:1: error: unrecognizable insn
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: target (show other bugs)
Version: 6.1.0
: P3 normal
Target Milestone: ---
Assignee: jcmvbkbc
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2016-10-26 17:47 UTC by jcmvbkbc
Modified: 2017-05-31 00:05 UTC (History)
0 users

See Also:
Host:
Target: xtensa
Build:
Known to work:
Known to fail:
Last reconfirmed: 2016-10-26 00:00:00


Attachments
preprocessed source that triggers ICE (26.26 KB, text/plain)
2016-10-26 17:47 UTC, jcmvbkbc
Details
tentative patch (3.10 KB, patch)
2016-11-01 05:30 UTC, jcmvbkbc
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description jcmvbkbc 2016-10-26 17:47:31 UTC
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.
Comment 1 jcmvbkbc 2016-10-26 17:50:53 UTC
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
Comment 2 jcmvbkbc 2016-10-26 18:09:33 UTC
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.
Comment 3 jcmvbkbc 2016-11-01 05:30:32 UTC
Created attachment 39936 [details]
tentative patch
Comment 4 jcmvbkbc 2016-11-01 17:17:05 UTC
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
Comment 5 jcmvbkbc 2016-11-01 18:13:06 UTC
Fix committed to trunk.
Comment 6 jcmvbkbc 2017-05-31 00:05:33 UTC
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