diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2013-02-19 00:04:49 +0000 |
---|---|---|
committer | Aldy Hernandez <aldyh@gcc.gnu.org> | 2013-02-19 00:04:49 +0000 |
commit | 135204ddd3bf1f3885db364c109bf977f5067e8f (patch) | |
tree | 7a29bd18e10dbd4f5b64765ae5b8f07a5bda81db /gcc/function.c | |
parent | f6007d99f88822a517d15c6e56dcbfa66e8b5dec (diff) | |
download | gcc-135204ddd3bf1f3885db364c109bf977f5067e8f.zip gcc-135204ddd3bf1f3885db364c109bf977f5067e8f.tar.gz gcc-135204ddd3bf1f3885db364c109bf977f5067e8f.tar.bz2 |
re PR target/52555 (ICE unrecognizable insn with -ffast-math and __attribute__((optimize(xx))))
PR target/52555
* genopinit.c (raw_optab_handler): Use this_fn_optabs.
(swap_optab_enable): Same.
(init_all_optabs): Use argument instead of global.
* tree.h (struct tree_optimization_option): New field
target_optabs.
* expr.h (init_all_optabs): Add argument to prototype.
(TREE_OPTIMIZATION_OPTABS): New.
(save_optabs_if_changed): Protoize.
* optabs.h: Declare this_fn_optabs.
* optabs.c (save_optabs_if_changed): New.
Declare this_fn_optabs.
(init_optabs): Add argument to init_all_optabs() call.
* function.c (invoke_set_current_function_hook): Handle per
function optabs.
* function.h (struct function): New field optabs.
* config/mips/mips.c (mips_set_mips16_mode): Handle when
optimization_current_node has changed.
* target-globals.h (save_target_globals_default_opts): Protoize.
* target-globals.c (save_target_globals_default_opts): New.
c-family/
* c-common.c (handle_optimize_attribute): Call
save_optabs_if_changed.
Co-Authored-By: Jakub Jelinek <jakub@redhat.com>
From-SVN: r196129
Diffstat (limited to 'gcc/function.c')
-rw-r--r-- | gcc/function.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/gcc/function.c b/gcc/function.c index 4ce2259..1b41cf2 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -4400,6 +4400,26 @@ invoke_set_current_function_hook (tree fndecl) } targetm.set_current_function (fndecl); + + if (opts == optimization_default_node) + this_fn_optabs = this_target_optabs; + else + { + struct function *fn = DECL_STRUCT_FUNCTION (fndecl); + if (fn->optabs == NULL) + { + if (this_target_optabs == &default_target_optabs) + fn->optabs = TREE_OPTIMIZATION_OPTABS (opts); + else + { + fn->optabs = (unsigned char *) + ggc_alloc_atomic (sizeof (struct target_optabs)); + init_all_optabs ((struct target_optabs *) fn->optabs); + } + } + this_fn_optabs = fn->optabs ? (struct target_optabs *) fn->optabs + : this_target_optabs; + } } } |