aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2016-01-07 20:06:37 +0100
committerUros Bizjak <uros@gcc.gnu.org>2016-01-07 20:06:37 +0100
commit0de71e1f517fd3f97f072d400991e10879d2867c (patch)
tree4ce55c3f5ae33f163113a02da759af19e383525a /gcc/config
parent95918b49dff7ec678d663838ec68fcb53994cf0e (diff)
downloadgcc-0de71e1f517fd3f97f072d400991e10879d2867c.zip
gcc-0de71e1f517fd3f97f072d400991e10879d2867c.tar.gz
gcc-0de71e1f517fd3f97f072d400991e10879d2867c.tar.bz2
re PR target/69140 (stack alignment + O1 breaks with Microsoft ABI)
2016-01-07 Uros Bizjak <ubizjak@gmail.com> PR target/69140 * config/i386/i386.c (ix86_frame_pointer_required): Enable frame pointer for TARGET_64BIT_MS_ABI when stack is misaligned. 2016-01-07 Uros Bizjak <ubizjak@gmail.com> Revert 2016-01-06 Uros Bizjak <ubizjak@gmail.com> PR target/69140 * config/i386/i386.c (ix86_expand_prologue): Declare fs.sp_valid depending on frame_pointer_needed before remaining integer and SSE registers are saved. From-SVN: r232140
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/i386/i386.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 9c3fa70..aac0847 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -10903,6 +10903,10 @@ ix86_frame_pointer_required (void)
if (TARGET_64BIT_MS_ABI && get_frame_size () > SEH_MAX_FRAME_SIZE)
return true;
+ /* SSE saves require frame-pointer when stack is misaligned. */
+ if (TARGET_64BIT_MS_ABI && ix86_incoming_stack_boundary < 128)
+ return true;
+
/* In ix86_option_override_internal, TARGET_OMIT_LEAF_FRAME_POINTER
turns off the frame pointer by default. Turn it back on now if
we've not got a leaf function. */
@@ -13065,8 +13069,6 @@ ix86_expand_prologue (void)
m->fs.fp_valid = true;
}
- m->fs.sp_valid = !frame_pointer_needed;
-
if (!int_registers_saved)
ix86_emit_save_regs_using_mov (frame.reg_save_offset);
if (!sse_registers_saved)