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
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];