diff options
author | Kai Tietz <ktietz@redhat.com> | 2014-02-18 13:49:15 +0100 |
---|---|---|
committer | Kai Tietz <ktietz@gcc.gnu.org> | 2014-02-18 13:49:15 +0100 |
commit | 48810be0cd39f6c2c22de02727d2e8662da22ec9 (patch) | |
tree | c73880076e7a6e6444abb4f5b9f59bb4d681f502 | |
parent | 2c9f8c0afa20c14e19ecb3dc760bc4cdfe1ee66e (diff) | |
download | gcc-48810be0cd39f6c2c22de02727d2e8662da22ec9.zip gcc-48810be0cd39f6c2c22de02727d2e8662da22ec9.tar.gz gcc-48810be0cd39f6c2c22de02727d2e8662da22ec9.tar.bz2 |
re PR target/60193 (ICE on big nested frame)
2014-02-18 Kai Tietz <ktietz@redhat.com>
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 <ktietz@redhat.com>
PR target/60193
* gcc.target/i386/nest-1.c: New testcase.
From-SVN: r207844
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/nest-1.c | 14 |
4 files changed, 30 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5266500..2c99044 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-02-18 Kai Tietz <ktietz@redhat.com> + + 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 <ebotcazou@adacore.com> * 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 0a15e44..8433fad 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 65c70b5..337472e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-02-18 Kai Tietz <ktietz@redhat.com> + + PR target/60193 + * gcc.target/i386/nest-1.c: New testcase. + 2014-02-18 Eric Botcazou <ebotcazou@adacore.com> * 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 0000000..ba75350 --- /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 (); +} + |