From patchwork Fri Jun 7 19:25:40 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 249799 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "localhost", Issuer "www.qmailtoaster.com" (not verified)) by ozlabs.org (Postfix) with ESMTPS id B84492C00A7 for ; Sat, 8 Jun 2013 05:26:26 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:reply-to:mime-version :content-type; q=dns; s=default; b=aTm4VcX31EeqyUeFiD68sYqB1F+x8 TNjyH4bG1rTIjSJ3oCHjcxZVw65RIomUe2DjZX4wOzPUhC4TQVdmPcD3rOdBqGyV s+sRPMdcmcu7KLNKu08mggLD0TK0rTNv67r2fYLKZfntwvCKPne34w/no930KfFs w4S3KU2EQ90oMw= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:reply-to:mime-version :content-type; s=default; bh=nPn2tmRzN1GDrearLLTIaoXXdeo=; b=OQv H9kJkZ92JeAihFU3DkfjwNVVVfagtsoCzSKOUtPmuu5UAgNkm/Z2cy4sjZer26s0 fujGFHex0YCWs5d3LMZIzH7UdBDqdBktCbTwp4ZuzHhiWVzqHkdtKUyNHRhEGAND BMpBhDJpGhfpYOWhVSaGErVVrfdUf/T1lff/UgR0= Received: (qmail 14281 invoked by alias); 7 Jun 2013 19:26:19 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 14257 invoked by uid 89); 7 Jun 2013 19:26:18 -0000 X-Spam-SWARE-Status: No, score=-5.8 required=5.0 tests=AWL, BAYES_00, KAM_STOCKGEN, RCVD_IN_HOSTKARMA_W, RCVD_IN_HOSTKARMA_WL, RP_MATCHES_RCVD, SPF_HELO_PASS, SPF_PASS, TW_AV autolearn=no version=3.3.1 Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Fri, 07 Jun 2013 19:25:49 +0000 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r57JPlrj015162 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 7 Jun 2013 15:25:47 -0400 Received: from zalov.cz (vpn-52-245.rdu2.redhat.com [10.10.52.245]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r57JPjrV002756 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 7 Jun 2013 15:25:47 -0400 Received: from zalov.cz (localhost [127.0.0.1]) by zalov.cz (8.14.5/8.14.5) with ESMTP id r57JPhRj020448; Fri, 7 Jun 2013 21:25:44 +0200 Received: (from jakub@localhost) by zalov.cz (8.14.5/8.14.5/Submit) id r57JPfBI020447; Fri, 7 Jun 2013 21:25:41 +0200 Date: Fri, 7 Jun 2013 21:25:40 +0200 From: Jakub Jelinek To: Richard Biener , Jan Hubicka , Richard Henderson Cc: gcc-patches@gcc.gnu.org Subject: [PATCH] DATA_ALIGNMENT vs. DATA_ABI_ALIGNMENT (PR target/56564) Message-ID: <20130607192540.GH1493@tucnak.redhat.com> Reply-To: Jakub Jelinek MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) Hi! This PR is about DATA_ALIGNMENT macro increasing alignment of some decls for optimization purposes beyond ABI mandated levels. It is fine to emit the vars aligned as much as we want for optimization purposes, but if we can't be sure that references to that decl bind to the definition we increased the alignment on (e.g. common variables, or -fpic code without hidden visibility, weak vars etc.), we can't assume that alignment. As DECL_ALIGN is used for both the alignment emitted for the definitions and alignment assumed on code referring to it, this patch increases DECL_ALIGN only on decls where decl_binds_to_current_def_p is true, and otherwise the optimization part on top of that emits only when aligning definition. On x86_64, DATA_ALIGNMENT macro was partly an optimization, partly ABI mandated alignment increase, so I've introduced a new macro, DATA_ABI_ALIGNMENT, which is the ABI mandated increase only (on x86-64 I think the only one is that arrays with size 16 bytes or more (and VLAs, but that is not handled by DATA*ALIGNMENT) are at least 16 byte aligned). Bootstrapped/regtested on x86_64-linux and i686-linux. No idea about other targets, I've kept them all using DATA_ALIGNMENT, which is considered optimization increase only now, if there is some ABI mandated alignment increase on other targets, that should be done in DATA_ABI_ALIGNMENT as well as DATA_ALIGNMENT. The patch causes some vectorization regressions (tweaked in the testsuite), especially for common vars where we used to align say common arrays to 256 bits rather than the ABI mandated 128 bits, or for -fpic code, but I'm afraid we need to live with that, if you compile another file with say icc or some other compiler which doesn't increase alignment beyond ABI mandated level and that other file defines the var say as non-common, we have wrong-code. 2013-06-07 Jakub Jelinek PR target/56564 * varasm.c (align_variable): Don't use DATA_ALIGNMENT or CONSTANT_ALIGNMENT if !decl_binds_to_current_def_p (decl). Use DATA_ABI_ALIGNMENT for that case instead if defined. (get_variable_align): New function. (get_variable_section, emit_bss, emit_common, assemble_variable_contents, place_block_symbol): Use get_variable_align instead of DECL_ALIGN. (assemble_noswitch_variable): Add align argument, use it instead of DECL_ALIGN. (assemble_variable): Adjust caller. Use get_variable_align instead of DECL_ALIGN. * config/i386/i386.h (DATA_ALIGNMENT): Adjust x86_data_alignment caller. (DATA_ABI_ALIGNMENT): Define. * config/i386/i386-protos.h (x86_data_alignment): Adjust prototype. * config/i386/i386.c (x86_data_alignment): Add opt argument. If opt is false, only return the psABI mandated alignment increase. * doc/tm.texi.in (DATA_ABI_ALIGNMENT): Document. * doc/tm.texi: Regenerated. * gcc.target/i386/pr56564-1.c: New test. * gcc.target/i386/pr56564-2.c: New test. * gcc.target/i386/pr56564-3.c: New test. * gcc.target/i386/pr56564-4.c: New test. * gcc.target/i386/avx256-unaligned-load-4.c: Add -fno-common. * gcc.target/i386/avx256-unaligned-store-1.c: Likewise. * gcc.target/i386/avx256-unaligned-store-3.c: Likewise. * gcc.target/i386/avx256-unaligned-store-4.c: Likewise. * gcc.target/i386/vect-sizes-1.c: Likewise. * gcc.target/i386/memcpy-1.c: Likewise. * gcc.dg/vect/costmodel/i386/costmodel-vect-31.c (tmp): Initialize. * gcc.dg/vect/costmodel/x86_64/costmodel-vect-31.c (tmp): Likewise. Jakub --- gcc/varasm.c.jj 2013-06-07 13:17:17.000000000 +0200 +++ gcc/varasm.c 2013-06-07 15:38:36.710908852 +0200 @@ -966,8 +966,12 @@ align_variable (tree decl, bool dont_out align = MAX_OFILE_ALIGNMENT; } - /* On some machines, it is good to increase alignment sometimes. */ - if (! DECL_USER_ALIGN (decl)) + /* On some machines, it is good to increase alignment sometimes. + But as DECL_ALIGN is used both for actually emitting the variable + and for code accessing the variable as guaranteed alignment, we + can only increase the alignment if it is a performance optimization + if the references to it must bind to the current definition. */ + if (! DECL_USER_ALIGN (decl) && decl_binds_to_current_def_p (decl)) { #ifdef DATA_ALIGNMENT unsigned int data_align = DATA_ALIGNMENT (TREE_TYPE (decl), align); @@ -988,12 +992,69 @@ align_variable (tree decl, bool dont_out } #endif } +#ifdef DATA_ABI_ALIGNMENT + else if (! DECL_USER_ALIGN (decl)) + { + unsigned int data_align = DATA_ABI_ALIGNMENT (TREE_TYPE (decl), align); + /* For backwards compatibility, don't assume the ABI alignment for + TLS variables. */ + if (! DECL_THREAD_LOCAL_P (decl) || data_align <= BITS_PER_WORD) + align = data_align; + } +#endif /* Reset the alignment in case we have made it tighter, so we can benefit from it in get_pointer_alignment. */ DECL_ALIGN (decl) = align; } +/* Return DECL_ALIGN (decl), possibly increased for optimization purposes + beyond what align_variable returned. */ + +static unsigned int +get_variable_align (tree decl) +{ + unsigned int align = DECL_ALIGN (decl); + + /* For user aligned vars or static vars align_variable already did + everything. */ + if (DECL_USER_ALIGN (decl) || !TREE_PUBLIC (decl)) + return align; + + /* For decls that bind to the current definition, align_variable + did also everything, except for not assuming ABI required alignment + of TLS variables. For other vars, increase the alignment here + as an optimization. */ + if (!decl_binds_to_current_def_p (decl)) + { + /* On some machines, it is good to increase alignment sometimes. */ +#ifdef DATA_ALIGNMENT + unsigned int data_align = DATA_ALIGNMENT (TREE_TYPE (decl), align); + /* Don't increase alignment too much for TLS variables - TLS space + is too precious. */ + if (! DECL_THREAD_LOCAL_P (decl) || data_align <= BITS_PER_WORD) + align = data_align; +#endif +#ifdef CONSTANT_ALIGNMENT + if (DECL_INITIAL (decl) != 0 && DECL_INITIAL (decl) != error_mark_node) + { + unsigned int const_align = CONSTANT_ALIGNMENT (DECL_INITIAL (decl), + align); + /* Don't increase alignment too much for TLS variables - TLS space + is too precious. */ + if (! DECL_THREAD_LOCAL_P (decl) || const_align <= BITS_PER_WORD) + align = const_align; + } + } +#endif + +#ifdef DATA_ABI_ALIGNMENT + if (DECL_THREAD_LOCAL_P (decl)) + return DATA_ABI_ALIGNMENT (TREE_TYPE (decl), align); +#endif + return align; +} + /* Return the section into which the given VAR_DECL or CONST_DECL should be placed. PREFER_NOSWITCH_P is true if a noswitch section should be used wherever possible. */ @@ -1043,7 +1104,8 @@ get_variable_section (tree decl, bool pr return bss_noswitch_section; } - return targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl)); + return targetm.asm_out.select_section (decl, reloc, + get_variable_align (decl)); } /* Return the block into which object_block DECL should be placed. */ @@ -1780,7 +1842,8 @@ emit_bss (tree decl ATTRIBUTE_UNUSED, unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED) { #if defined ASM_OUTPUT_ALIGNED_BSS - ASM_OUTPUT_ALIGNED_BSS (asm_out_file, decl, name, size, DECL_ALIGN (decl)); + ASM_OUTPUT_ALIGNED_BSS (asm_out_file, decl, name, size, + get_variable_align (decl)); return true; #endif } @@ -1796,10 +1859,11 @@ emit_common (tree decl ATTRIBUTE_UNUSED, { #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, decl, name, - size, DECL_ALIGN (decl)); + size, get_variable_align (decl)); return true; #elif defined ASM_OUTPUT_ALIGNED_COMMON - ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, name, size, DECL_ALIGN (decl)); + ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, name, size, + get_variable_align (decl)); return true; #else ASM_OUTPUT_COMMON (asm_out_file, name, size, rounded); @@ -1828,7 +1892,8 @@ emit_tls_common (tree decl ATTRIBUTE_UNU NAME is the name of DECL's SYMBOL_REF. */ static void -assemble_noswitch_variable (tree decl, const char *name, section *sect) +assemble_noswitch_variable (tree decl, const char *name, section *sect, + unsigned int align) { unsigned HOST_WIDE_INT size, rounded; @@ -1850,7 +1915,7 @@ assemble_noswitch_variable (tree decl, c * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); if (!sect->noswitch.callback (decl, name, size, rounded) - && (unsigned HOST_WIDE_INT) DECL_ALIGN_UNIT (decl) > rounded) + && (unsigned HOST_WIDE_INT) (align / BITS_PER_UNIT) > rounded) warning (0, "requested alignment for %q+D is greater than " "implemented alignment of %wu", decl, rounded); } @@ -1880,7 +1945,7 @@ assemble_variable_contents (tree decl, c /* Output the actual data. */ output_constant (DECL_INITIAL (decl), tree_low_cst (DECL_SIZE_UNIT (decl), 1), - DECL_ALIGN (decl)); + get_variable_align (decl)); else /* Leave space for it. */ assemble_zeros (tree_low_cst (DECL_SIZE_UNIT (decl), 1)); @@ -1904,6 +1969,7 @@ assemble_variable (tree decl, int top_le const char *name; rtx decl_rtl, symbol; section *sect; + unsigned int align; bool asan_protected = false; /* This function is supposed to handle VARIABLES. Ensure we have one. */ @@ -2003,6 +2069,8 @@ assemble_variable (tree decl, int top_le set_mem_align (decl_rtl, DECL_ALIGN (decl)); + align = get_variable_align (decl); + if (TREE_PUBLIC (decl)) maybe_assemble_visibility (decl); @@ -2032,12 +2100,12 @@ assemble_variable (tree decl, int top_le place_block_symbol (symbol); } else if (SECTION_STYLE (sect) == SECTION_NOSWITCH) - assemble_noswitch_variable (decl, name, sect); + assemble_noswitch_variable (decl, name, sect, align); else { switch_to_section (sect); - if (DECL_ALIGN (decl) > BITS_PER_UNIT) - ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (DECL_ALIGN_UNIT (decl))); + if (align > BITS_PER_UNIT) + ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT)); assemble_variable_contents (decl, name, dont_output_data); if (asan_protected) { @@ -6967,7 +7035,7 @@ place_block_symbol (rtx symbol) else { decl = SYMBOL_REF_DECL (symbol); - alignment = DECL_ALIGN (decl); + alignment = get_variable_align (decl); size = tree_low_cst (DECL_SIZE_UNIT (decl), 1); if (flag_asan && asan_protect_global (decl)) { --- gcc/config/i386/i386.h.jj 2013-06-03 19:15:34.000000000 +0200 +++ gcc/config/i386/i386.h 2013-06-07 14:48:36.430589051 +0200 @@ -859,7 +859,19 @@ enum target_cpu_default cause character arrays to be word-aligned so that `strcpy' calls that copy constants to character arrays can be done inline. */ -#define DATA_ALIGNMENT(TYPE, ALIGN) ix86_data_alignment ((TYPE), (ALIGN)) +#define DATA_ALIGNMENT(TYPE, ALIGN) \ + ix86_data_alignment ((TYPE), (ALIGN), true) + +/* Similar to DATA_ALIGNMENT, but for the cases where the ABI mandates + some alignment increase, instead of optimization only purposes. E.g. + AMD x86-64 psABI says that variables with array type larger than 15 bytes + must be aligned to 16 byte boundaries. DATA_ALIGNMENT should always + return the same or larger value than DATA_ABI_ALIGNMENT. + + If this macro is not defined, then ALIGN is used. */ + +#define DATA_ABI_ALIGNMENT(TYPE, ALIGN) \ + ix86_data_alignment ((TYPE), (ALIGN), false) /* If defined, a C expression to compute the alignment for a local variable. TYPE is the data type, and ALIGN is the alignment that --- gcc/config/i386/i386-protos.h.jj 2013-05-14 21:30:19.000000000 +0200 +++ gcc/config/i386/i386-protos.h 2013-06-07 13:31:21.937823575 +0200 @@ -207,7 +207,7 @@ extern void init_cumulative_args (CUMULA #endif /* RTX_CODE */ #ifdef TREE_CODE -extern int ix86_data_alignment (tree, int); +extern int ix86_data_alignment (tree, int, bool); extern unsigned int ix86_local_alignment (tree, enum machine_mode, unsigned int); extern unsigned int ix86_minimum_alignment (tree, enum machine_mode, --- gcc/config/i386/i386.c.jj 2013-06-07 13:17:17.000000000 +0200 +++ gcc/config/i386/i386.c 2013-06-07 13:37:24.845416361 +0200 @@ -25375,11 +25375,12 @@ ix86_constant_alignment (tree exp, int a instead of that alignment to align the object. */ int -ix86_data_alignment (tree type, int align) +ix86_data_alignment (tree type, int align, bool opt) { int max_align = optimize_size ? BITS_PER_WORD : MIN (256, MAX_OFILE_ALIGNMENT); - if (AGGREGATE_TYPE_P (type) + if (opt + && AGGREGATE_TYPE_P (type) && TYPE_SIZE (type) && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= (unsigned) max_align @@ -25391,14 +25392,17 @@ ix86_data_alignment (tree type, int alig to 16byte boundary. */ if (TARGET_64BIT) { - if (AGGREGATE_TYPE_P (type) - && TYPE_SIZE (type) - && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST - && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 128 - || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128) + if ((opt ? AGGREGATE_TYPE_P (type) : TREE_CODE (type) == ARRAY_TYPE) + && TYPE_SIZE (type) + && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST + && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 128 + || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128) return 128; } + if (!opt) + return align; + if (TREE_CODE (type) == ARRAY_TYPE) { if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64) --- gcc/doc/tm.texi.in.jj 2013-06-01 14:47:17.000000000 +0200 +++ gcc/doc/tm.texi.in 2013-06-07 14:47:10.192003375 +0200 @@ -1062,6 +1062,16 @@ arrays to be word-aligned so that @code{ constants to character arrays can be done inline. @end defmac +@defmac DATA_ABI_ALIGNMENT (@var{type}, @var{basic-align}) +Similar to @code{DATA_ALIGNMENT}, but for the cases where the ABI mandates +some alignment increase, instead of optimization only purposes. E.g.@ +AMD x86-64 psABI says that variables with array type larger than 15 bytes +must be aligned to 16 byte boundaries. @code{DATA_ALIGNMENT} should always +return the same or larger value than @code{DATA_ABI_ALIGNMENT}. + +If this macro is not defined, then @var{basic-align} is used. +@end defmac + @defmac CONSTANT_ALIGNMENT (@var{constant}, @var{basic-align}) If defined, a C expression to compute the alignment given to a constant that is being placed in memory. @var{constant} is the constant and --- gcc/doc/tm.texi.jj 2013-06-01 14:47:17.241680273 +0200 +++ gcc/doc/tm.texi 2013-06-07 14:47:29.400694547 +0200 @@ -1078,6 +1078,16 @@ arrays to be word-aligned so that @code{ constants to character arrays can be done inline. @end defmac +@defmac DATA_ABI_ALIGNMENT (@var{type}, @var{basic-align}) +Similar to @code{DATA_ALIGNMENT}, but for the cases where the ABI mandates +some alignment increase, instead of optimization only purposes. E.g.@ +AMD x86-64 psABI says that variables with array type larger than 15 bytes +must be aligned to 16 byte boundaries. @code{DATA_ALIGNMENT} should always +return the same or larger value than @code{DATA_ABI_ALIGNMENT}. + +If this macro is not defined, then @var{basic-align} is used. +@end defmac + @defmac CONSTANT_ALIGNMENT (@var{constant}, @var{basic-align}) If defined, a C expression to compute the alignment given to a constant that is being placed in memory. @var{constant} is the constant and --- gcc/testsuite/gcc.target/i386/pr56564-1.c.jj 2013-06-07 15:17:15.879403383 +0200 +++ gcc/testsuite/gcc.target/i386/pr56564-1.c 2013-06-07 15:44:18.386232149 +0200 @@ -0,0 +1,25 @@ +/* PR target/56564 */ +/* { dg-do compile { target { fpic && lp64 } } } */ +/* { dg-options "-O3 -fpic -fdump-tree-optimized" } */ + +struct S { long a, b; } s = { 5, 6 }; +char t[16] = { 7 }; + +int +foo (void) +{ + return ((__UINTPTR_TYPE__) &s) & 15; +} + +int +bar (void) +{ + return ((__UINTPTR_TYPE__) &t[0]) & 15; +} + +/* { dg-final { scan-tree-dump-times "&s" 1 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "&t" 0 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "return 0" 1 "optimized" } } */ +/* { dg-final { scan-assembler ".align\[ \t]*16\[^:]*\[\n\r]s:" { target { *-*-linux* } } } } */ +/* { dg-final { scan-assembler ".align\[ \t]*16\[^:]*\[\n\r]t:" { target { *-*-linux* } } } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.target/i386/pr56564-2.c.jj 2013-06-07 15:19:28.900986237 +0200 +++ gcc/testsuite/gcc.target/i386/pr56564-2.c 2013-06-07 15:44:25.120129885 +0200 @@ -0,0 +1,25 @@ +/* PR target/56564 */ +/* { dg-do compile { target { *-*-linux* && lp64 } } } */ +/* { dg-options "-O3 -fno-pic -fdump-tree-optimized" } */ + +struct S { long a, b; } s = { 5, 6 }; +char t[16] = { 7 }; + +int +foo (void) +{ + return ((__UINTPTR_TYPE__) &s) & 15; +} + +int +bar (void) +{ + return ((__UINTPTR_TYPE__) &t[0]) & 15; +} + +/* { dg-final { scan-tree-dump-times "&s" 0 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "&t" 0 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "return 0" 2 "optimized" } } */ +/* { dg-final { scan-assembler ".align\[ \t]*16\[^:]*\[\n\r]s:" { target { *-*-linux* } } } } */ +/* { dg-final { scan-assembler ".align\[ \t]*16\[^:]*\[\n\r]t:" { target { *-*-linux* } } } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.target/i386/pr56564-3.c.jj 2013-06-07 15:22:26.470079983 +0200 +++ gcc/testsuite/gcc.target/i386/pr56564-3.c 2013-06-07 15:44:34.872968234 +0200 @@ -0,0 +1,28 @@ +/* PR target/56564 */ +/* { dg-do compile { target { fpic && lp64 } } } */ +/* { dg-options "-O3 -fpic -fdump-tree-optimized" } */ + +__thread struct S { long a, b; } s = { 5, 6 }; +__thread char t[16] = { 7 }; + +int +foo (void) +{ + return ((__UINTPTR_TYPE__) &s) & 15; +} + +/* For backwards compatibility we don't assume that t must + be aligned to 16 bytes, but align it anyway. */ + +int +bar (void) +{ + return ((__UINTPTR_TYPE__) &t[0]) & 15; +} + +/* { dg-final { scan-tree-dump-times "&s" 1 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "&t" 1 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "return 0" 0 "optimized" } } */ +/* { dg-final { scan-assembler-not ".align\[ \t]*16\[^:]*\[\n\r]s:" { target { *-*-linux* } } } } */ +/* { dg-final { scan-assembler ".align\[ \t]*16\[^:]*\[\n\r]t:" { target { *-*-linux* } } } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.target/i386/pr56564-4.c.jj 2013-06-07 15:25:12.638326084 +0200 +++ gcc/testsuite/gcc.target/i386/pr56564-4.c 2013-06-07 15:45:59.489567940 +0200 @@ -0,0 +1,22 @@ +/* PR target/56564 */ +/* { dg-do compile { target { *-*-linux* && lp64 } } } */ +/* { dg-options "-O3 -fno-pic -fdump-tree-optimized" } */ + +__thread struct S { long a, b; } s = { 5, 6 }; +__thread char t[16] = { 7 }; + +int +foo (void) +{ + return ((__UINTPTR_TYPE__) &s) & 15; +} + +int +bar (void) +{ + return ((__UINTPTR_TYPE__) &t[0]) & 15; +} + +/* { dg-final { scan-assembler-not ".align\[ \t]*16\[^:]*\[\n\r]s:" { target { *-*-linux* } } } } */ +/* { dg-final { scan-assembler ".align\[ \t]*16\[^:]*\[\n\r]t:" { target { *-*-linux* } } } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.target/i386/avx256-unaligned-load-4.c.jj 2012-10-16 13:15:44.000000000 +0200 +++ gcc/testsuite/gcc.target/i386/avx256-unaligned-load-4.c 2013-06-07 21:07:22.341380267 +0200 @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O3 -dp -mavx -mno-avx256-split-unaligned-load -mno-avx256-split-unaligned-store" } */ +/* { dg-options "-O3 -dp -mavx -mno-avx256-split-unaligned-load -mno-avx256-split-unaligned-store -fno-common" } */ #define N 1024 --- gcc/testsuite/gcc.target/i386/avx256-unaligned-store-1.c.jj 2012-10-16 13:15:44.000000000 +0200 +++ gcc/testsuite/gcc.target/i386/avx256-unaligned-store-1.c 2013-06-07 21:06:06.911946765 +0200 @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O3 -dp -mavx -mavx256-split-unaligned-store" } */ +/* { dg-options "-O3 -dp -mavx -mavx256-split-unaligned-store -fno-common" } */ #define N 1024 --- gcc/testsuite/gcc.target/i386/avx256-unaligned-store-3.c.jj 2012-10-16 13:15:44.000000000 +0200 +++ gcc/testsuite/gcc.target/i386/avx256-unaligned-store-3.c 2013-06-07 21:06:41.421248309 +0200 @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O3 -dp -mavx -mavx256-split-unaligned-store -mtune=generic" } */ +/* { dg-options "-O3 -dp -mavx -mavx256-split-unaligned-store -mtune=generic -fno-common" } */ #define N 1024 --- gcc/testsuite/gcc.target/i386/avx256-unaligned-store-4.c.jj 2012-10-16 13:15:44.000000000 +0200 +++ gcc/testsuite/gcc.target/i386/avx256-unaligned-store-4.c 2013-06-07 21:06:53.516302188 +0200 @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O3 -dp -mavx -mno-avx256-split-unaligned-load -mno-avx256-split-unaligned-store" } */ +/* { dg-options "-O3 -dp -mavx -mno-avx256-split-unaligned-load -mno-avx256-split-unaligned-store -fno-common" } */ #define N 1024 --- gcc/testsuite/gcc.target/i386/vect-sizes-1.c.jj 2010-11-01 09:06:30.000000000 +0100 +++ gcc/testsuite/gcc.target/i386/vect-sizes-1.c 2013-06-07 21:08:07.851581595 +0200 @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O3 -ffast-math -mavx -mtune=generic" } */ +/* { dg-options "-O3 -ffast-math -mavx -mtune=generic -fno-common" } */ double a[1024]; --- gcc/testsuite/gcc.target/i386/memcpy-1.c.jj 2011-07-11 10:39:29.000000000 +0200 +++ gcc/testsuite/gcc.target/i386/memcpy-1.c 2013-06-07 21:08:46.263945653 +0200 @@ -1,6 +1,6 @@ /* { dg-do compile } */ /* { dg-require-effective-target ia32 } */ -/* { dg-options "-O2 -march=pentiumpro -minline-all-stringops" } */ +/* { dg-options "-O2 -march=pentiumpro -minline-all-stringops -fno-common" } */ /* { dg-final { scan-assembler "rep" } } */ /* { dg-final { scan-assembler "movs" } } */ /* { dg-final { scan-assembler-not "test" } } */ --- gcc/testsuite/gcc.dg/vect/costmodel/i386/costmodel-vect-31.c.jj 2009-11-04 08:15:26.000000000 +0100 +++ gcc/testsuite/gcc.dg/vect/costmodel/i386/costmodel-vect-31.c 2013-06-07 20:58:02.091268267 +0200 @@ -18,7 +18,7 @@ struct s{ struct t e; /* unaligned (offset 2N+4N+4 B) */ }; -struct s tmp; +struct s tmp = { 1 }; int main1 () { --- gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-31.c.jj 2009-11-04 08:15:26.000000000 +0100 +++ gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-31.c 2013-06-07 20:58:38.201668248 +0200 @@ -18,7 +18,7 @@ struct s{ struct t e; /* unaligned (offset 2N+4N+4 B) */ }; -struct s tmp; +struct s tmp = { 1 }; int main1 () {