From 48810be0cd39f6c2c22de02727d2e8662da22ec9 Mon Sep 17 00:00:00 2001 From: Kai Tietz Date: Tue, 18 Feb 2014 13:49:15 +0100 Subject: [PATCH] re PR target/60193 (ICE on big nested frame) 2014-02-18 Kai Tietz PR target/60193 * config/i386/i386.c (ix86_expand_prologue): Use rax register as displacement for restoring %r10, %rax. Additional fix wrong offset for restoring both-registers. 2014-02-18 Kai Tietz PR target/60193 * gcc.target/i386/nest-1.c: New testcase. From-SVN: r207844 --- gcc/ChangeLog | 7 +++++++ gcc/config/i386/i386.c | 10 ++++------ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.target/i386/nest-1.c | 14 ++++++++++++++ 4 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/nest-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 52665008d69d..2c99044ae35c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-02-18 Kai Tietz + + PR target/60193 + * config/i386/i386.c (ix86_expand_prologue): Use + rax register as displacement for restoring %r10, %rax. + Additional fix wrong offset for restoring both-registers. + 2014-02-18 Eric Botcazou * ipa-prop.c (compute_complex_ancestor_jump_func): Replace overzealous diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 0a15e442bef1..8433fad65aee 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -11023,13 +11023,12 @@ ix86_expand_prologue (void) rtx r10 = NULL; rtx (*adjust_stack_insn)(rtx, rtx, rtx); const bool sp_is_cfa_reg = (m->fs.cfa_reg == stack_pointer_rtx); - bool eax_live = false; + bool eax_live = ix86_eax_live_at_start_p (); bool r10_live = false; if (TARGET_64BIT) r10_live = (DECL_STATIC_CHAIN (current_function_decl) != 0); - eax_live = ix86_eax_live_at_start_p (); if (eax_live) { insn = emit_insn (gen_push (eax)); @@ -11084,17 +11083,16 @@ ix86_expand_prologue (void) works for realigned stack, too. */ if (r10_live && eax_live) { - t = plus_constant (Pmode, stack_pointer_rtx, allocate); + t = gen_rtx_PLUS (Pmode, stack_pointer_rtx, eax); emit_move_insn (gen_rtx_REG (word_mode, R10_REG), gen_frame_mem (word_mode, t)); - t = plus_constant (Pmode, stack_pointer_rtx, - allocate - UNITS_PER_WORD); + t = plus_constant (Pmode, t, UNITS_PER_WORD); emit_move_insn (gen_rtx_REG (word_mode, AX_REG), gen_frame_mem (word_mode, t)); } else if (eax_live || r10_live) { - t = plus_constant (Pmode, stack_pointer_rtx, allocate); + t = gen_rtx_PLUS (Pmode, stack_pointer_rtx, eax); emit_move_insn (gen_rtx_REG (word_mode, (eax_live ? AX_REG : R10_REG)), gen_frame_mem (word_mode, t)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 65c70b5287aa..337472ee37a1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-02-18 Kai Tietz + + PR target/60193 + * gcc.target/i386/nest-1.c: New testcase. + 2014-02-18 Eric Botcazou * gnat.dg/opt32.adb: New test. diff --git a/gcc/testsuite/gcc.target/i386/nest-1.c b/gcc/testsuite/gcc.target/i386/nest-1.c new file mode 100644 index 000000000000..ba75350fb0bc --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/nest-1.c @@ -0,0 +1,14 @@ +/* { dg-do compile { target llp64 } } */ +/* { dg-options "" } */ + +void foo (int i) +{ + void nested (void) + { + char arr[(1U << 31) + 4U]; + arr[i] = 0; + } + + nested (); +} + -- 2.47.3