+2014-01-07 Richard Sandiford <rdsandiford@googlemail.com>
+
+ PR target/58115
+ * target-globals.c (save_target_globals): Remove this_fn_optab
+ handling.
+ * toplev.c: Include optabs.h.
+ (target_reinit): Temporarily restore the global options if another
+ set of options are in force.
+
2014-01-07 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/58668
save_target_globals (void)
{
struct target_globals *g;
- struct target_optabs *saved_this_fn_optabs = this_fn_optabs;
g = ggc_alloc_target_globals ();
g->flag_state = XCNEW (struct target_flag_state);
g->bb_reorder = XCNEW (struct target_bb_reorder);
g->lower_subreg = XCNEW (struct target_lower_subreg);
restore_target_globals (g);
- this_fn_optabs = this_target_optabs;
init_reg_sets ();
target_reinit ();
- this_fn_optabs = saved_this_fn_optabs;
return g;
}
#include "diagnostic-color.h"
#include "context.h"
#include "pass_manager.h"
+#include "optabs.h"
#if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO)
#include "dbxout.h"
{
struct rtl_data saved_x_rtl;
rtx *saved_regno_reg_rtx;
+ tree saved_optimization_current_node;
+ struct target_optabs *saved_this_fn_optabs;
+
+ /* Temporarily switch to the default optimization node, so that
+ *this_target_optabs is set to the default, not reflecting
+ whatever a previous function used for the optimize
+ attribute. */
+ saved_optimization_current_node = optimization_current_node;
+ saved_this_fn_optabs = this_fn_optabs;
+ if (saved_optimization_current_node != optimization_default_node)
+ {
+ optimization_current_node = optimization_default_node;
+ cl_optimization_restore
+ (&global_options,
+ TREE_OPTIMIZATION (optimization_default_node));
+ }
+ this_fn_optabs = this_target_optabs;
/* Save *crtl and regno_reg_rtx around the reinitialization
to allow target_reinit being called even after prepare_function_start. */
/* Reinitialize lang-dependent parts. */
lang_dependent_init_target ();
- /* And restore it at the end, as free_after_compilation from
+ /* Restore the original optimization node. */
+ if (saved_optimization_current_node != optimization_default_node)
+ {
+ optimization_current_node = saved_optimization_current_node;
+ cl_optimization_restore (&global_options,
+ TREE_OPTIMIZATION (optimization_current_node));
+ }
+ this_fn_optabs = saved_this_fn_optabs;
+
+ /* Restore regno_reg_rtx at the end, as free_after_compilation from
expand_dummy_function_end clears it. */
if (saved_regno_reg_rtx)
{