]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/42564 (unrecognizable insn with -O -fPIC)
authorEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 5 Jan 2010 22:34:01 +0000 (22:34 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 5 Jan 2010 22:34:01 +0000 (22:34 +0000)
PR target/42564
* config/sparc/sparc.h (SPARC_SYMBOL_REF_TLS_P): Delete.
* config/sparc/sparc-protos.h (legitimize_pic_address): Likewise.
(legitimize_tls_address): Likewise.
(sparc_tls_referenced_p): Likewise.
* config/sparc/sparc.c (sparc_expand_move): Use legitimize_tls_address
and adjust calls to legitimize_pic_address.
(legitimate_constant_p) Use sparc_tls_referenced_p.
(legitimate_pic_operand_p): Likewise.
(sparc_legitimate_address_p): Do not use SPARC_SYMBOL_REF_TLS_P.
(sparc_tls_symbol_ref_1): Delete.
(sparc_tls_referenced_p): Make static, recognize specific patterns.
(legitimize_tls_address): Make static, handle CONST patterns.
(legitimize_pic_address): Make static, remove unused parameter and
adjust recursive calls.
(sparc_legitimize_address): Make static, use sparc_tls_referenced_p
and adjust call to legitimize_pic_address.
(sparc_output_mi_thunk): Likewise.

From-SVN: r155664

gcc/ChangeLog
gcc/config/sparc/sparc-protos.h
gcc/config/sparc/sparc.c
gcc/config/sparc/sparc.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tls/opt-15.c [new file with mode: 0644]

index 19276b5100062884eb7021e933030afce003d36a..8f744def891096d5900ab8732178a1fbc138fe86 100644 (file)
@@ -1,3 +1,24 @@
+2010-01-05  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR target/42564
+       * config/sparc/sparc.h (SPARC_SYMBOL_REF_TLS_P): Delete.
+       * config/sparc/sparc-protos.h (legitimize_pic_address): Likewise.
+       (legitimize_tls_address): Likewise.
+       (sparc_tls_referenced_p): Likewise.
+       * config/sparc/sparc.c (sparc_expand_move): Use legitimize_tls_address
+       and adjust calls to legitimize_pic_address.
+       (legitimate_constant_p) Use sparc_tls_referenced_p.
+       (legitimate_pic_operand_p): Likewise.
+       (sparc_legitimate_address_p): Do not use SPARC_SYMBOL_REF_TLS_P.
+       (sparc_tls_symbol_ref_1): Delete.
+       (sparc_tls_referenced_p): Make static, recognize specific patterns.
+       (legitimize_tls_address): Make static, handle CONST patterns.
+       (legitimize_pic_address): Make static, remove unused parameter and
+       adjust recursive calls.
+       (sparc_legitimize_address): Make static, use sparc_tls_referenced_p
+       and adjust call to legitimize_pic_address.
+       (sparc_output_mi_thunk): Likewise.
+
 2010-01-02  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/42448
index 7c56925c01d05b626b3652dd85972040fa72bdf3..48d3263a446c687a2f3d125b9872eec7f6051133 100644 (file)
@@ -68,8 +68,6 @@ extern bool legitimate_constant_p (rtx);
 extern bool constant_address_p (rtx);
 extern bool legitimate_pic_operand_p (rtx);
 extern int legitimate_address_p (enum machine_mode, rtx, int);
-extern rtx legitimize_pic_address (rtx, enum machine_mode, rtx);
-extern rtx legitimize_tls_address (rtx);
 extern rtx legitimize_address (rtx, rtx, enum machine_mode);
 extern void sparc_emit_call_insn (rtx, rtx);
 extern void sparc_defer_case_vector (rtx, rtx, int);
@@ -101,7 +99,6 @@ extern int emit_move_sequence (rtx, enum machine_mode);
 extern int fp_sethi_p (rtx);
 extern int fp_mov_p (rtx);
 extern int fp_high_losum_p (rtx);
-extern bool sparc_tls_referenced_p (rtx);
 extern int mem_min_alignment (rtx, int);
 extern int pic_address_needs_scratch (rtx);
 extern int reg_unused_after (rtx, rtx);
index 4fc3cd21998aae468cda590373574bcb2856c90f..a5514cbc3ceada1424bf04b5a0d00c5c730fd061 100644 (file)
@@ -412,6 +412,9 @@ static bool sparc_strict_argument_naming (CUMULATIVE_ARGS *);
 static void sparc_va_start (tree, rtx);
 static tree sparc_gimplify_va_arg (tree, tree, tree *, tree *);
 static bool sparc_vector_mode_supported_p (enum machine_mode);
+static bool sparc_tls_referenced_p (rtx);
+static rtx legitimize_tls_address (rtx);
+static rtx legitimize_pic_address (rtx, rtx);
 static bool sparc_pass_by_reference (CUMULATIVE_ARGS *,
                                     enum machine_mode, const_tree, bool);
 static int sparc_arg_partial_bytes (CUMULATIVE_ARGS *,
@@ -986,34 +989,17 @@ sparc_expand_move (enum machine_mode mode, rtx *operands)
   /* Fixup TLS cases.  */
   if (TARGET_HAVE_TLS
       && CONSTANT_P (operands[1])
-      && GET_CODE (operands[1]) != HIGH
       && sparc_tls_referenced_p (operands [1]))
     {
-      rtx sym = operands[1];
-      rtx addend = NULL;
-
-      if (GET_CODE (sym) == CONST && GET_CODE (XEXP (sym, 0)) == PLUS)
-       {
-         addend = XEXP (XEXP (sym, 0), 1);
-         sym = XEXP (XEXP (sym, 0), 0);
-       }
-
-      gcc_assert (SPARC_SYMBOL_REF_TLS_P (sym));
-
-      sym = legitimize_tls_address (sym);
-      if (addend)
-       {
-         sym = gen_rtx_PLUS (mode, sym, addend);
-         sym = force_operand (sym, operands[0]);
-       }
-      operands[1] = sym;
+      operands[1] = legitimize_tls_address (operands[1]);
+      return false;
     }
+
   /* Fixup PIC cases.  */
   if (flag_pic && CONSTANT_P (operands[1]))
     {
       if (pic_address_needs_scratch (operands[1]))
-       operands[1] = legitimize_pic_address (operands[1], mode, 0);
+       operands[1] = legitimize_pic_address (operands[1], NULL_RTX);
 
       /* VxWorks does not impose a fixed gap between segments; the run-time
         gap can be different from the object-file gap.  We therefore can't
@@ -1041,10 +1027,8 @@ sparc_expand_move (enum machine_mode mode, rtx *operands)
       if (symbolic_operand (operands[1], mode))
        {
          operands[1] = legitimize_pic_address (operands[1],
-                                               mode,
-                                               (reload_in_progress ?
-                                                operands[0] :
-                                                NULL_RTX));
+                                               reload_in_progress
+                                               ? operands[0] : NULL_RTX);
          return false;
        }
     }
@@ -2846,23 +2830,11 @@ pic_address_needs_scratch (rtx x)
 bool
 legitimate_constant_p (rtx x)
 {
-  rtx inner;
-
   switch (GET_CODE (x))
     {
-    case SYMBOL_REF:
-      /* TLS symbols are not constant.  */
-      if (SYMBOL_REF_TLS_MODEL (x))
-       return false;
-      break;
-
     case CONST:
-      inner = XEXP (x, 0);
-
-      /* Offsets of TLS symbols are never valid.
-        Discourage CSE from creating them.  */
-      if (GET_CODE (inner) == PLUS
-         && SPARC_SYMBOL_REF_TLS_P (XEXP (inner, 0)))
+    case SYMBOL_REF:
+      if (sparc_tls_referenced_p (x))
        return false;
       break;
 
@@ -2929,10 +2901,7 @@ legitimate_pic_operand_p (rtx x)
 {
   if (pic_address_needs_scratch (x))
     return false;
-  if (SPARC_SYMBOL_REF_TLS_P (x)
-      || (GET_CODE (x) == CONST
-         && GET_CODE (XEXP (x, 0)) == PLUS
-         && SPARC_SYMBOL_REF_TLS_P (XEXP (XEXP (x, 0), 0))))
+  if (sparc_tls_referenced_p (x))
     return false;
   return true;
 }
@@ -2970,7 +2939,7 @@ legitimate_address_p (enum machine_mode mode, rtx addr, int strict)
           && GET_CODE (rs2) != SUBREG
           && GET_CODE (rs2) != LO_SUM
           && GET_CODE (rs2) != MEM
-          && ! SPARC_SYMBOL_REF_TLS_P (rs2)
+          && !(GET_CODE (rs2) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (rs2))
           && (! symbolic_operand (rs2, VOIDmode) || mode == Pmode)
           && (GET_CODE (rs2) != CONST_INT || SMALL_INT (rs2)))
          || ((REG_P (rs1)
@@ -3010,7 +2979,8 @@ legitimate_address_p (enum machine_mode mode, rtx addr, int strict)
          rs2 = NULL;
          imm1 = XEXP (rs1, 1);
          rs1 = XEXP (rs1, 0);
-         if (! CONSTANT_P (imm1) || SPARC_SYMBOL_REF_TLS_P (rs1))
+         if (!CONSTANT_P (imm1)
+             || (GET_CODE (rs1) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (rs1)))
            return 0;
        }
     }
@@ -3019,7 +2989,8 @@ legitimate_address_p (enum machine_mode mode, rtx addr, int strict)
       rs1 = XEXP (addr, 0);
       imm1 = XEXP (addr, 1);
 
-      if (! CONSTANT_P (imm1) || SPARC_SYMBOL_REF_TLS_P (rs1))
+      if (!CONSTANT_P (imm1)
+         || (GET_CODE (rs1) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (rs1)))
        return 0;
 
       /* We can't allow TFmode in 32-bit mode, because an offset greater
@@ -3095,29 +3066,28 @@ sparc_tls_got (void)
   return temp;
 }
 
-/* Return 1 if *X is a thread-local symbol.  */
+/* Return true if X contains a thread-local symbol.  */
 
-static int
-sparc_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
-{
-  return SPARC_SYMBOL_REF_TLS_P (*x);
-}
-
-/* Return 1 if X contains a thread-local symbol.  */
-
-bool
+static bool
 sparc_tls_referenced_p (rtx x)
 {
   if (!TARGET_HAVE_TLS)
     return false;
 
-  return for_each_rtx (&x, &sparc_tls_symbol_ref_1, 0);
+  if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS)
+    x = XEXP (XEXP (x, 0), 0);
+
+  if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x))
+    return true;
+
+  /* That's all we handle in legitimize_tls_address for now.  */
+  return false;
 }
 
 /* ADDR contains a thread-local SYMBOL_REF.  Generate code to compute
    this (thread-local) address.  */
 
-rtx
+static rtx
 legitimize_tls_address (rtx addr)
 {
   rtx temp1, temp2, temp3, ret, o0, got, insn;
@@ -3241,21 +3211,34 @@ legitimize_tls_address (rtx addr)
        gcc_unreachable ();
       }
 
+  else if (GET_CODE (addr) == CONST)
+    {
+      rtx base, offset;
+
+      gcc_assert (GET_CODE (XEXP (addr, 0)) == PLUS);
+
+      base = legitimize_tls_address (XEXP (XEXP (addr, 0), 0));
+      offset = XEXP (XEXP (addr, 0), 1);
+
+      base = force_operand (base, NULL_RTX);
+      if (!(GET_CODE (offset) == CONST_INT && SMALL_INT (offset)))
+       offset = force_reg (Pmode, offset);
+      ret = gen_rtx_PLUS (Pmode, base, offset);
+    }
+
   else
     gcc_unreachable ();  /* for now ... */
 
   return ret;
 }
 
-
 /* Legitimize PIC addresses.  If the address is already position-independent,
    we return ORIG.  Newly generated position-independent addresses go into a
    reg.  This is REG if nonzero, otherwise we allocate register(s) as
    necessary.  */
 
-rtx
-legitimize_pic_address (rtx orig, enum machine_mode mode ATTRIBUTE_UNUSED,
-                       rtx reg)
+static rtx
+legitimize_pic_address (rtx orig, rtx reg)
 {
   if (GET_CODE (orig) == SYMBOL_REF
       /* See the comment in sparc_expand_move.  */
@@ -3322,9 +3305,9 @@ legitimize_pic_address (rtx orig, enum machine_mode mode ATTRIBUTE_UNUSED,
        }
 
       gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
-      base = legitimize_pic_address (XEXP (XEXP (orig, 0), 0), Pmode, reg);
-      offset = legitimize_pic_address (XEXP (XEXP (orig, 0), 1), Pmode,
-                                      base == reg ? 0 : reg);
+      base = legitimize_pic_address (XEXP (XEXP (orig, 0), 0), reg);
+      offset = legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
+                                      base == reg ? NULL_RTX : reg);
 
       if (GET_CODE (offset) == CONST_INT)
        {
@@ -3376,10 +3359,10 @@ legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, enum machine_mode mode)
   if (x != orig_x && legitimate_address_p (mode, x, FALSE))
     return x;
 
-  if (SPARC_SYMBOL_REF_TLS_P (x))
+  if (sparc_tls_referenced_p (x))
     x = legitimize_tls_address (x);
   else if (flag_pic)
-    x = legitimize_pic_address (x, mode, 0);
+    x = legitimize_pic_address (x, NULL_RTX);
   else if (GET_CODE (x) == PLUS && CONSTANT_ADDRESS_P (XEXP (x, 1)))
     x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
                      copy_to_mode_reg (Pmode, XEXP (x, 1)));
@@ -3388,8 +3371,9 @@ legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, enum machine_mode mode)
                      copy_to_mode_reg (Pmode, XEXP (x, 0)));
   else if (GET_CODE (x) == SYMBOL_REF
           || GET_CODE (x) == CONST
-           || GET_CODE (x) == LABEL_REF)
+          || GET_CODE (x) == LABEL_REF)
     x = copy_to_suggested_reg (x, NULL_RTX, Pmode);
+
   return x;
 }
 
@@ -8762,7 +8746,7 @@ sparc_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
          /* Delay emitting the PIC helper function because it needs to
             change the section and we are emitting assembly code.  */
          load_pic_register (true);  /* clobbers %o7 */
-         scratch = legitimize_pic_address (funexp, Pmode, scratch);
+         scratch = legitimize_pic_address (funexp, scratch);
          seq = get_insns ();
          end_sequence ();
          emit_and_preserve (seq, spill_reg, spill_reg2);
index 8899437cb7839cb908a4c90a69e65fe40e8208c9..198fee57d845a5551723a19eff39c57d06b31a71 100644 (file)
@@ -2380,9 +2380,6 @@ extern int sparc_indent_opcode;
       }                                        \
   } while (0)
 
-#define SPARC_SYMBOL_REF_TLS_P(RTX) \
-  (GET_CODE (RTX) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (RTX) != 0)
-
 #define PRINT_OPERAND_PUNCT_VALID_P(CHAR) \
   ((CHAR) == '#' || (CHAR) == '*' || (CHAR) == '('             \
    || (CHAR) == ')' || (CHAR) == '_' || (CHAR) == '&')
index 71954430f73b99b5901b76d1a759c0f26892b56e..6bf2e72493af07d43ff16e0b3008d1bba24b40a8 100644 (file)
@@ -1,3 +1,7 @@
+2010-01-05  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc.dg/tls/opt-15.c: New test.
+
 2009-12-30  Ian Lance Taylor  <iant@google.com>
 
        PR middle-end/42099
        PR c++/30659
        * g++.dg/template/crash71.C: New.
 
-2007-10-28  Tobias Schlüter  <tobi@gcc.gnu.org>
+2007-10-28  Tobias Schlter  <tobi@gcc.gnu.org>
 
        PR fortran/32147
        * gfortran.dg/module_md5_1.f90: Update hash-value.
 
        * gfortran.dg/bounds_check_10.f90: Fix testcase.
 
-2007-10-13  Tobias Schlüter  <tobi@gcc.gnu.org>
+2007-10-13  Tobias Schlter  <tobi@gcc.gnu.org>
            Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/33254
        PR tree-optimization/33572
        * g++.dg/torture/pr33572.C: Replace with complete test.
 
-2007-10-08  Tobias Schlüter  <tobi@gcc.gnu.org>
+2007-10-08  Tobias Schlter  <tobi@gcc.gnu.org>
 
        PR fortran/33689
        * gfortran.dg/spec_expr_5.f90: New.
        PR libfortran/33683
        * gfortran.dg/gamma_5.f90:  New test case
 
-2007-10-07  Tobias Schlüter  <tobi@gcc.gnu.org>
+2007-10-07  Tobias Schlter  <tobi@gcc.gnu.org>
 
        PR fortran/20851
        * initialization_1.f90: Fix dg-error annotations.
        PR tree-optimization/33572
        * g++.dg/torture/pr33572.C: New.
 
-2007-10-06  Tobias Schlüter  <tobi@gcc.gnu.org>
+2007-10-06  Tobias Schlter  <tobi@gcc.gnu.org>
 
        PR fortran/25076
        * gfortran.dg/forall_11.f90: New.
        PR tree-optimization/33627
        * g++.dg/torture/pr33627.C: New testcase.
 
-2007-10-04  Tobias Schlüter  <tobi@gcc.gnu.org>
+2007-10-04  Tobias Schlter  <tobi@gcc.gnu.org>
 
        PR fortran/33626
        * gfortran.dg/parens_6.f90: New.
        * gfortran.dg/default_format_1.f90: XFAIL on ppc-darwin.
        * gfortran.dg/default_format_2.f90: XFAIL on ppc-darwin.
 
-2007-10-03  Tobias Schlüter  <tobi@gcc.gnu.org>
+2007-10-03  Tobias Schlter  <tobi@gcc.gnu.org>
 
        PR fortran/33198
        * gfortran.dg/common_errors_1.f90: New.
        * gcc.target/i386/sse5-convert.c: Fix target selector and rename to...
        * gcc.target/i386/pr33524.c: ...this.
 
-2007-09-28  Tobias Schlüter  <tobi@gcc.gnu.org>
+2007-09-28  Tobias Schlter  <tobi@gcc.gnu.org>
 
        PR fortran/33354
        * gfortran.dg/minmaxloc_4.f90: New.
        PR middle-end/7003
        * gcc.target/powerpc/gcse-1.c: New test.
 
-2007-09-27  Tobias Schlüter  <tobi@gcc.gnu.org>
+2007-09-27  Tobias Schlter  <tobi@gcc.gnu.org>
 
        * gfortran.dg/array_initializer_3.f90: Adapt error annotations for
        fixed capitalizations.
        PR c++/14688
        * g++.dg/inherit/override_attribs.C: New file.
 
-2007-09-23  Tobias Schlüter  <tobi@gcc.gnu.org>
+2007-09-23  Tobias Schlter  <tobi@gcc.gnu.org>
 
        PR fortran/33269
        * io.c (check_format_string): Move NULL and constant checks into
        * gcc.dg/sibcall-4.c: As for gcc.dg/sibcall-3.c.
        * gcc.dg/tree-ssa/ssa-fre-3.c: Require !mips64.
 
-2007-09-20  Tobias Schlüter  <tobi@gcc.gnu.org>
+2007-09-20  Tobias Schlter  <tobi@gcc.gnu.org>
 
        * gfortran.dg/g77/19981216-0.f: Remove dg-warning annotation.
        * gfortran.dg/io_constraints_1.f90: Make a -std=f95 test.  Add
        * gcc.target/cris/builtin_clz_v0.c: New testcase.
        * gcc.target/cris/builtin_clz_v3.c: New testcase.
 
-2007-09-02  Tobias Schlüuter  <tobi@gcc.gnu.org>
+2007-09-02  Tobias Schluter  <tobi@gcc.gnu.org>
 
        * gfortran.dg/substr_6.f90: New test.
 
        PR fortran/30814
        * gfortran.dg/pack_bounds_1.f90:  New test case.
 
-2007-07-23  Daniel Franke  <franke.daniel@gmail.com>
+2007-07-23 �Daniel Franke �<franke.daniel@gmail.com>
 
        PR fortran/31639
        * gfortran.dg/initialization_9.f90: New test.
        * gcc.target/m68k/interrupt_thread-2.c: Likewise.
        * gcc.target/m68k/interrupt_thread-3.c: Likewise.
 
-2007-07-12  Daniel Franke  <franke.daniel@gmail.com>
+2007-07-12 �Daniel Franke �<franke.daniel@gmail.com>
 
        PR fortran/31639
        * gfortran.dg/func_decl_4.f90: New test.
 
        * gcc.dg/tree-ssa/prefetch-6.c: New test.
 
-2007-05-29  Tobias Schlüter  <tobi@gcc.gnu.org>
+2007-05-29  Tobias Schlter  <tobi@gcc.gnu.org>
 
        * gfortran.dg/sizeof.f90: New.
 
        PR tree-optimization/31885
        * gcc.dg/tree-ssa/loop-29.c: New test.
 
-2007-05-10 Dominique d'Humières <dominiq@lps.ens.fr>
+2007-05-10 Dominique d'Humires <dominiq@lps.ens.fr>
 
        * assumed_dummy_1.f90: Fix dg directive.
        * char_initialiser_actual.f90: Likewise.
 
        * gcc.dg/cpp/_Pragma6.c: Skip on fido-*-* and m68k-*-*.
 
-2007-04-17  Tobias Schlüter  <tobi@gcc.gnu.org>
+2007-04-17  Tobias Schlter  <tobi@gcc.gnu.org>
 
        PR fortran/31144
        * gfortran.dg/module_naming_1.f90: New.
        PR fortran/31550
        * gfortran.dg/used_types_16.f90: New test.
 
-2007-04-13  Tobias Schlüter  <tobi@gcc.gnu.org>
+2007-04-13  Tobias Schlter  <tobi@gcc.gnu.org>
 
        PR fortran/18937
        * gfortran.dg/goto_2.f90: New.
        * gfortran.dg/c_by_val.c: Use GCC extensions instead of including
        <complex.h>.
 
-2007-04-12  Tobias Schlüter  <tobi@gcc.gnu.org>
+2007-04-12  Tobias Schlter  <tobi@gcc.gnu.org>
 
        PR fortran/31250
        * gfortran.dg/char_length_2.f90: New.
        PR fortran/31193
        * gfortran.dg/transfer_array_intrinsic_3.f90: New test.
 
-2007-03-22  Tobias Schlüter  <tobi@gcc.gnu.org>
+2007-03-22  Tobias Schlter  <tobi@gcc.gnu.org>
 
        PR fortran/20897
        * gfortran.dg/derived_name_1.f90: New.
        * gcc.target/ia64/builtin-popcount-1.c: New test case.
        * gcc.target/ia64/builtin-popcount-2.c: Likewise.
 
-2007-02-11  Tobias Schlüter  <tobi@gcc.gnu.org>
+2007-02-11  Tobias Schlter  <tobi@gcc.gnu.org>
 
        PR fortran/30478
        * gfortran.dg/enum_4.f90: Update error message checks.
        PR target/29248
        * gcc.dg/rs6000-leaf.c: New.
 
-2006-12-20  Tobias Schlüter  <tobias.schlueter@physik.uni-muenchen.de>
+2006-12-20  Tobias Schlter  <tobias.schlueter@physik.uni-muenchen.de>
 
        PR fortran/25392
        * gfortran.dg/f2c_8.f90: New test.
        * gcc.c-torture/compile/vector-2.c: New test.
        * gcc.c-torture/compile/vector-3.c: New test.
 
-2006-12-12  Tobias Schlüter  <tobias.schlueter@physik.uni-muenchen.de>
+2006-12-12  Tobias Schlter  <tobias.schlueter@physik.uni-muenchen.de>
 
        * lib/fortran-torture.exp: Update copyright years.  Remove
        obsolete comment.  Test -ftree-vectorize where it makes sense.
 
        * gnat.dg/string_slice.adb: New test.
 
-2006-07-01  Tobias Schlüter  <tobias.schlueter@physik.uni-muenchen.de>
+2006-07-01  Tobias Schlter  <tobias.schlueter@physik.uni-muenchen.de>
 
        PR fortran/19259
        * gfortran.dg/semicolon_fixed.c: New.
        PR tree-optimization/27409
        * gcc.dg/torture/pr27409.c: New testcase.
 
-2006-05-07  Tobias Schlüter  <tobias.schlueter@physik.uni-muenchen.de>
+2006-05-07  Tobias Schlter  <tobias.schlueter@physik.uni-muenchen.de>
 
        PR fortran/27457
        * gfortran.dg/select_6.f90: New.
        PR fortran/25045
        * optional_dim.f90: New test.
 
-2006-02-14  Tobias Schlüter  <tobias.schlueter@physik.uni-muenchen.de>
+2006-02-14  Tobias Schlter  <tobias.schlueter@physik.uni-muenchen.de>
 
        PR fortran/26277
        * gfortran.dg/label_4.f90: New.
 
        gfortran.dg/null_1.f90: New test.
 
-2006-02-10  Tobias Schlüter  <tobias.schlueter@physik.uni-muenchen.de>
+2006-02-10  Tobias Schlter  <tobias.schlueter@physik.uni-muenchen.de>
 
        PR fortran/14771
        * gfortran.dg/parens_4.f90: New.
 
        * gcc.dg/pr23372-1.c: Remove empty file.
 
-2006-02-09  Tobias Schlüter  <tobias.schlueter@physik.uni-muenchen.de>
+2006-02-09  Tobias Schlter  <tobias.schlueter@physik.uni-muenchen.de>
        Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/14771
        * gcc.dg/gomp/critical-3.c: Call cleanup-tree-dump.
        * gcc.dg/tree-ssa/pr23382.c: Ditto.
 
-2006-02-07  Tobias Schlüter  <tobias.schlueter@physik.uni-muenchen.de>
+2006-02-07  Tobias Schlter  <tobias.schlueter@physik.uni-muenchen.de>
 
        PR fortran/25577
        * gfortran.dg/mvbits_1.f90: New.
        * gcc.target/i386/20060125-1.c: New test case.
        * gcc.target/i386/20060125-2.c: New test case.
 
-2006-01-25  Tobias Schlüter  <tobias.schlueter@physik.uni-muenchen.de>
+2006-01-25  Tobias Schlter  <tobias.schlueter@physik.uni-muenchen.de>
 
        PR fortran/18540
        * gfortran.dg/goto_1.f: New.
diff --git a/gcc/testsuite/gcc.dg/tls/opt-15.c b/gcc/testsuite/gcc.dg/tls/opt-15.c
new file mode 100644 (file)
index 0000000..bebee8a
--- /dev/null
@@ -0,0 +1,24 @@
+/* PR target/42564 */
+/* This used to ICE on the SPARC because of an unrecognized TLS pattern.  */
+
+/* { dg-do compile } */
+/* { dg-options "-O -fPIC" } */
+/* { dg-require-effective-target tls_native } */
+/* { dg-require-effective-target fpic } */
+
+extern void *memset(void *s, int c, __SIZE_TYPE__ n);
+
+struct S1 { int i; };
+
+struct S2
+{
+  int ver;
+  struct S1 s;
+};
+
+static __thread struct S2 m;
+
+void init(void)
+{
+  memset(&m.s, 0, sizeof(m.s));
+}