This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/37010] -Os passes __m128 on stack with wrong alignment
- From: "hjl dot tools at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 3 Aug 2008 18:40:35 -0000
- Subject: [Bug target/37010] -Os passes __m128 on stack with wrong alignment
- References: <bug-37010-682@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #3 from hjl dot tools at gmail dot com 2008-08-03 18:40 -------
Joey, when we compute frame layout, we don't count the duplicated
return address pushed onto stack when DRAP is used. Also when we
push return address, shouldn't we use -UNITS_PER_WORD, instead of
-(STACK_BOUNDARY / BITS_PER_UNIT))? On MacOS, STACK_BOUNDARY is
128 on ia32. Does this patch make sense?
--- ./i386.c.drap 2008-08-03 09:50:05.000000000 -0700
+++ ./i386.c 2008-08-03 11:36:40.000000000 -0700
@@ -7291,6 +7291,10 @@ ix86_compute_frame_layout (struct ix86_f
if (stack_realign_fp)
offset = (offset + stack_alignment_needed -1) & -stack_alignment_needed;
+ /* Duplicated return address when DRAP is used. */
+ if (crtl->drap_reg && crtl->stack_realign_needed)
+ offset += UNITS_PER_WORD;
+
/* Register save area */
offset += frame->nregs * UNITS_PER_WORD;
@@ -7692,8 +7696,7 @@ ix86_expand_prologue (void)
expand_builtin_return_addr etc. */
x = crtl->drap_reg;
x = gen_frame_mem (Pmode,
- plus_constant (x,
- -(STACK_BOUNDARY / BITS_PER_UNIT)));
+ plus_constant (x, -UNITS_PER_WORD));
insn = emit_insn (gen_push (x));
RTX_FRAME_RELATED_P (insn) = 1;
}
--
hjl dot tools at gmail dot com changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |hubicka at ucw dot cz
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37010