From patchwork Fri Nov 9 09:04:36 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [x86] Fix ICE with -fstack-check on Linux Date: Thu, 08 Nov 2012 23:04:36 -0000 From: Eric Botcazou X-Patchwork-Id: 197996 Message-Id: <4424229.JXHDEqDEIv@polaris> To: gcc-patches@gcc.gnu.org This is a regression present on the mainline and 4.7 branch. The compiler ICEs on the attached Ada testcase at -O -fstack-check in ix86_expand_prologue: gcc_assert (m->fs.sp_offset == frame.stack_pointer_offset); The problem is that release_scratch_register_on_entry uses a POP instruction but doesn't update cfun->machine accordingly. Tested on x86_64-suse-linux, applied on mainline and 4.7 branch as obvious. 2012-11-09 Eric Botcazou * config/i386/i386.c (release_scratch_register_on_entry): Also adjust sp_offset manually. 2012-11-09 Eric Botcazou * gnat.dg/stack_check3.ad[sb]: New test. Index: config/i386/i386.c =================================================================== --- config/i386/i386.c (revision 193322) +++ config/i386/i386.c (working copy) @@ -9462,6 +9462,7 @@ release_scratch_register_on_entry (struc { if (sr->saved) { + struct machine_function *m = cfun->machine; rtx x, insn = emit_insn (gen_pop (sr->reg)); /* The RTX_FRAME_RELATED_P mechanism doesn't know about pop. */ @@ -9469,6 +9470,7 @@ release_scratch_register_on_entry (struc x = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (UNITS_PER_WORD)); x = gen_rtx_SET (VOIDmode, stack_pointer_rtx, x); add_reg_note (insn, REG_FRAME_RELATED_EXPR, x); + m->fs.sp_offset -= UNITS_PER_WORD; } }