re PR middle-end/37565 (__optimize__ attribute doesn't work correctly)

2009-10-29  Steve Ellcey  <sje@cup.hp.com>

	PR middle-end/37565
	PR target/38018
	* doc/tm.texi (OVERRIDE_OPTIONS): Update.
	(TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE): New.
	* optc-gen.awk (cl_target_option_restore): Include call to 
	targetm.override_options_after_change.
	* target-def.h (TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE): New.
	* target.h (override_options_after_change): New.
	* c-common.c (parse_optimize_options): Call
	targetm.override_options_after_change.
	* config/ia64/ia64.c (TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE): New.
	(ia64_override_options_after_change): New.
	(ia64_override_options) Add call to above.

From-SVN: r153714
This commit is contained in:
Steve Ellcey 2009-10-29 16:44:02 +00:00 committed by Steve Ellcey
parent 44e824996b
commit 2b7e2984ce
7 changed files with 64 additions and 12 deletions

View File

@ -1,3 +1,19 @@
2009-10-29 Steve Ellcey <sje@cup.hp.com>
PR middle-end/37565
PR target/38018
* doc/tm.texi (OVERRIDE_OPTIONS): Update.
(TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE): New.
* optc-gen.awk (cl_target_option_restore): Include call to
targetm.override_options_after_change.
* target-def.h (TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE): New.
* target.h (override_options_after_change): New.
* c-common.c (parse_optimize_options): Call
targetm.override_options_after_change.
* config/ia64/ia64.c (TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE): New.
(ia64_override_options_after_change): New.
(ia64_override_options) Add call to above.
2009-10-29 Michael Matz <matz@suse.de>
* tree-ssa-math-opts.c (execute_convert_to_rsqrt): Remove.

View File

@ -7825,6 +7825,8 @@ parse_optimize_options (tree args, bool attr_p)
/* Now parse the options. */
decode_options (opt_argc, opt_argv);
targetm.override_options_after_change();
/* Don't allow changing -fstrict-aliasing. */
flag_strict_aliasing = saved_flag_strict_aliasing;

View File

@ -303,6 +303,7 @@ static enum machine_mode ia64_promote_function_mode (const_tree,
const_tree,
int);
static void ia64_trampoline_init (rtx, tree, rtx);
static void ia64_override_options_after_change (void);
/* Table of valid machine attributes. */
static const struct attribute_spec ia64_attribute_table[] =
@ -536,6 +537,9 @@ static const struct attribute_spec ia64_attribute_table[] =
#undef TARGET_TRAMPOLINE_INIT
#define TARGET_TRAMPOLINE_INIT ia64_trampoline_init
#undef TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE
#define TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE ia64_override_options_after_change
struct gcc_target targetm = TARGET_INITIALIZER;
typedef enum
@ -5504,6 +5508,25 @@ ia64_override_options (void)
flag_ira_loop_pressure = 1;
ia64_section_threshold = g_switch_set ? g_switch_value : IA64_DEFAULT_GVALUE;
init_machine_status = ia64_init_machine_status;
if (align_functions <= 0)
align_functions = 64;
if (align_loops <= 0)
align_loops = 32;
if (TARGET_ABI_OPEN_VMS)
flag_no_common = 1;
ia64_override_options_after_change();
}
/* Implement targetm.override_options_after_change. */
static void
ia64_override_options_after_change (void)
{
ia64_flag_schedule_insns2 = flag_schedule_insns_after_reload;
flag_schedule_insns_after_reload = 0;
@ -5525,18 +5548,6 @@ ia64_override_options (void)
a transformation. */
flag_auto_inc_dec = 0;
}
ia64_section_threshold = g_switch_set ? g_switch_value : IA64_DEFAULT_GVALUE;
init_machine_status = ia64_init_machine_status;
if (align_functions <= 0)
align_functions = 64;
if (align_loops <= 0)
align_loops = 32;
if (TARGET_ABI_OPEN_VMS)
flag_no_common = 1;
}
/* Initialize the record of emitted frame related registers. */

View File

@ -814,8 +814,22 @@ parsed.
Don't use this macro to turn on various extra optimizations for
@option{-O}. That is what @code{OPTIMIZATION_OPTIONS} is for.
If you need to do something whenever the optimization level is
changed via the optimize attribute or pragma, see
@code{TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE}
@end defmac
@deftypefn {Target Hook} void TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE (void)
This target function is similar to the macro @code{OVERRIDE_OPTIONS}
but is called when the optimize level is changed via an attribute or
pragma or when it is reset at the end of the code affected by the
attribute or pragma. It is not called at the beginning of compilation
when @code{OVERRIDE_OPTIONS} is called so if you want to perform these
actions then, you should have @code{OVERRIDE_OPTIONS} call
@code{TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE}.
@end deftypefn
@defmac C_COMMON_OVERRIDE_OPTIONS
This is similar to @code{OVERRIDE_OPTIONS} but is only used in the C
language frontends (C, Objective-C, C++, Objective-C++) and so can be

View File

@ -327,6 +327,7 @@ for (i = 0; i < n_opt_char; i++) {
print " " var_opt_char[i] " = ptr->" var_opt_char[i] ";";
}
print " targetm.override_options_after_change ();";
print "}";
print "";

View File

@ -410,6 +410,8 @@
#define TARGET_DEFAULT_TARGET_FLAGS 0
#define TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE hook_void_void
#define TARGET_HANDLE_OPTION hook_bool_size_t_constcharptr_int_true
#define TARGET_HELP NULL
@ -905,6 +907,7 @@
TARGET_SCHED, \
TARGET_VECTORIZE, \
TARGET_DEFAULT_TARGET_FLAGS, \
TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE, \
TARGET_HANDLE_OPTION, \
TARGET_HELP, \
TARGET_EH_RETURN_FILTER_MODE, \

View File

@ -500,6 +500,11 @@ struct gcc_target
/* The initial value of target_flags. */
int default_target_flags;
/* Allow target specific overriding of option settings after options have
been changed by an attribute or pragma or when it is reset at the
end of the code affected by an attribute or pragma. */
void (* override_options_after_change) (void);
/* Handle target switch CODE (an OPT_* value). ARG is the argument
passed to the switch; it is NULL if no argument was. VALUE is the
value of ARG if CODE specifies a UInteger option, otherwise it is