543165
2013-06-19  Igor Zamyatin  <igor.zamyatin@intel.com>
543165
543165
	* gcc.dg/tree-ssa/loop-19.c: Add -fno-common.
543165
543165
2013-06-12  Jakub Jelinek  <jakub@redhat.com>
543165
543165
	PR target/56564
543165
	* varasm.c (decl_binds_to_current_def_p): Call binds_local_p
543165
	target hook even for !TREE_PUBLIC decls.  If no resolution info
543165
	is available, return false for common and external decls.
543165
543165
	* gcc.target/i386/pr56564-1.c: Skip on darwin, mingw and cygwin.
543165
	* gcc.target/i386/pr56564-3.c: Likewise.
543165
543165
2013-06-11  Jakub Jelinek  <jakub@redhat.com>
543165
543165
	PR target/56564
543165
	* varasm.c (get_variable_align): Move #endif to the right place.
543165
543165
2013-06-10  Jakub Jelinek  <jakub@redhat.com>
543165
543165
	PR target/56564
543165
	* varasm.c (align_variable): Don't use DATA_ALIGNMENT or
543165
	CONSTANT_ALIGNMENT if !decl_binds_to_current_def_p (decl).
543165
	Use DATA_ABI_ALIGNMENT for that case instead if defined.
543165
	(get_variable_align): New function.
543165
	(get_variable_section, emit_bss, emit_common,
543165
	assemble_variable_contents, place_block_symbol): Use
543165
	get_variable_align instead of DECL_ALIGN.
543165
	(assemble_noswitch_variable): Add align argument, use it
543165
	instead of DECL_ALIGN.
543165
	(assemble_variable): Adjust caller.  Use get_variable_align
543165
	instead of DECL_ALIGN.
543165
	* config/i386/i386.h (DATA_ALIGNMENT): Adjust x86_data_alignment
543165
	caller.
543165
	(DATA_ABI_ALIGNMENT): Define.
543165
	* config/i386/i386-protos.h (x86_data_alignment): Adjust prototype.
543165
	* config/i386/i386.c (x86_data_alignment): Add opt argument.  If
543165
	opt is false, only return the psABI mandated alignment increase.
543165
	* config/c6x/c6x.h (DATA_ALIGNMENT): Renamed to...
543165
	(DATA_ABI_ALIGNMENT): ... this.
543165
	* config/mmix/mmix.h (DATA_ALIGNMENT): Renamed to...
543165
	(DATA_ABI_ALIGNMENT): ... this.
543165
	* config/mmix/mmix.c (mmix_data_alignment): Adjust function comment.
543165
	* config/s390/s390.h (DATA_ALIGNMENT): Renamed to...
543165
	(DATA_ABI_ALIGNMENT): ... this.
543165
	* doc/tm.texi.in (DATA_ABI_ALIGNMENT): Document.
543165
	* doc/tm.texi: Regenerated.
543165
543165
	* gcc.target/i386/pr56564-1.c: New test.
543165
	* gcc.target/i386/pr56564-2.c: New test.
543165
	* gcc.target/i386/pr56564-3.c: New test.
543165
	* gcc.target/i386/pr56564-4.c: New test.
543165
	* gcc.target/i386/avx256-unaligned-load-4.c: Add -fno-common.
543165
	* gcc.target/i386/avx256-unaligned-store-1.c: Likewise.
543165
	* gcc.target/i386/avx256-unaligned-store-3.c: Likewise.
543165
	* gcc.target/i386/avx256-unaligned-store-4.c: Likewise.
543165
	* gcc.target/i386/vect-sizes-1.c: Likewise.
543165
	* gcc.target/i386/memcpy-1.c: Likewise.
543165
	* gcc.dg/vect/costmodel/i386/costmodel-vect-31.c (tmp): Initialize.
543165
	* gcc.dg/vect/costmodel/x86_64/costmodel-vect-31.c (tmp): Likewise.
543165
543165
--- gcc/doc/tm.texi.in	(revision 199897)
543165
+++ gcc/doc/tm.texi.in	(revision 199898)
543165
@@ -1062,6 +1062,15 @@ arrays to be word-aligned so that @code{
543165
 constants to character arrays can be done inline.
543165
 @end defmac
543165
 
543165
+@defmac DATA_ABI_ALIGNMENT (@var{type}, @var{basic-align})
543165
+Similar to @code{DATA_ALIGNMENT}, but for the cases where the ABI mandates
543165
+some alignment increase, instead of optimization only purposes.  E.g.@
543165
+AMD x86-64 psABI says that variables with array type larger than 15 bytes
543165
+must be aligned to 16 byte boundaries.
543165
+
543165
+If this macro is not defined, then @var{basic-align} is used.
543165
+@end defmac
543165
+
543165
 @defmac CONSTANT_ALIGNMENT (@var{constant}, @var{basic-align})
543165
 If defined, a C expression to compute the alignment given to a constant
543165
 that is being placed in memory.  @var{constant} is the constant and
543165
--- gcc/doc/tm.texi	(revision 199897)
543165
+++ gcc/doc/tm.texi	(revision 199898)
543165
@@ -1078,6 +1078,15 @@ arrays to be word-aligned so that @code{
543165
 constants to character arrays can be done inline.
543165
 @end defmac
543165
 
543165
+@defmac DATA_ABI_ALIGNMENT (@var{type}, @var{basic-align})
543165
+Similar to @code{DATA_ALIGNMENT}, but for the cases where the ABI mandates
543165
+some alignment increase, instead of optimization only purposes.  E.g.@
543165
+AMD x86-64 psABI says that variables with array type larger than 15 bytes
543165
+must be aligned to 16 byte boundaries.
543165
+
543165
+If this macro is not defined, then @var{basic-align} is used.
543165
+@end defmac
543165
+
543165
 @defmac CONSTANT_ALIGNMENT (@var{constant}, @var{basic-align})
543165
 If defined, a C expression to compute the alignment given to a constant
543165
 that is being placed in memory.  @var{constant} is the constant and
543165
--- gcc/varasm.c	(revision 199897)
543165
+++ gcc/varasm.c	(revision 199984)
543165
@@ -966,13 +966,80 @@ align_variable (tree decl, bool dont_out
543165
       align = MAX_OFILE_ALIGNMENT;
543165
     }
543165
 
543165
-  /* On some machines, it is good to increase alignment sometimes.  */
543165
   if (! DECL_USER_ALIGN (decl))
543165
     {
543165
+#ifdef DATA_ABI_ALIGNMENT
543165
+      unsigned int data_abi_align
543165
+	= DATA_ABI_ALIGNMENT (TREE_TYPE (decl), align);
543165
+      /* For backwards compatibility, don't assume the ABI alignment for
543165
+	 TLS variables.  */
543165
+      if (! DECL_THREAD_LOCAL_P (decl) || data_abi_align <= BITS_PER_WORD)
543165
+	align = data_abi_align;
543165
+#endif
543165
+
543165
+      /* On some machines, it is good to increase alignment sometimes.
543165
+	 But as DECL_ALIGN is used both for actually emitting the variable
543165
+	 and for code accessing the variable as guaranteed alignment, we
543165
+	 can only increase the alignment if it is a performance optimization
543165
+	 if the references to it must bind to the current definition.  */
543165
+      if (decl_binds_to_current_def_p (decl))
543165
+	{
543165
+#ifdef DATA_ALIGNMENT
543165
+	  unsigned int data_align = DATA_ALIGNMENT (TREE_TYPE (decl), align);
543165
+	  /* Don't increase alignment too much for TLS variables - TLS space
543165
+	     is too precious.  */
543165
+	  if (! DECL_THREAD_LOCAL_P (decl) || data_align <= BITS_PER_WORD)
543165
+	    align = data_align;
543165
+#endif
543165
+#ifdef CONSTANT_ALIGNMENT
543165
+	  if (DECL_INITIAL (decl) != 0
543165
+	      && DECL_INITIAL (decl) != error_mark_node)
543165
+	    {
543165
+	      unsigned int const_align
543165
+		= CONSTANT_ALIGNMENT (DECL_INITIAL (decl), align);
543165
+	      /* Don't increase alignment too much for TLS variables - TLS
543165
+		 space is too precious.  */
543165
+	      if (! DECL_THREAD_LOCAL_P (decl) || const_align <= BITS_PER_WORD)
543165
+		align = const_align;
543165
+	    }
543165
+#endif
543165
+	}
543165
+    }
543165
+
543165
+  /* Reset the alignment in case we have made it tighter, so we can benefit
543165
+     from it in get_pointer_alignment.  */
543165
+  DECL_ALIGN (decl) = align;
543165
+}
543165
+
543165
+/* Return DECL_ALIGN (decl), possibly increased for optimization purposes
543165
+   beyond what align_variable returned.  */
543165
+
543165
+static unsigned int
543165
+get_variable_align (tree decl)
543165
+{
543165
+  unsigned int align = DECL_ALIGN (decl);
543165
+
543165
+  /* For user aligned vars or static vars align_variable already did
543165
+     everything.  */
543165
+  if (DECL_USER_ALIGN (decl) || !TREE_PUBLIC (decl))
543165
+    return align;
543165
+
543165
+#ifdef DATA_ABI_ALIGNMENT
543165
+  if (DECL_THREAD_LOCAL_P (decl))
543165
+    align = DATA_ABI_ALIGNMENT (TREE_TYPE (decl), align);
543165
+#endif
543165
+
543165
+  /* For decls that bind to the current definition, align_variable
543165
+     did also everything, except for not assuming ABI required alignment
543165
+     of TLS variables.  For other vars, increase the alignment here
543165
+     as an optimization.  */
543165
+  if (!decl_binds_to_current_def_p (decl))
543165
+    {
543165
+      /* On some machines, it is good to increase alignment sometimes.  */
543165
 #ifdef DATA_ALIGNMENT
543165
       unsigned int data_align = DATA_ALIGNMENT (TREE_TYPE (decl), align);
543165
       /* Don't increase alignment too much for TLS variables - TLS space
543165
-	 is too precious.  */
543165
+         is too precious.  */
543165
       if (! DECL_THREAD_LOCAL_P (decl) || data_align <= BITS_PER_WORD)
543165
 	align = data_align;
543165
 #endif
543165
@@ -989,9 +1056,7 @@ align_variable (tree decl, bool dont_out
543165
 #endif
543165
     }
543165
 
543165
-  /* Reset the alignment in case we have made it tighter, so we can benefit
543165
-     from it in get_pointer_alignment.  */
543165
-  DECL_ALIGN (decl) = align;
543165
+  return align;
543165
 }
543165
 
543165
 /* Return the section into which the given VAR_DECL or CONST_DECL
543165
@@ -1043,7 +1108,8 @@ get_variable_section (tree decl, bool pr
543165
 	return bss_noswitch_section;
543165
     }
543165
 
543165
-  return targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl));
543165
+  return targetm.asm_out.select_section (decl, reloc,
543165
+					 get_variable_align (decl));
543165
 }
543165
 
543165
 /* Return the block into which object_block DECL should be placed.  */
543165
@@ -1780,7 +1846,8 @@ emit_bss (tree decl ATTRIBUTE_UNUSED,
543165
 	  unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED)
543165
 {
543165
 #if defined ASM_OUTPUT_ALIGNED_BSS
543165
-  ASM_OUTPUT_ALIGNED_BSS (asm_out_file, decl, name, size, DECL_ALIGN (decl));
543165
+  ASM_OUTPUT_ALIGNED_BSS (asm_out_file, decl, name, size,
543165
+			  get_variable_align (decl));
543165
   return true;
543165
 #endif
543165
 }
543165
@@ -1796,10 +1863,11 @@ emit_common (tree decl ATTRIBUTE_UNUSED,
543165
 {
543165
 #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
543165
   ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, decl, name,
543165
-				  size, DECL_ALIGN (decl));
543165
+				  size, get_variable_align (decl));
543165
   return true;
543165
 #elif defined ASM_OUTPUT_ALIGNED_COMMON
543165
-  ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, name, size, DECL_ALIGN (decl));
543165
+  ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, name, size,
543165
+			     get_variable_align (decl));
543165
   return true;
543165
 #else
543165
   ASM_OUTPUT_COMMON (asm_out_file, name, size, rounded);
543165
@@ -1828,7 +1896,8 @@ emit_tls_common (tree decl ATTRIBUTE_UNU
543165
    NAME is the name of DECL's SYMBOL_REF.  */
543165
 
543165
 static void
543165
-assemble_noswitch_variable (tree decl, const char *name, section *sect)
543165
+assemble_noswitch_variable (tree decl, const char *name, section *sect,
543165
+			    unsigned int align)
543165
 {
543165
   unsigned HOST_WIDE_INT size, rounded;
543165
 
543165
@@ -1850,7 +1919,7 @@ assemble_noswitch_variable (tree decl, c
543165
 	     * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
543165
 
543165
   if (!sect->noswitch.callback (decl, name, size, rounded)
543165
-      && (unsigned HOST_WIDE_INT) DECL_ALIGN_UNIT (decl) > rounded)
543165
+      && (unsigned HOST_WIDE_INT) (align / BITS_PER_UNIT) > rounded)
543165
     warning (0, "requested alignment for %q+D is greater than "
543165
 	     "implemented alignment of %wu", decl, rounded);
543165
 }
543165
@@ -1880,7 +1949,7 @@ assemble_variable_contents (tree decl, c
543165
 	/* Output the actual data.  */
543165
 	output_constant (DECL_INITIAL (decl),
543165
 			 tree_low_cst (DECL_SIZE_UNIT (decl), 1),
543165
-			 DECL_ALIGN (decl));
543165
+			 get_variable_align (decl));
543165
       else
543165
 	/* Leave space for it.  */
543165
 	assemble_zeros (tree_low_cst (DECL_SIZE_UNIT (decl), 1));
543165
@@ -1904,6 +1973,7 @@ assemble_variable (tree decl, int top_le
543165
   const char *name;
543165
   rtx decl_rtl, symbol;
543165
   section *sect;
543165
+  unsigned int align;
543165
   bool asan_protected = false;
543165
 
543165
   /* This function is supposed to handle VARIABLES.  Ensure we have one.  */
543165
@@ -2003,6 +2073,8 @@ assemble_variable (tree decl, int top_le
543165
 
543165
   set_mem_align (decl_rtl, DECL_ALIGN (decl));
543165
 
543165
+  align = get_variable_align (decl);
543165
+
543165
   if (TREE_PUBLIC (decl))
543165
     maybe_assemble_visibility (decl);
543165
 
543165
@@ -2032,12 +2104,12 @@ assemble_variable (tree decl, int top_le
543165
       place_block_symbol (symbol);
543165
     }
543165
   else if (SECTION_STYLE (sect) == SECTION_NOSWITCH)
543165
-    assemble_noswitch_variable (decl, name, sect);
543165
+    assemble_noswitch_variable (decl, name, sect, align);
543165
   else
543165
     {
543165
       switch_to_section (sect);
543165
-      if (DECL_ALIGN (decl) > BITS_PER_UNIT)
543165
-	ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (DECL_ALIGN_UNIT (decl)));
543165
+      if (align > BITS_PER_UNIT)
543165
+	ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
543165
       assemble_variable_contents (decl, name, dont_output_data);
543165
       if (asan_protected)
543165
 	{
543165
@@ -6709,10 +6781,10 @@ bool
543165
 decl_binds_to_current_def_p (tree decl)
543165
 {
543165
   gcc_assert (DECL_P (decl));
543165
-  if (!TREE_PUBLIC (decl))
543165
-    return true;
543165
   if (!targetm.binds_local_p (decl))
543165
     return false;
543165
+  if (!TREE_PUBLIC (decl))
543165
+    return true;
543165
   /* When resolution is available, just use it.  */
543165
   if (TREE_CODE (decl) == VAR_DECL
543165
       && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
543165
@@ -6730,10 +6802,20 @@ decl_binds_to_current_def_p (tree decl)
543165
 	return resolution_to_local_definition_p (node->symbol.resolution);
543165
     }
543165
   /* Otherwise we have to assume the worst for DECL_WEAK (hidden weaks
543165
-     binds locally but still can be overwritten).
543165
+     binds locally but still can be overwritten), DECL_COMMON (can be merged
543165
+     with a non-common definition somewhere in the same module) or
543165
+     DECL_EXTERNAL.
543165
      This rely on fact that binds_local_p behave as decl_replaceable_p
543165
      for all other declaration types.  */
543165
-  return !DECL_WEAK (decl);
543165
+  if (DECL_WEAK (decl))
543165
+    return false;
543165
+  if (DECL_COMMON (decl)
543165
+      && (DECL_INITIAL (decl) == NULL
543165
+	  || DECL_INITIAL (decl) == error_mark_node))
543165
+    return false;
543165
+  if (DECL_EXTERNAL (decl))
543165
+    return false;
543165
+  return true;
543165
 }
543165
 
543165
 /* A replaceable function or variable is one which may be replaced
543165
@@ -6959,7 +7041,7 @@ place_block_symbol (rtx symbol)
543165
   else
543165
     {
543165
       decl = SYMBOL_REF_DECL (symbol);
543165
-      alignment = DECL_ALIGN (decl);
543165
+      alignment = get_variable_align (decl);
543165
       size = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
543165
       if (flag_asan && asan_protect_global (decl))
543165
 	{
543165
--- gcc/config/s390/s390.h	(revision 199897)
543165
+++ gcc/config/s390/s390.h	(revision 199898)
543165
@@ -221,7 +221,7 @@ enum processor_flags
543165
 
543165
 /* Alignment on even addresses for LARL instruction.  */
543165
 #define CONSTANT_ALIGNMENT(EXP, ALIGN) (ALIGN) < 16 ? 16 : (ALIGN)
543165
-#define DATA_ALIGNMENT(TYPE, ALIGN) (ALIGN) < 16 ? 16 : (ALIGN)
543165
+#define DATA_ABI_ALIGNMENT(TYPE, ALIGN) (ALIGN) < 16 ? 16 : (ALIGN)
543165
 
543165
 /* Alignment is not required by the hardware.  */
543165
 #define STRICT_ALIGNMENT 0
543165
--- gcc/config/i386/i386.h	(revision 199897)
543165
+++ gcc/config/i386/i386.h	(revision 199898)
543165
@@ -859,7 +859,18 @@ enum target_cpu_default
543165
    cause character arrays to be word-aligned so that `strcpy' calls
543165
    that copy constants to character arrays can be done inline.  */
543165
 
543165
-#define DATA_ALIGNMENT(TYPE, ALIGN) ix86_data_alignment ((TYPE), (ALIGN))
543165
+#define DATA_ALIGNMENT(TYPE, ALIGN) \
543165
+  ix86_data_alignment ((TYPE), (ALIGN), true)
543165
+
543165
+/* Similar to DATA_ALIGNMENT, but for the cases where the ABI mandates
543165
+   some alignment increase, instead of optimization only purposes.  E.g.
543165
+   AMD x86-64 psABI says that variables with array type larger than 15 bytes
543165
+   must be aligned to 16 byte boundaries.
543165
+
543165
+   If this macro is not defined, then ALIGN is used.  */
543165
+
543165
+#define DATA_ABI_ALIGNMENT(TYPE, ALIGN) \
543165
+  ix86_data_alignment ((TYPE), (ALIGN), false)
543165
 
543165
 /* If defined, a C expression to compute the alignment for a local
543165
    variable.  TYPE is the data type, and ALIGN is the alignment that
543165
--- gcc/config/i386/i386-protos.h	(revision 199897)
543165
+++ gcc/config/i386/i386-protos.h	(revision 199898)
543165
@@ -207,7 +207,7 @@ extern void init_cumulative_args (CUMULA
543165
 #endif	/* RTX_CODE  */
543165
 
543165
 #ifdef TREE_CODE
543165
-extern int ix86_data_alignment (tree, int);
543165
+extern int ix86_data_alignment (tree, int, bool);
543165
 extern unsigned int ix86_local_alignment (tree, enum machine_mode,
543165
 					  unsigned int);
543165
 extern unsigned int ix86_minimum_alignment (tree, enum machine_mode,
543165
--- gcc/config/i386/i386.c	(revision 199897)
543165
+++ gcc/config/i386/i386.c	(revision 199898)
67287f
@@ -25292,12 +25292,13 @@ ix86_constant_alignment (tree exp, int a
543165
    instead of that alignment to align the object.  */
543165
 
543165
 int
543165
-ix86_data_alignment (tree type, int align)
543165
+ix86_data_alignment (tree type, int align, bool opt)
543165
 {
67287f
   int max_align
67287f
     = optimize_size ? BITS_PER_WORD : MIN (256, MAX_OFILE_ALIGNMENT);
543165
 
543165
-  if (AGGREGATE_TYPE_P (type)
543165
+  if (opt
543165
+      && AGGREGATE_TYPE_P (type)
543165
       && TYPE_SIZE (type)
543165
       && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
543165
       && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= (unsigned) max_align
67287f
@@ -25309,14 +25310,17 @@ ix86_data_alignment (tree type, int alig
543165
      to 16byte boundary.  */
543165
   if (TARGET_64BIT)
543165
     {
543165
-      if (AGGREGATE_TYPE_P (type)
543165
-	   && TYPE_SIZE (type)
543165
-	   && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
543165
-	   && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 128
543165
-	       || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
543165
+      if ((opt ? AGGREGATE_TYPE_P (type) : TREE_CODE (type) == ARRAY_TYPE)
543165
+	  && TYPE_SIZE (type)
543165
+	  && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
543165
+	  && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 128
543165
+	      || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
543165
 	return 128;
543165
     }
543165
 
543165
+  if (!opt)
543165
+    return align;
543165
+
543165
   if (TREE_CODE (type) == ARRAY_TYPE)
543165
     {
543165
       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
543165
--- gcc/config/c6x/c6x.h	(revision 199897)
543165
+++ gcc/config/c6x/c6x.h	(revision 199898)
543165
@@ -134,7 +134,7 @@ extern c6x_cpu_t c6x_arch;
543165
    Really only externally visible arrays must be aligned this way, as
543165
    only those are directly visible from another compilation unit.  But
543165
    we don't have that information available here.  */
543165
-#define DATA_ALIGNMENT(TYPE, ALIGN)					\
543165
+#define DATA_ABI_ALIGNMENT(TYPE, ALIGN)					\
543165
   (((ALIGN) < BITS_PER_UNIT * 8 && TREE_CODE (TYPE) == ARRAY_TYPE)	\
543165
    ? BITS_PER_UNIT * 8 : (ALIGN))
543165
 
543165
--- gcc/config/mmix/mmix.h	(revision 199897)
543165
+++ gcc/config/mmix/mmix.h	(revision 199898)
543165
@@ -164,7 +164,7 @@ struct GTY(()) machine_function
543165
 /* Copied from elfos.h.  */
543165
 #define MAX_OFILE_ALIGNMENT (32768 * 8)
543165
 
543165
-#define DATA_ALIGNMENT(TYPE, BASIC_ALIGN) \
543165
+#define DATA_ABI_ALIGNMENT(TYPE, BASIC_ALIGN) \
543165
  mmix_data_alignment (TYPE, BASIC_ALIGN)
543165
 
543165
 #define CONSTANT_ALIGNMENT(CONSTANT, BASIC_ALIGN) \
543165
--- gcc/config/mmix/mmix.c	(revision 199897)
543165
+++ gcc/config/mmix/mmix.c	(revision 199898)
543165
@@ -313,7 +313,7 @@ mmix_init_machine_status (void)
543165
   return ggc_alloc_cleared_machine_function ();
543165
 }
543165
 
543165
-/* DATA_ALIGNMENT.
543165
+/* DATA_ABI_ALIGNMENT.
543165
    We have trouble getting the address of stuff that is located at other
543165
    than 32-bit alignments (GETA requirements), so try to give everything
543165
    at least 32-bit alignment.  */
543165
--- gcc/testsuite/gcc.target/i386/memcpy-1.c	(revision 199897)
543165
+++ gcc/testsuite/gcc.target/i386/memcpy-1.c	(revision 199898)
543165
@@ -1,6 +1,6 @@
543165
 /* { dg-do compile } */
543165
 /* { dg-require-effective-target ia32 } */
543165
-/* { dg-options "-O2 -march=pentiumpro -minline-all-stringops" } */
543165
+/* { dg-options "-O2 -march=pentiumpro -minline-all-stringops -fno-common" } */
543165
 /* { dg-final { scan-assembler "rep" } } */
543165
 /* { dg-final { scan-assembler "movs" } } */
543165
 /* { dg-final { scan-assembler-not "test" } } */
543165
--- gcc/testsuite/gcc.target/i386/vect-sizes-1.c	(revision 199897)
543165
+++ gcc/testsuite/gcc.target/i386/vect-sizes-1.c	(revision 199898)
543165
@@ -1,5 +1,5 @@
543165
 /* { dg-do compile } */
543165
-/* { dg-options "-O3 -ffast-math -mavx -mtune=generic" } */
543165
+/* { dg-options "-O3 -ffast-math -mavx -mtune=generic -fno-common" } */
543165
 
543165
 double a[1024];
543165
 
543165
--- gcc/testsuite/gcc.target/i386/avx256-unaligned-load-4.c	(revision 199897)
543165
+++ gcc/testsuite/gcc.target/i386/avx256-unaligned-load-4.c	(revision 199898)
543165
@@ -1,5 +1,5 @@
543165
 /* { dg-do compile } */
543165
-/* { dg-options "-O3 -dp -mavx -mno-avx256-split-unaligned-load -mno-avx256-split-unaligned-store" } */
543165
+/* { dg-options "-O3 -dp -mavx -mno-avx256-split-unaligned-load -mno-avx256-split-unaligned-store -fno-common" } */
543165
 
543165
 #define N 1024
543165
 
543165
--- gcc/testsuite/gcc.target/i386/avx256-unaligned-store-1.c	(revision 199897)
543165
+++ gcc/testsuite/gcc.target/i386/avx256-unaligned-store-1.c	(revision 199898)
543165
@@ -1,5 +1,5 @@
543165
 /* { dg-do compile } */
543165
-/* { dg-options "-O3 -dp -mavx -mavx256-split-unaligned-store" } */
543165
+/* { dg-options "-O3 -dp -mavx -mavx256-split-unaligned-store -fno-common" } */
543165
 
543165
 #define N 1024
543165
 
543165
--- gcc/testsuite/gcc.target/i386/avx256-unaligned-store-3.c	(revision 199897)
543165
+++ gcc/testsuite/gcc.target/i386/avx256-unaligned-store-3.c	(revision 199898)
543165
@@ -1,5 +1,5 @@
543165
 /* { dg-do compile } */
543165
-/* { dg-options "-O3 -dp -mavx -mavx256-split-unaligned-store -mtune=generic" } */
543165
+/* { dg-options "-O3 -dp -mavx -mavx256-split-unaligned-store -mtune=generic -fno-common" } */
543165
 
543165
 #define N 1024
543165
 
543165
--- gcc/testsuite/gcc.target/i386/avx256-unaligned-store-4.c	(revision 199897)
543165
+++ gcc/testsuite/gcc.target/i386/avx256-unaligned-store-4.c	(revision 199898)
543165
@@ -1,5 +1,5 @@
543165
 /* { dg-do compile } */
543165
-/* { dg-options "-O3 -dp -mavx -mno-avx256-split-unaligned-load -mno-avx256-split-unaligned-store" } */
543165
+/* { dg-options "-O3 -dp -mavx -mno-avx256-split-unaligned-load -mno-avx256-split-unaligned-store -fno-common" } */
543165
 
543165
 #define N 1024
543165
 
543165
--- gcc/testsuite/gcc.target/i386/pr56564-1.c	(revision 0)
543165
+++ gcc/testsuite/gcc.target/i386/pr56564-1.c	(revision 199985)
543165
@@ -0,0 +1,26 @@
543165
+/* PR target/56564 */
543165
+/* { dg-do compile { target { fpic && lp64 } } } */
543165
+/* { dg-skip-if "No symbol interposition for PIC" { *-*-mingw* *-*-cygwin* *-*-darwin* } } */
543165
+/* { dg-options "-O3 -fpic -fdump-tree-optimized" } */
543165
+
543165
+struct S { long a, b; } s = { 5, 6 };
543165
+char t[16] = { 7 };
543165
+
543165
+int
543165
+foo (void)
543165
+{
543165
+  return ((__UINTPTR_TYPE__) &s) & 15;
543165
+}
543165
+
543165
+int
543165
+bar (void)
543165
+{
543165
+  return ((__UINTPTR_TYPE__) &t[0]) & 15;
543165
+}
543165
+
543165
+/* { dg-final { scan-tree-dump-times "&s" 1 "optimized" } } */
543165
+/* { dg-final { scan-tree-dump-times "&t" 0 "optimized" } } */
543165
+/* { dg-final { scan-tree-dump-times "return 0" 1 "optimized" } } */
543165
+/* { dg-final { scan-assembler ".align\[ \t]*16\[^:]*\[\n\r]s:" { target { *-*-linux* } } } } */
543165
+/* { dg-final { scan-assembler ".align\[ \t]*16\[^:]*\[\n\r]t:" { target { *-*-linux* } } } } */
543165
+/* { dg-final { cleanup-tree-dump "optimized" } } */
543165
--- gcc/testsuite/gcc.target/i386/pr56564-2.c	(revision 0)
543165
+++ gcc/testsuite/gcc.target/i386/pr56564-2.c	(revision 199898)
543165
@@ -0,0 +1,25 @@
543165
+/* PR target/56564 */
543165
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
543165
+/* { dg-options "-O3 -fno-pic -fdump-tree-optimized" } */
543165
+
543165
+struct S { long a, b; } s = { 5, 6 };
543165
+char t[16] = { 7 };
543165
+
543165
+int
543165
+foo (void)
543165
+{
543165
+  return ((__UINTPTR_TYPE__) &s) & 15;
543165
+}
543165
+
543165
+int
543165
+bar (void)
543165
+{
543165
+  return ((__UINTPTR_TYPE__) &t[0]) & 15;
543165
+}
543165
+
543165
+/* { dg-final { scan-tree-dump-times "&s" 0 "optimized" } } */
543165
+/* { dg-final { scan-tree-dump-times "&t" 0 "optimized" } } */
543165
+/* { dg-final { scan-tree-dump-times "return 0" 2 "optimized" } } */
543165
+/* { dg-final { scan-assembler ".align\[ \t]*16\[^:]*\[\n\r]s:" { target { *-*-linux* } } } } */
543165
+/* { dg-final { scan-assembler ".align\[ \t]*16\[^:]*\[\n\r]t:" { target { *-*-linux* } } } } */
543165
+/* { dg-final { cleanup-tree-dump "optimized" } } */
543165
--- gcc/testsuite/gcc.target/i386/pr56564-3.c	(revision 0)
543165
+++ gcc/testsuite/gcc.target/i386/pr56564-3.c	(revision 199985)
543165
@@ -0,0 +1,29 @@
543165
+/* PR target/56564 */
543165
+/* { dg-do compile { target { fpic && lp64 } } } */
543165
+/* { dg-skip-if "No symbol interposition for PIC" { *-*-mingw* *-*-cygwin* *-*-darwin* } } */
543165
+/* { dg-options "-O3 -fpic -fdump-tree-optimized" } */
543165
+
543165
+__thread struct S { long a, b; } s = { 5, 6 };
543165
+__thread char t[16] = { 7 };
543165
+
543165
+int
543165
+foo (void)
543165
+{
543165
+  return ((__UINTPTR_TYPE__) &s) & 15;
543165
+}
543165
+
543165
+/* For backwards compatibility we don't assume that t must
543165
+   be aligned to 16 bytes, but align it anyway.  */
543165
+
543165
+int
543165
+bar (void)
543165
+{
543165
+  return ((__UINTPTR_TYPE__) &t[0]) & 15;
543165
+}
543165
+
543165
+/* { dg-final { scan-tree-dump-times "&s" 1 "optimized" } } */
543165
+/* { dg-final { scan-tree-dump-times "&t" 1 "optimized" } } */
543165
+/* { dg-final { scan-tree-dump-times "return 0" 0 "optimized" } } */
543165
+/* { dg-final { scan-assembler-not ".align\[ \t]*16\[^:]*\[\n\r]s:" { target { *-*-linux* } } } } */
543165
+/* { dg-final { scan-assembler ".align\[ \t]*16\[^:]*\[\n\r]t:" { target { *-*-linux* } } } } */
543165
+/* { dg-final { cleanup-tree-dump "optimized" } } */
543165
--- gcc/testsuite/gcc.target/i386/pr56564-4.c	(revision 0)
543165
+++ gcc/testsuite/gcc.target/i386/pr56564-4.c	(revision 199898)
543165
@@ -0,0 +1,22 @@
543165
+/* PR target/56564 */
543165
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
543165
+/* { dg-options "-O3 -fno-pic -fdump-tree-optimized" } */
543165
+
543165
+__thread struct S { long a, b; } s = { 5, 6 };
543165
+__thread char t[16] = { 7 };
543165
+
543165
+int
543165
+foo (void)
543165
+{
543165
+  return ((__UINTPTR_TYPE__) &s) & 15;
543165
+}
543165
+
543165
+int
543165
+bar (void)
543165
+{
543165
+  return ((__UINTPTR_TYPE__) &t[0]) & 15;
543165
+}
543165
+
543165
+/* { dg-final { scan-assembler-not ".align\[ \t]*16\[^:]*\[\n\r]s:" { target { *-*-linux* } } } } */
543165
+/* { dg-final { scan-assembler ".align\[ \t]*16\[^:]*\[\n\r]t:" { target { *-*-linux* } } } } */
543165
+/* { dg-final { cleanup-tree-dump "optimized" } } */
543165
--- gcc/testsuite/gcc.dg/vect/costmodel/i386/costmodel-vect-31.c	(revision 199897)
543165
+++ gcc/testsuite/gcc.dg/vect/costmodel/i386/costmodel-vect-31.c	(revision 199898)
543165
@@ -18,7 +18,7 @@ struct s{
543165
   struct t e;   /* unaligned (offset 2N+4N+4 B) */
543165
 };
543165
  
543165
-struct s tmp;
543165
+struct s tmp = { 1 };
543165
 
543165
 int main1 ()
543165
 {  
543165
--- gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-31.c	(revision 199897)
543165
+++ gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-31.c	(revision 199898)
543165
@@ -18,7 +18,7 @@ struct s{
543165
   struct t e;   /* unaligned (offset 2N+4N+4 B) */
543165
 };
543165
  
543165
-struct s tmp;
543165
+struct s tmp = { 1 };
543165
 
543165
 int main1 ()
543165
 {  
543165
--- gcc/testsuite/gcc.dg/tree-ssa/loop-19.c	(revision 200212)
543165
+++ gcc/testsuite/gcc.dg/tree-ssa/loop-19.c	(revision 200213)
543165
@@ -6,7 +6,7 @@
543165
 
543165
 /* { dg-do compile { target { i?86-*-* || { x86_64-*-* || powerpc_hard_double } } } } */
543165
 /* { dg-require-effective-target nonpic } */
543165
-/* { dg-options "-O3 -fno-tree-loop-distribute-patterns -fno-prefetch-loop-arrays -fdump-tree-optimized" } */
543165
+/* { dg-options "-O3 -fno-tree-loop-distribute-patterns -fno-prefetch-loop-arrays -fdump-tree-optimized -fno-common" } */
543165
 
543165
 # define N      2000000
543165
 double   a[N],c[N];