From patchwork Thu Aug 5 18:30:10 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [6/9] Emit the prologue/epilogue using frame offsets. Date: Thu, 05 Aug 2010 08:30:10 -0000 From: "H.J. Lu" X-Patchwork-Id: 61012 Message-Id: To: Richard Henderson Cc: gcc-patches@gcc.gnu.org, kai.tietz@onevision.com, ubizjak@gmail.com On Thu, Aug 5, 2010 at 11:26 AM, Richard Henderson wrote: > On 08/05/2010 11:19 AM, H.J. Lu wrote: >> It is interesting. I saw it on 32bit host with 32bit HOST_WIDE_INT. Is it >> a signed vs. unsigned issue? stack_alignment_needed is unsigned. > > Yes, signed is the issue.  Previously we'd have > >  -stack_alignment_needed / 8 >  -256u / 8 >  0xffffff00u / 8 >  0x1fffffe0u > > If you receive a memory layout such that the stack is <= 0x1fffffff, > the program will happen to work.  With the cast we get -32 and not > a large unsigned number, which is what we really wanted. > I think this patch is clearer and also fixes the issue. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index d809d44..ecccef1 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -8639,7 +8639,8 @@ ix86_emit_save_reg_using_mov (enum machine_mode mode, unsi gned int regno, reference to the locations within the frame. Instead, simply compute the location of the aligned frame from the frame pointer. */ - addr = GEN_INT (-crtl->stack_alignment_needed / BITS_PER_UNIT); + addr = GEN_INT (-(crtl->stack_alignment_needed + / BITS_PER_UNIT)); addr = gen_rtx_AND (Pmode, hard_frame_pointer_rtx, addr); addr = plus_constant (addr, -cfa_offset);