From 3cb4b8e201bbdc2105b79eb5995ddd5e6c88c56b Mon Sep 17 00:00:00 2001 From: uros Date: Fri, 7 Dec 2012 08:10:37 +0000 Subject: [PATCH 1/1] Backport from mainline 2012-12-06 Uros Bizjak H.J. Lu PR target/55597 * config/i386/i386.c (legitimize_tls_address): Zero-extend x to Pmode, before using it as insn or call equivalent. testsuite/ChangeLog: Backport from mainline 2012-12-06 Uros Bizjak PR target/55597 * gcc.target/i386/pr55597.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@194292 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 10 ++++++++++ gcc/config/i386/i386.c | 15 +++++++++++++-- gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/gcc.target/i386/pr55597.c | 18 ++++++++++++++++++ 4 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr55597.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fa5cfa8e9ca..e82853d8e12 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2012-12-07 Uros Bizjak + + Backport from mainline + 2012-12-06 Uros Bizjak + H.J. Lu + + PR target/55597 + * config/i386/i386.c (legitimize_tls_address): Zero-extend x to Pmode, + before using it as insn or call equivalent. + 2012-12-06 Jason Merrill PR c++/55032 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index d89adae3447..eddbfb5b190 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -12675,6 +12675,9 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov) tp = get_thread_pointer (true); dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, tp, dest)); + if (GET_MODE (x) != Pmode) + x = gen_rtx_ZERO_EXTEND (Pmode, x); + set_unique_reg_note (get_last_insn (), REG_EQUAL, x); } else @@ -12683,13 +12686,17 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov) if (TARGET_64BIT) { - rtx rax = gen_rtx_REG (Pmode, AX_REG), insns; + rtx rax = gen_rtx_REG (Pmode, AX_REG); + rtx insns; start_sequence (); emit_call_insn (gen_tls_global_dynamic_64 (rax, x, caddr)); insns = get_insns (); end_sequence (); + if (GET_MODE (x) != Pmode) + x = gen_rtx_ZERO_EXTEND (Pmode, x); + RTL_CONST_CALL_P (insns) = 1; emit_libcall_block (insns, dest, rax, x); } @@ -12731,7 +12738,8 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov) if (TARGET_64BIT) { - rtx rax = gen_rtx_REG (Pmode, AX_REG), insns, eqv; + rtx rax = gen_rtx_REG (Pmode, AX_REG); + rtx insns, eqv; start_sequence (); emit_call_insn (gen_tls_local_dynamic_base_64 (rax, caddr)); @@ -12759,6 +12767,9 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov) { dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, dest, tp)); + if (GET_MODE (x) != Pmode) + x = gen_rtx_ZERO_EXTEND (Pmode, x); + set_unique_reg_note (get_last_insn (), REG_EQUAL, x); } break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index feed2684d8f..b418676aef1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2012-12-07 Uros Bizjak + + Backport from mainline + 2012-12-06 Uros Bizjak + + PR target/55597 + * gcc.target/i386/pr55597.c: New test. + 2012-12-03 Richard Biener Backport from mainline diff --git a/gcc/testsuite/gcc.target/i386/pr55597.c b/gcc/testsuite/gcc.target/i386/pr55597.c new file mode 100644 index 00000000000..cafe194c1b4 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr55597.c @@ -0,0 +1,18 @@ +/* { dg-do compile { target { ! { ia32 } } } } */ +/* { dg-require-effective-target fpic } */ +/* { dg-options "-O2 -fPIC -mx32" } */ + +struct initial_sp +{ + void *sp; + int mask; +}; + +__thread struct initial_sp __morestack_initial_sp; + +void foo (int *); + +void __morestack_release_segments (void) +{ + foo (&__morestack_initial_sp.mask); +} -- 2.11.0