PR85678: Change default to -fno-common

GCC currently defaults to -fcommon.  As discussed in the PR, this is an ancient
C feature which is not conforming with the latest C standards.  On many targets
this means global variable accesses have a codesize and performance penalty.
This applies to C code only, C++ code is not affected by -fcommon.  It is about
time to change the default.

    gcc/
	PR85678
	* common.opt (fcommon): Change init to 1.
	* invoke.texi (-fcommon): Update documentation.

    testsuite/
	* g++.dg/lto/odr-6_1.c: Add -fcommon.
	* gcc.dg/alias-15.c: Likewise.
	* gcc.dg/fdata-sections-1.c: Likewise.	
	* gcc.dg/ipa/pr77653.c: Likewise.
	* gcc.dg/lto/20090729_0.c: Likewise.
	* gcc.dg/lto/20111207-1_0.c: Likewise.
	* gcc.dg/lto/c-compatible-types-1_0.c: Likewise.
	* gcc.dg/lto/pr55525_0.c: Likewise.
	* gcc.dg/lto/pr88077_0.c: Use long to avoid alignment warning.
	* gcc.dg/lto/pr88077_1.c: Add -fcommon.
	* gcc.target/aarch64/sve/peel_ind_1.c: Allow ANCHOR0.
	* gcc.target/aarch64/sve/peel_ind_2.c: Likewise.
	* gcc.target/aarch64/sve/peel_ind_3.c: Likewise.
	* gcc.target/i386/volatile-bitfields-2.c: Allow movl or movq.

From-SVN: r278509
This commit is contained in:
Wilco Dijkstra 2019-11-20 16:29:23 +00:00 committed by Wilco Dijkstra
parent 83115e9eb8
commit 6271dd984d
18 changed files with 57 additions and 38 deletions

View file

@ -1,3 +1,9 @@
2019-11-20 Wilco Dijkstra <wdijkstr@arm.com>
PR85678
* common.opt (fcommon): Change init to 1.
* doc/invoke.texi (-fcommon): Update documentation.
2019-11-20 Jan Hubicka <jh@suse.cz>
* fibonacci_heap.h (fibonacci_heap<K,V>::consolidate): Turn auto_vec

View file

@ -1131,7 +1131,7 @@ Common Report Var(flag_combine_stack_adjustments) Optimization
Looks for opportunities to reduce stack adjustments and stack references.
fcommon
Common Report Var(flag_no_common,0)
Common Report Var(flag_no_common,0) Init(1)
Put uninitialized globals in the common section.
fcompare-debug

View file

@ -569,7 +569,7 @@ Objective-C and Objective-C++ Dialects}.
-fnon-call-exceptions -fdelete-dead-exceptions -funwind-tables @gol
-fasynchronous-unwind-tables @gol
-fno-gnu-unique @gol
-finhibit-size-directive -fno-common -fno-ident @gol
-finhibit-size-directive -fcommon -fno-ident @gol
-fpcc-struct-return -fpic -fPIC -fpie -fPIE -fno-plt @gol
-fno-jump-tables @gol
-frecord-gcc-switches @gol
@ -14112,35 +14112,27 @@ useful for building programs to run under WINE@.
code that is not binary compatible with code generated without that switch.
Use it to conform to a non-default application binary interface.
@item -fno-common
@opindex fno-common
@item -fcommon
@opindex fcommon
@opindex fno-common
@cindex tentative definitions
In C code, this option controls the placement of global variables
defined without an initializer, known as @dfn{tentative definitions}
in the C standard. Tentative definitions are distinct from declarations
In C code, this option controls the placement of global variables
defined without an initializer, known as @dfn{tentative definitions}
in the C standard. Tentative definitions are distinct from declarations
of a variable with the @code{extern} keyword, which do not allocate storage.
Unix C compilers have traditionally allocated storage for
uninitialized global variables in a common block. This allows the
linker to resolve all tentative definitions of the same variable
in different compilation units to the same object, or to a non-tentative
definition.
This is the behavior specified by @option{-fcommon}, and is the default for
GCC on most targets.
On the other hand, this behavior is not required by ISO
C, and on some targets may carry a speed or code size penalty on
variable references.
The default is @option{-fno-common}, which specifies that the compiler places
uninitialized global variables in the BSS section of the object file.
This inhibits the merging of tentative definitions by the linker so you get a
multiple-definition error if the same variable is accidentally defined in more
than one compilation unit.
The @option{-fno-common} option specifies that the compiler should instead
place uninitialized global variables in the BSS section of the object file.
This inhibits the merging of tentative definitions by the linker so
you get a multiple-definition error if the same
variable is defined in more than one compilation unit.
Compiling with @option{-fno-common} is useful on targets for which
it provides better performance, or if you wish to verify that the
program will work on other systems that always treat uninitialized
variable definitions this way.
The @option{-fcommon} places uninitialized global variables in a common block.
This allows the linker to resolve all tentative definitions of the same variable
in different compilation units to the same object, or to a non-tentative
definition. This behavior does not conform to ISO C, is inconsistent with C++,
and on many targets implies a speed and code size penalty on global variable
references. It is mainly useful to enable legacy code to link without errors.
@item -fno-ident
@opindex fno-ident

View file

@ -1,3 +1,21 @@
2019-11-20 Wilco Dijkstra <wdijkstr@arm.com>
PR85678
* g++.dg/lto/odr-6_1.c: Add -fcommon.
* gcc.dg/alias-15.c: Likewise.
* gcc.dg/fdata-sections-1.c: Likewise.
* gcc.dg/ipa/pr77653.c: Likewise.
* gcc.dg/lto/20090729_0.c: Likewise.
* gcc.dg/lto/20111207-1_0.c: Likewise.
* gcc.dg/lto/c-compatible-types-1_0.c: Likewise.
* gcc.dg/lto/pr55525_0.c: Likewise.
* gcc.dg/lto/pr88077_0.c: Use long to avoid alignment warning.
* gcc.dg/lto/pr88077_1.c: Add -fcommon.
* gcc.target/aarch64/sve/peel_ind_1.c: Allow ANCHOR0.
* gcc.target/aarch64/sve/peel_ind_2.c: Likewise.
* gcc.target/aarch64/sve/peel_ind_3.c: Likewise.
* gcc.target/i386/volatile-bitfields-2.c: Allow movl or movq.
2019-11-20 Richard Biener <rguenther@suse.de>
* gcc.dg/vect/bb-slp-42.c: Adjust.

View file

@ -1,3 +1,4 @@
/* { dg-options {-fcommon} } */
struct {} admbaserest_; // { dg-lto-message "type of " 2 }

View file

@ -1,5 +1,5 @@
/* { dg-do compile } */
/* { dg-additional-options "-O2 -fdump-ipa-cgraph" } */
/* { dg-additional-options "-O2 -fcommon -fdump-ipa-cgraph" } */
/* RTL-level CSE shouldn't introduce LCO (for the string) into varpool */
char *p;

View file

@ -2,7 +2,7 @@
/* Origin: Jonathan Larmour <jifl-bugzilla@jifvik.org> */
/* { dg-do compile { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
/* { dg-options "-fdata-sections" } */
/* { dg-options "-fcommon -fdata-sections" } */
int x;

View file

@ -1,5 +1,5 @@
/* { dg-require-alias "" } */
/* { dg-options "-O2 -fdump-ipa-icf-details" } */
/* { dg-options "-O2 -fcommon -fdump-ipa-icf-details" } */
int a, b, c, d, e, h, i, j, k, l;
const int f;

View file

@ -1,4 +1,4 @@
/* { dg-lto-options "-w" } */
/* { dg-lto-options { {-fcommon -w} {-fcommon} } } */
double i;
int j;

View file

@ -1,4 +1,4 @@
/* { dg-lto-do run } */
/* { dg-lto-options { { -flto } } } */
/* { dg-lto-options { { -flto -fcommon } {-fcommon} {-fcommon} {-fcommon} } } */
/* { dg-require-linker-plugin "" } */
/* { dg-extra-ld-options "-fuse-linker-plugin" } */

View file

@ -1,5 +1,5 @@
/* { dg-lto-do run } */
/* { dg-lto-options "-O3" } */
/* { dg-lto-options { {-O3 -fcommon} {-fcommon} } } */
/* By C standard Each enumerated type shall be compatible with char, a signed
integer, type, or an unsigned integer type. The choice of type is

View file

@ -1,5 +1,5 @@
/* { dg-lto-do link } */
/* { dg-lto-options { { -flto -w } } } */
/* { dg-lto-options { { -fcommon -flto -w } } } */
char s[sizeof (char *)];
int main(void)

View file

@ -1,3 +1,3 @@
/* { dg-lto-do link } */
int HeaderStr;
long HeaderStr;

View file

@ -1,3 +1,5 @@
/* { dg-options {-fcommon} } */
char HeaderStr[1];
int main()

View file

@ -21,7 +21,7 @@ foo (void)
}
/* We should operate on aligned vectors. */
/* { dg-final { scan-assembler {\t(adrp|adr)\tx[0-9]+, x\n} } } */
/* { dg-final { scan-assembler {\t(adrp|adr)\tx[0-9]+, (x|\.LANCHOR0)\n} } } */
/* We should use an induction that starts at -5, with only the last
7 elements of the first iteration being active. */
/* { dg-final { scan-assembler {\tindex\tz[0-9]+\.s, #-5, #5\n} } } */

View file

@ -17,7 +17,7 @@ foo (void)
}
/* We should operate on aligned vectors. */
/* { dg-final { scan-assembler {\t(adrp|adr)\tx[0-9]+, x\n} } } */
/* { dg-final { scan-assembler {\t(adrp|adr)\tx[0-9]+, (x|\.LANCHOR0)\n} } } */
/* We should unroll the loop three times. */
/* { dg-final { scan-assembler-times "\tst1w\t" 3 } } */
/* { dg-final { scan-assembler {\tptrue\t(p[0-9]+)\.s, vl7\n.*\teor\tp[0-7]\.b, (p[0-7])/z, (\1\.b, \2\.b|\2\.b, \1\.b)\n} } } */

View file

@ -17,5 +17,5 @@ foo (int start)
}
/* We should operate on aligned vectors. */
/* { dg-final { scan-assembler {\t(adrp|adr)\tx[0-9]+, x\n} } } */
/* { dg-final { scan-assembler {\t(adrp|adr)\tx[0-9]+, (x|\.LANCHOR0)\n} } } */
/* { dg-final { scan-assembler {\tubfx\t} } } */

View file

@ -14,4 +14,4 @@ int foo ()
return bits.b;
}
/* { dg-final { scan-assembler "movl.*bits" } } */
/* { dg-final { scan-assembler "mov(q|l).*bits" } } */