OSDN Git Service

Backport from mainline
authoruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 7 Dec 2012 08:10:37 +0000 (08:10 +0000)
committeruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 7 Dec 2012 08:10:37 +0000 (08:10 +0000)
2012-12-06  Uros Bizjak  <ubizjak@gmail.com>
    H.J. Lu  <hongjiu.lu@intel.com>

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  <ubizjak@gmail.com>

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
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr55597.c [new file with mode: 0644]

index fa5cfa8..e82853d 100644 (file)
@@ -1,3 +1,13 @@
+2012-12-07  Uros Bizjak  <ubizjak@gmail.com>
+
+       Backport from mainline
+       2012-12-06  Uros Bizjak  <ubizjak@gmail.com>
+                   H.J. Lu  <hongjiu.lu@intel.com>
+
+       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  <jason@redhat.com>
 
        PR c++/55032
index d89adae..eddbfb5 100644 (file)
@@ -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;
index feed268..b418676 100644 (file)
@@ -1,3 +1,11 @@
+2012-12-07  Uros Bizjak  <ubizjak@gmail.com>
+
+       Backport from mainline
+       2012-12-06  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/55597
+       * gcc.target/i386/pr55597.c: New test.
+
 2012-12-03  Richard Biener  <rguenther@suse.de>
 
        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 (file)
index 0000000..cafe194
--- /dev/null
@@ -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);
+}