mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
44e824996b
commit
2b7e2984ce
|
@ -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>
|
2009-10-29 Michael Matz <matz@suse.de>
|
||||||
|
|
||||||
* tree-ssa-math-opts.c (execute_convert_to_rsqrt): Remove.
|
* tree-ssa-math-opts.c (execute_convert_to_rsqrt): Remove.
|
||||||
|
|
|
@ -7825,6 +7825,8 @@ parse_optimize_options (tree args, bool attr_p)
|
||||||
/* Now parse the options. */
|
/* Now parse the options. */
|
||||||
decode_options (opt_argc, opt_argv);
|
decode_options (opt_argc, opt_argv);
|
||||||
|
|
||||||
|
targetm.override_options_after_change();
|
||||||
|
|
||||||
/* Don't allow changing -fstrict-aliasing. */
|
/* Don't allow changing -fstrict-aliasing. */
|
||||||
flag_strict_aliasing = saved_flag_strict_aliasing;
|
flag_strict_aliasing = saved_flag_strict_aliasing;
|
||||||
|
|
||||||
|
|
|
@ -303,6 +303,7 @@ static enum machine_mode ia64_promote_function_mode (const_tree,
|
||||||
const_tree,
|
const_tree,
|
||||||
int);
|
int);
|
||||||
static void ia64_trampoline_init (rtx, tree, rtx);
|
static void ia64_trampoline_init (rtx, tree, rtx);
|
||||||
|
static void ia64_override_options_after_change (void);
|
||||||
|
|
||||||
/* Table of valid machine attributes. */
|
/* Table of valid machine attributes. */
|
||||||
static const struct attribute_spec ia64_attribute_table[] =
|
static const struct attribute_spec ia64_attribute_table[] =
|
||||||
|
@ -536,6 +537,9 @@ static const struct attribute_spec ia64_attribute_table[] =
|
||||||
#undef TARGET_TRAMPOLINE_INIT
|
#undef TARGET_TRAMPOLINE_INIT
|
||||||
#define TARGET_TRAMPOLINE_INIT ia64_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;
|
struct gcc_target targetm = TARGET_INITIALIZER;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
|
@ -5504,6 +5508,25 @@ ia64_override_options (void)
|
||||||
flag_ira_loop_pressure = 1;
|
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;
|
ia64_flag_schedule_insns2 = flag_schedule_insns_after_reload;
|
||||||
flag_schedule_insns_after_reload = 0;
|
flag_schedule_insns_after_reload = 0;
|
||||||
|
|
||||||
|
@ -5525,18 +5548,6 @@ ia64_override_options (void)
|
||||||
a transformation. */
|
a transformation. */
|
||||||
flag_auto_inc_dec = 0;
|
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. */
|
/* Initialize the record of emitted frame related registers. */
|
||||||
|
|
|
@ -814,8 +814,22 @@ parsed.
|
||||||
|
|
||||||
Don't use this macro to turn on various extra optimizations for
|
Don't use this macro to turn on various extra optimizations for
|
||||||
@option{-O}. That is what @code{OPTIMIZATION_OPTIONS} is 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
|
@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
|
@defmac C_COMMON_OVERRIDE_OPTIONS
|
||||||
This is similar to @code{OVERRIDE_OPTIONS} but is only used in the C
|
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
|
language frontends (C, Objective-C, C++, Objective-C++) and so can be
|
||||||
|
|
|
@ -327,6 +327,7 @@ for (i = 0; i < n_opt_char; i++) {
|
||||||
print " " var_opt_char[i] " = ptr->" var_opt_char[i] ";";
|
print " " var_opt_char[i] " = ptr->" var_opt_char[i] ";";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
print " targetm.override_options_after_change ();";
|
||||||
print "}";
|
print "}";
|
||||||
|
|
||||||
print "";
|
print "";
|
||||||
|
|
|
@ -410,6 +410,8 @@
|
||||||
|
|
||||||
#define TARGET_DEFAULT_TARGET_FLAGS 0
|
#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_HANDLE_OPTION hook_bool_size_t_constcharptr_int_true
|
||||||
#define TARGET_HELP NULL
|
#define TARGET_HELP NULL
|
||||||
|
|
||||||
|
@ -905,6 +907,7 @@
|
||||||
TARGET_SCHED, \
|
TARGET_SCHED, \
|
||||||
TARGET_VECTORIZE, \
|
TARGET_VECTORIZE, \
|
||||||
TARGET_DEFAULT_TARGET_FLAGS, \
|
TARGET_DEFAULT_TARGET_FLAGS, \
|
||||||
|
TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE, \
|
||||||
TARGET_HANDLE_OPTION, \
|
TARGET_HANDLE_OPTION, \
|
||||||
TARGET_HELP, \
|
TARGET_HELP, \
|
||||||
TARGET_EH_RETURN_FILTER_MODE, \
|
TARGET_EH_RETURN_FILTER_MODE, \
|
||||||
|
|
|
@ -500,6 +500,11 @@ struct gcc_target
|
||||||
/* The initial value of target_flags. */
|
/* The initial value of target_flags. */
|
||||||
int default_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
|
/* 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
|
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
|
value of ARG if CODE specifies a UInteger option, otherwise it is
|
||||||
|
|
Loading…
Reference in New Issue