From: Eric Botcazou Date: Tue, 5 Jan 2010 22:34:01 +0000 (+0000) Subject: re PR target/42564 (unrecognizable insn with -O -fPIC) X-Git-Tag: releases/gcc-4.3.5~233 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6900ef4222526f78c006b189881261b376ac0104;p=thirdparty%2Fgcc.git re PR target/42564 (unrecognizable insn with -O -fPIC) 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 19276b510006..8f744def8910 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,24 @@ +2010-01-05 Eric Botcazou + + 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 PR target/42448 diff --git a/gcc/config/sparc/sparc-protos.h b/gcc/config/sparc/sparc-protos.h index 7c56925c01d0..48d3263a446c 100644 --- a/gcc/config/sparc/sparc-protos.h +++ b/gcc/config/sparc/sparc-protos.h @@ -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); diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index 4fc3cd21998a..a5514cbc3cea 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -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); diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h index 8899437cb783..198fee57d845 100644 --- a/gcc/config/sparc/sparc.h +++ b/gcc/config/sparc/sparc.h @@ -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) == '&') diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 71954430f73b..6bf2e72493af 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-01-05 Eric Botcazou + + * gcc.dg/tls/opt-15.c: New test. + 2009-12-30 Ian Lance Taylor PR middle-end/42099 @@ -6647,7 +6651,7 @@ PR c++/30659 * g++.dg/template/crash71.C: New. -2007-10-28 Tobias Schlüter +2007-10-28 Tobias Schl�ter PR fortran/32147 * gfortran.dg/module_md5_1.f90: Update hash-value. @@ -7106,7 +7110,7 @@ * gfortran.dg/bounds_check_10.f90: Fix testcase. -2007-10-13 Tobias Schlüter +2007-10-13 Tobias Schl�ter Paul Thomas PR fortran/33254 @@ -7248,7 +7252,7 @@ PR tree-optimization/33572 * g++.dg/torture/pr33572.C: Replace with complete test. -2007-10-08 Tobias Schlüter +2007-10-08 Tobias Schl�ter PR fortran/33689 * gfortran.dg/spec_expr_5.f90: New. @@ -7280,7 +7284,7 @@ PR libfortran/33683 * gfortran.dg/gamma_5.f90: New test case -2007-10-07 Tobias Schlüter +2007-10-07 Tobias Schl�ter PR fortran/20851 * initialization_1.f90: Fix dg-error annotations. @@ -7317,7 +7321,7 @@ PR tree-optimization/33572 * g++.dg/torture/pr33572.C: New. -2007-10-06 Tobias Schlüter +2007-10-06 Tobias Schl�ter PR fortran/25076 * gfortran.dg/forall_11.f90: New. @@ -7377,7 +7381,7 @@ PR tree-optimization/33627 * g++.dg/torture/pr33627.C: New testcase. -2007-10-04 Tobias Schlüter +2007-10-04 Tobias Schl�ter PR fortran/33626 * gfortran.dg/parens_6.f90: New. @@ -7417,7 +7421,7 @@ * 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 +2007-10-03 Tobias Schl�ter PR fortran/33198 * gfortran.dg/common_errors_1.f90: New. @@ -7538,7 +7542,7 @@ * gcc.target/i386/sse5-convert.c: Fix target selector and rename to... * gcc.target/i386/pr33524.c: ...this. -2007-09-28 Tobias Schlüter +2007-09-28 Tobias Schl�ter PR fortran/33354 * gfortran.dg/minmaxloc_4.f90: New. @@ -7580,7 +7584,7 @@ PR middle-end/7003 * gcc.target/powerpc/gcse-1.c: New test. -2007-09-27 Tobias Schlüter +2007-09-27 Tobias Schl�ter * gfortran.dg/array_initializer_3.f90: Adapt error annotations for fixed capitalizations. @@ -7682,7 +7686,7 @@ PR c++/14688 * g++.dg/inherit/override_attribs.C: New file. -2007-09-23 Tobias Schlüter +2007-09-23 Tobias Schl�ter PR fortran/33269 * io.c (check_format_string): Move NULL and constant checks into @@ -8108,7 +8112,7 @@ * 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 +2007-09-20 Tobias Schl�ter * gfortran.dg/g77/19981216-0.f: Remove dg-warning annotation. * gfortran.dg/io_constraints_1.f90: Make a -std=f95 test. Add @@ -9280,7 +9284,7 @@ * gcc.target/cris/builtin_clz_v0.c: New testcase. * gcc.target/cris/builtin_clz_v3.c: New testcase. -2007-09-02 Tobias Schlüuter +2007-09-02 Tobias Schl�uter * gfortran.dg/substr_6.f90: New test. @@ -10944,7 +10948,7 @@ PR fortran/30814 * gfortran.dg/pack_bounds_1.f90: New test case. -2007-07-23  Daniel Franke   +2007-07-23 �Daniel Franke � PR fortran/31639 * gfortran.dg/initialization_9.f90: New test. @@ -11497,7 +11501,7 @@ * gcc.target/m68k/interrupt_thread-2.c: Likewise. * gcc.target/m68k/interrupt_thread-3.c: Likewise. -2007-07-12  Daniel Franke   +2007-07-12 �Daniel Franke � PR fortran/31639 * gfortran.dg/func_decl_4.f90: New test. @@ -13029,7 +13033,7 @@ * gcc.dg/tree-ssa/prefetch-6.c: New test. -2007-05-29 Tobias Schlüter +2007-05-29 Tobias Schl�ter * gfortran.dg/sizeof.f90: New. @@ -13862,7 +13866,7 @@ PR tree-optimization/31885 * gcc.dg/tree-ssa/loop-29.c: New test. -2007-05-10 Dominique d'Humières +2007-05-10 Dominique d'Humi�res * assumed_dummy_1.f90: Fix dg directive. * char_initialiser_actual.f90: Likewise. @@ -14536,7 +14540,7 @@ * gcc.dg/cpp/_Pragma6.c: Skip on fido-*-* and m68k-*-*. -2007-04-17 Tobias Schlüter +2007-04-17 Tobias Schl�ter PR fortran/31144 * gfortran.dg/module_naming_1.f90: New. @@ -14639,7 +14643,7 @@ PR fortran/31550 * gfortran.dg/used_types_16.f90: New test. -2007-04-13 Tobias Schlüter +2007-04-13 Tobias Schl�ter PR fortran/18937 * gfortran.dg/goto_2.f90: New. @@ -14669,7 +14673,7 @@ * gfortran.dg/c_by_val.c: Use GCC extensions instead of including . -2007-04-12 Tobias Schlüter +2007-04-12 Tobias Schl�ter PR fortran/31250 * gfortran.dg/char_length_2.f90: New. @@ -15237,7 +15241,7 @@ PR fortran/31193 * gfortran.dg/transfer_array_intrinsic_3.f90: New test. -2007-03-22 Tobias Schlüter +2007-03-22 Tobias Schl�ter PR fortran/20897 * gfortran.dg/derived_name_1.f90: New. @@ -16401,7 +16405,7 @@ * gcc.target/ia64/builtin-popcount-1.c: New test case. * gcc.target/ia64/builtin-popcount-2.c: Likewise. -2007-02-11 Tobias Schlüter +2007-02-11 Tobias Schl�ter PR fortran/30478 * gfortran.dg/enum_4.f90: Update error message checks. @@ -17655,7 +17659,7 @@ PR target/29248 * gcc.dg/rs6000-leaf.c: New. -2006-12-20 Tobias Schlüter +2006-12-20 Tobias Schl�ter PR fortran/25392 * gfortran.dg/f2c_8.f90: New test. @@ -17978,7 +17982,7 @@ * gcc.c-torture/compile/vector-2.c: New test. * gcc.c-torture/compile/vector-3.c: New test. -2006-12-12 Tobias Schlüter +2006-12-12 Tobias Schl�ter * lib/fortran-torture.exp: Update copyright years. Remove obsolete comment. Test -ftree-vectorize where it makes sense. @@ -21774,7 +21778,7 @@ * gnat.dg/string_slice.adb: New test. -2006-07-01 Tobias Schlüter +2006-07-01 Tobias Schl�ter PR fortran/19259 * gfortran.dg/semicolon_fixed.c: New. @@ -23053,7 +23057,7 @@ PR tree-optimization/27409 * gcc.dg/torture/pr27409.c: New testcase. -2006-05-07 Tobias Schlüter +2006-05-07 Tobias Schl�ter PR fortran/27457 * gfortran.dg/select_6.f90: New. @@ -24602,7 +24606,7 @@ PR fortran/25045 * optional_dim.f90: New test. -2006-02-14 Tobias Schlüter +2006-02-14 Tobias Schl�ter PR fortran/26277 * gfortran.dg/label_4.f90: New. @@ -24692,7 +24696,7 @@ gfortran.dg/null_1.f90: New test. -2006-02-10 Tobias Schlüter +2006-02-10 Tobias Schl�ter PR fortran/14771 * gfortran.dg/parens_4.f90: New. @@ -24702,7 +24706,7 @@ * gcc.dg/pr23372-1.c: Remove empty file. -2006-02-09 Tobias Schlüter +2006-02-09 Tobias Schl�ter Paul Thomas PR fortran/14771 @@ -24796,7 +24800,7 @@ * gcc.dg/gomp/critical-3.c: Call cleanup-tree-dump. * gcc.dg/tree-ssa/pr23382.c: Ditto. -2006-02-07 Tobias Schlüter +2006-02-07 Tobias Schl�ter PR fortran/25577 * gfortran.dg/mvbits_1.f90: New. @@ -25216,7 +25220,7 @@ * gcc.target/i386/20060125-1.c: New test case. * gcc.target/i386/20060125-2.c: New test case. -2006-01-25 Tobias Schlüter +2006-01-25 Tobias Schl�ter 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 index 000000000000..bebee8a499f5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tls/opt-15.c @@ -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)); +}