]> git.ipfire.org Git - thirdparty/gcc.git/commit
Fix PR64242 - Longjmp expansion incorrect
authorwilco <wilco@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 3 Jun 2019 13:55:15 +0000 (13:55 +0000)
committerwilco <wilco@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 3 Jun 2019 13:55:15 +0000 (13:55 +0000)
commit5b5aa173914bb4c07a98a667ea3316305166a688
tree2518077c50198015ff9073805bf48a9eb1f535d1
parent779640c76d37b32f4d8a7b97637ed9e345d750b4
Fix PR64242 - Longjmp expansion incorrect

Improve the fix for PR64242.  Various optimizations can change a memory
reference into a frame access.  Given there are multiple virtual frame pointers
which may be replaced by multiple hard frame pointers, there are no checks for
writes to the various frame pointers.  So updates to a frame pointer tends to
generate incorrect code.  Improve the previous fix to also add clobbers of
several frame pointers and add a scheduling barrier.  This should work in most
cases until GCC supports a generic "don't optimize across this instruction"
feature.

Bootstrap OK. Testcase passes on AArch64 and x86-64.  Inspected x86, Arm,
Thumb-1 and Thumb-2 assembler which looks correct.

    gcc/
PR middle-end/64242
* builtins.c (expand_builtin_longjmp): Add frame clobbers and schedule
block.
(expand_builtin_nonlocal_goto): Likewise.

    testsuite/
PR middle-end/64242
* gcc.c-torture/execute/pr64242.c: Update test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@271870 138bc75d-0d04-0410-961f-82ee72b054a4
gcc/ChangeLog
gcc/builtins.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr64242.c