This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix PR52571


On Wed, 14 Mar 2012, Richard Guenther wrote:

> 
> This fixes PR52571, we should not align DECL_COMMON variables as
> they might be pre-empted by a definition with lower alignment.
> 
> At LTO/WPA level we might recover from missed optimizations by
> promoting DECL_COMMON variables to non-common.  Not sure if we
> do that already.
> 
> Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

Checked in with some testcase adjustments.

Richard.

2012-03-14  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/52571
	* tree-vect-data-refs.c (vect_compute_data_ref_alignment): Move
	flag_section_anchors check ...
	(vect_can_force_dr_alignment_p): ... here.  Do not re-align
	DECL_COMMON variables.

	* gcc.dg/vect/vect-2.c: Initialize arrays.
	* gcc.dg/vect/no-section-anchors-vect-34.c: Likewise.
	* gcc.target/i386/recip-vec-divf.c: Use -fno-common.
	* gcc.target/i386/recip-vec-sqrtf.c: Likewise.

Index: gcc/tree-vect-data-refs.c
===================================================================
*** gcc/tree-vect-data-refs.c	(revision 185379)
--- gcc/tree-vect-data-refs.c	(working copy)
*************** vect_compute_data_ref_alignment (struct
*** 872,881 ****
  
    if (!base_aligned)
      {
!       /* Do not change the alignment of global variables if
! 	 flag_section_anchors is enabled.  */
!       if (!vect_can_force_dr_alignment_p (base, TYPE_ALIGN (vectype))
! 	  || (TREE_STATIC (base) && flag_section_anchors))
  	{
  	  if (vect_print_dump_info (REPORT_DETAILS))
  	    {
--- 872,878 ----
  
    if (!base_aligned)
      {
!       if (!vect_can_force_dr_alignment_p (base, TYPE_ALIGN (vectype)))
  	{
  	  if (vect_print_dump_info (REPORT_DETAILS))
  	    {
*************** vect_can_force_dr_alignment_p (const_tre
*** 4546,4557 ****
    if (TREE_CODE (decl) != VAR_DECL)
      return false;
  
!   if (DECL_EXTERNAL (decl))
      return false;
  
    if (TREE_ASM_WRITTEN (decl))
      return false;
  
    if (TREE_STATIC (decl))
      return (alignment <= MAX_OFILE_ALIGNMENT);
    else
--- 4543,4564 ----
    if (TREE_CODE (decl) != VAR_DECL)
      return false;
  
!   /* We cannot change alignment of common or external symbols as another
!      translation unit may contain a definition with lower alignment.  
!      The rules of common symbol linking mean that the definition
!      will override the common symbol.  */
!   if (DECL_EXTERNAL (decl)
!       || DECL_COMMON (decl))
      return false;
  
    if (TREE_ASM_WRITTEN (decl))
      return false;
  
+   /* Do not change the alignment of global variables if flag_section_anchors
+      is enabled.  */
+   if (TREE_STATIC (decl) && flag_section_anchors)
+     return false;
+ 
    if (TREE_STATIC (decl))
      return (alignment <= MAX_OFILE_ALIGNMENT);
    else
Index: gcc/testsuite/gcc.dg/vect/vect-2.c
===================================================================
--- gcc/testsuite/gcc.dg/vect/vect-2.c	(revision 185379)
+++ gcc/testsuite/gcc.dg/vect/vect-2.c	(working copy)
@@ -6,7 +6,7 @@
 #define N 16
 
 char cb[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
-char ca[N];
+char ca[N] = {};
 
 __attribute__ ((noinline)) 
 int main1 ()
Index: gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-34.c
===================================================================
--- gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-34.c	(revision 185379)
+++ gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-34.c	(working copy)
@@ -7,7 +7,7 @@
  
 struct {
   char ca[N];
-} s;
+} s = {};
 char cb[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
 
 __attribute__ ((noinline))
Index: gcc/testsuite/gcc.target/i386/recip-vec-divf.c
===================================================================
--- gcc/testsuite/gcc.target/i386/recip-vec-divf.c	(revision 185379)
+++ gcc/testsuite/gcc.target/i386/recip-vec-divf.c	(working copy)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -ffast-math -ftree-vectorize -msse -mfpmath=sse -mrecip" } */
+/* { dg-options "-O2 -ffast-math -ftree-vectorize -msse -mfpmath=sse -mrecip -fno-common" } */
 
 float a[4];
 float b[4];
Index: gcc/testsuite/gcc.target/i386/recip-vec-sqrtf.c
===================================================================
--- gcc/testsuite/gcc.target/i386/recip-vec-sqrtf.c	(revision 185379)
+++ gcc/testsuite/gcc.target/i386/recip-vec-sqrtf.c	(working copy)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -ffast-math -ftree-vectorize -msse -mfpmath=sse -mrecip" } */
+/* { dg-options "-O2 -ffast-math -ftree-vectorize -msse -mfpmath=sse -mrecip -fno-common" } */
 
 float a[4];
 float b[4];


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]