aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Tietz <ktietz@redhat.com>2014-02-18 13:49:15 +0100
committerKai Tietz <ktietz@gcc.gnu.org>2014-02-18 13:49:15 +0100
commit48810be0cd39f6c2c22de02727d2e8662da22ec9 (patch)
treec73880076e7a6e6444abb4f5b9f59bb4d681f502
parent2c9f8c0afa20c14e19ecb3dc760bc4cdfe1ee66e (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/config/i386/i386.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/nest-1.c14
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 ();
+}
+