Commit 4d209853 by Martin Liska Committed by Martin Liska

Introduce -fprofile-update=prefer-atomic

	PR bootstrap/78069
	* common.opt: Add prefer-atomic as a new enum value for
	-fprofile-update.
	* coretypes.h: Likewise.
	* doc/invoke.texi: Document the new option value.
	* gcc.c: Replace atomic with prefer-atomic.  Remove warning.
	* tree-profile.c (tree_profiling): Select default value
	of -fprofile-update when 'prefer-atomic' is selected.
	PR bootstrap/78069
	* gcc.dg/no_profile_instrument_function-attr-1.c: Update test
	to match scanned pattern.
	* gcc.dg/tree-ssa/ssa-lim-11.c: Likewise.

From-SVN: r242386
parent f6b9a2a0
2016-11-14 Martin Liska <mliska@suse.cz>
PR bootstrap/78069
* common.opt: Add prefer-atomic as a new enum value for
-fprofile-update.
* coretypes.h: Likewise.
* doc/invoke.texi: Document the new option value.
* gcc.c: Replace atomic with prefer-atomic. Remove warning.
* tree-profile.c (tree_profiling): Select default value
of -fprofile-update when 'prefer-atomic' is selected.
2016-11-14 Wilco Dijkstra <wdijkstr@arm.com> 2016-11-14 Wilco Dijkstra <wdijkstr@arm.com>
* config/arm/cortex-a57.md (cortex_a57_alu): Move extend here, bfm... * config/arm/cortex-a57.md (cortex_a57_alu): Move extend here, bfm...
...@@ -1959,7 +1959,7 @@ Enable correction of flow inconsistent profile data input. ...@@ -1959,7 +1959,7 @@ Enable correction of flow inconsistent profile data input.
fprofile-update= fprofile-update=
Common Joined RejectNegative Enum(profile_update) Var(flag_profile_update) Init(PROFILE_UPDATE_SINGLE) Common Joined RejectNegative Enum(profile_update) Var(flag_profile_update) Init(PROFILE_UPDATE_SINGLE)
-fprofile-update=[single|atomic] Set the profile update method. -fprofile-update=[single|atomic|prefer-atomic] Set the profile update method.
Enum Enum
Name(profile_update) Type(enum profile_update) UnknownError(unknown profile update method %qs) Name(profile_update) Type(enum profile_update) UnknownError(unknown profile update method %qs)
...@@ -1970,6 +1970,9 @@ Enum(profile_update) String(single) Value(PROFILE_UPDATE_SINGLE) ...@@ -1970,6 +1970,9 @@ Enum(profile_update) String(single) Value(PROFILE_UPDATE_SINGLE)
EnumValue EnumValue
Enum(profile_update) String(atomic) Value(PROFILE_UPDATE_ATOMIC) Enum(profile_update) String(atomic) Value(PROFILE_UPDATE_ATOMIC)
EnumValue
Enum(profile_update) String(prefer-atomic) Value(PROFILE_UPDATE_PREFER_ATOMIC)
fprofile-generate fprofile-generate
Common Common
Enable common options for generating profile info for profile feedback directed optimizations. Enable common options for generating profile info for profile feedback directed optimizations.
......
...@@ -177,7 +177,8 @@ enum offload_abi { ...@@ -177,7 +177,8 @@ enum offload_abi {
/* Types of profile update methods. */ /* Types of profile update methods. */
enum profile_update { enum profile_update {
PROFILE_UPDATE_SINGLE, PROFILE_UPDATE_SINGLE,
PROFILE_UPDATE_ATOMIC PROFILE_UPDATE_ATOMIC,
PROFILE_UPDATE_PREFER_ATOMIC
}; };
/* Types of unwind/exception handling info that can be generated. */ /* Types of unwind/exception handling info that can be generated. */
......
...@@ -10504,13 +10504,18 @@ To optimize the program based on the collected profile information, use ...@@ -10504,13 +10504,18 @@ To optimize the program based on the collected profile information, use
Alter the update method for an application instrumented for profile Alter the update method for an application instrumented for profile
feedback based optimization. The @var{method} argument should be one of feedback based optimization. The @var{method} argument should be one of
@samp{single} or @samp{atomic}. The first one is useful for single-threaded @samp{single}, @samp{atomic} or @samp{prefer-atomic}.
applications, while the second one prevents profile corruption by emitting The first one is useful for single-threaded applications,
thread-safe code. while the second one prevents profile corruption by emitting thread-safe code.
@strong{Warning:} When an application does not properly join all threads @strong{Warning:} When an application does not properly join all threads
(or creates an detached thread), a profile file can be still corrupted. (or creates an detached thread), a profile file can be still corrupted.
Using @samp{prefer-atomic} would be transformed either to @samp{atomic},
when supported by a target, or to @samp{single} otherwise. The GCC driver
automatically selects @samp{prefer-atomic} when @option{-pthread}
is present in the command line.
@item -fsanitize=address @item -fsanitize=address
@opindex fsanitize=address @opindex fsanitize=address
Enable AddressSanitizer, a fast memory error detector. Enable AddressSanitizer, a fast memory error detector.
......
...@@ -1144,11 +1144,7 @@ static const char *cc1_options = ...@@ -1144,11 +1144,7 @@ static const char *cc1_options =
%{coverage:-fprofile-arcs -ftest-coverage}\ %{coverage:-fprofile-arcs -ftest-coverage}\
%{fprofile-arcs|fprofile-generate*|coverage:\ %{fprofile-arcs|fprofile-generate*|coverage:\
%{!fprofile-update=single:\ %{!fprofile-update=single:\
%{pthread:-fprofile-update=atomic}}}\ %{pthread:-fprofile-update=prefer-atomic}}}";
%{fprofile-update=single:\
%{fprofile-arcs|fprofile-generate*|coverage:\
%{pthread:%n-fprofile-update=atomic should be used\
for a multithreaded application}}}";
static const char *asm_options = static const char *asm_options =
"%{-target-help:%:print-asm-header()} " "%{-target-help:%:print-asm-header()} "
......
2016-11-14 Martin Liska <mliska@suse.cz>
PR bootstrap/78069
* gcc.dg/no_profile_instrument_function-attr-1.c: Update test
to match scanned pattern.
* gcc.dg/tree-ssa/ssa-lim-11.c: Likewise.
2016-11-14 Richard Biener <rguenther@suse.de> 2016-11-14 Richard Biener <rguenther@suse.de>
PR tree-optimization/78312 PR tree-optimization/78312
......
/* { dg-options "-O2 -fprofile-generate -fdump-tree-optimized" } */ /* { dg-options "-O2 -fprofile-generate -fprofile-update=single -fdump-tree-optimized" } */
__attribute__ ((no_profile_instrument_function)) __attribute__ ((no_profile_instrument_function))
int foo() int foo()
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O -fprofile-arcs -fdump-tree-lim2-details" } */ /* { dg-options "-O -fprofile-arcs -fprofile-update=single -fdump-tree-lim2-details" } */
/* { dg-require-profiling "-fprofile-generate" } */ /* { dg-require-profiling "-fprofile-generate" } */
struct thread_param struct thread_param
......
...@@ -592,25 +592,26 @@ tree_profiling (void) ...@@ -592,25 +592,26 @@ tree_profiling (void)
struct cgraph_node *node; struct cgraph_node *node;
/* Verify whether we can utilize atomic update operations. */ /* Verify whether we can utilize atomic update operations. */
if (flag_profile_update == PROFILE_UPDATE_ATOMIC) bool can_support_atomic = false;
unsigned HOST_WIDE_INT gcov_type_size
= tree_to_uhwi (TYPE_SIZE_UNIT (get_gcov_type ()));
if (gcov_type_size == 4)
can_support_atomic
= HAVE_sync_compare_and_swapsi || HAVE_atomic_compare_and_swapsi;
else if (gcov_type_size == 8)
can_support_atomic
= HAVE_sync_compare_and_swapdi || HAVE_atomic_compare_and_swapdi;
if (flag_profile_update == PROFILE_UPDATE_ATOMIC
&& !can_support_atomic)
{ {
bool can_support = false; warning (0, "target does not support atomic profile update, "
unsigned HOST_WIDE_INT gcov_type_size "single mode is selected");
= tree_to_uhwi (TYPE_SIZE_UNIT (get_gcov_type ())); flag_profile_update = PROFILE_UPDATE_SINGLE;
if (gcov_type_size == 4)
can_support
= HAVE_sync_compare_and_swapsi || HAVE_atomic_compare_and_swapsi;
else if (gcov_type_size == 8)
can_support
= HAVE_sync_compare_and_swapdi || HAVE_atomic_compare_and_swapdi;
if (!can_support)
{
warning (0, "target does not support atomic profile update, "
"single mode is selected");
flag_profile_update = PROFILE_UPDATE_SINGLE;
}
} }
else if (flag_profile_update == PROFILE_UPDATE_PREFER_ATOMIC)
flag_profile_update = can_support_atomic
? PROFILE_UPDATE_ATOMIC : PROFILE_UPDATE_SINGLE;
/* This is a small-ipa pass that gets called only once, from /* This is a small-ipa pass that gets called only once, from
cgraphunit.c:ipa_passes(). */ cgraphunit.c:ipa_passes(). */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment