Commit acfc1ac1 by Kyrylo Tkachov Committed by Kyrylo Tkachov

[AArch64] PR target/70002: Make aarch64_set_current_function play nice with pragma resetting

	PR target/70002
	* config/aarch64/aarch64-protos.h
	(aarch64_save_restore_target_globals): New prototype.
	* config/aarch64/aarch64-c.c (aarch64_pragma_target_parse):
	Call the above when popping pragma.
	* config/aarch64/aarch64.c (aarch64_save_restore_target_globals):
	New function.
	(aarch64_set_current_function): Rewrite using the above.

	PR target/70002
	PR target/69245
	* gcc.target/aarch64/pr69245_2.c: New test.

From-SVN: r234141
parent d1e2bb2d
2016-03-11 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR target/70002
* config/aarch64/aarch64-protos.h
(aarch64_save_restore_target_globals): New prototype.
* config/aarch64/aarch64-c.c (aarch64_pragma_target_parse):
Call the above when popping pragma.
* config/aarch64/aarch64.c (aarch64_save_restore_target_globals):
New function.
(aarch64_set_current_function): Rewrite using the above.
2016-03-11 Jakub Jelinek <jakub@redhat.com> 2016-03-11 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/70177 PR tree-optimization/70177
......
...@@ -178,6 +178,11 @@ aarch64_pragma_target_parse (tree args, tree pop_target) ...@@ -178,6 +178,11 @@ aarch64_pragma_target_parse (tree args, tree pop_target)
cpp_opts->warn_unused_macros = saved_warn_unused_macros; cpp_opts->warn_unused_macros = saved_warn_unused_macros;
/* If we're popping or reseting make sure to update the globals so that
the optab availability predicates get recomputed. */
if (pop_target)
aarch64_save_restore_target_globals (pop_target);
/* Initialize SIMD builtins if we haven't already. /* Initialize SIMD builtins if we haven't already.
Set current_target_pragma to NULL for the duration so that Set current_target_pragma to NULL for the duration so that
the builtin initialization code doesn't try to tag the functions the builtin initialization code doesn't try to tag the functions
......
...@@ -360,6 +360,7 @@ void aarch64_emit_call_insn (rtx); ...@@ -360,6 +360,7 @@ void aarch64_emit_call_insn (rtx);
void aarch64_register_pragmas (void); void aarch64_register_pragmas (void);
void aarch64_relayout_simd_types (void); void aarch64_relayout_simd_types (void);
void aarch64_reset_previous_fndecl (void); void aarch64_reset_previous_fndecl (void);
void aarch64_save_restore_target_globals (tree);
void aarch64_emit_approx_rsqrt (rtx, rtx); void aarch64_emit_approx_rsqrt (rtx, rtx);
/* Initialize builtins for SIMD intrinsics. */ /* Initialize builtins for SIMD intrinsics. */
......
...@@ -8577,6 +8577,21 @@ aarch64_reset_previous_fndecl (void) ...@@ -8577,6 +8577,21 @@ aarch64_reset_previous_fndecl (void)
aarch64_previous_fndecl = NULL; aarch64_previous_fndecl = NULL;
} }
/* Restore or save the TREE_TARGET_GLOBALS from or to NEW_TREE.
Used by aarch64_set_current_function and aarch64_pragma_target_parse to
make sure optab availability predicates are recomputed when necessary. */
void
aarch64_save_restore_target_globals (tree new_tree)
{
if (TREE_TARGET_GLOBALS (new_tree))
restore_target_globals (TREE_TARGET_GLOBALS (new_tree));
else if (new_tree == target_option_default_node)
restore_target_globals (&default_target_globals);
else
TREE_TARGET_GLOBALS (new_tree) = save_target_globals_default_opts ();
}
/* Implement TARGET_SET_CURRENT_FUNCTION. Unpack the codegen decisions /* Implement TARGET_SET_CURRENT_FUNCTION. Unpack the codegen decisions
like tuning and ISA features from the DECL_FUNCTION_SPECIFIC_TARGET like tuning and ISA features from the DECL_FUNCTION_SPECIFIC_TARGET
of the function, if such exists. This function may be called multiple of the function, if such exists. This function may be called multiple
...@@ -8586,63 +8601,32 @@ aarch64_reset_previous_fndecl (void) ...@@ -8586,63 +8601,32 @@ aarch64_reset_previous_fndecl (void)
static void static void
aarch64_set_current_function (tree fndecl) aarch64_set_current_function (tree fndecl)
{ {
if (!fndecl || fndecl == aarch64_previous_fndecl)
return;
tree old_tree = (aarch64_previous_fndecl tree old_tree = (aarch64_previous_fndecl
? DECL_FUNCTION_SPECIFIC_TARGET (aarch64_previous_fndecl) ? DECL_FUNCTION_SPECIFIC_TARGET (aarch64_previous_fndecl)
: NULL_TREE); : NULL_TREE);
tree new_tree = (fndecl tree new_tree = DECL_FUNCTION_SPECIFIC_TARGET (fndecl);
? DECL_FUNCTION_SPECIFIC_TARGET (fndecl)
: NULL_TREE);
if (fndecl && fndecl != aarch64_previous_fndecl) /* If current function has no attributes but the previous one did,
{ use the default node. */
aarch64_previous_fndecl = fndecl; if (!new_tree && old_tree)
if (old_tree == new_tree) new_tree = target_option_default_node;
;
else if (new_tree) /* If nothing to do, return. #pragma GCC reset or #pragma GCC pop to
{ the default have been handled by aarch64_save_restore_target_globals from
cl_target_option_restore (&global_options, aarch64_pragma_target_parse. */
TREE_TARGET_OPTION (new_tree)); if (old_tree == new_tree)
if (TREE_TARGET_GLOBALS (new_tree)) return;
restore_target_globals (TREE_TARGET_GLOBALS (new_tree));
else
TREE_TARGET_GLOBALS (new_tree)
= save_target_globals_default_opts ();
}
else if (old_tree && old_tree != target_option_default_node) aarch64_previous_fndecl = fndecl;
{
new_tree = target_option_current_node;
cl_target_option_restore (&global_options,
TREE_TARGET_OPTION (new_tree));
if (TREE_TARGET_GLOBALS (new_tree))
restore_target_globals (TREE_TARGET_GLOBALS (new_tree));
else if (new_tree == target_option_default_node)
restore_target_globals (&default_target_globals);
else
TREE_TARGET_GLOBALS (new_tree)
= save_target_globals_default_opts ();
}
}
if (!fndecl) /* First set the target options. */
return; cl_target_option_restore (&global_options, TREE_TARGET_OPTION (new_tree));
/* If we turned on SIMD make sure that any vector parameters are re-laid out aarch64_save_restore_target_globals (new_tree);
so that they use proper vector modes. */
if (TARGET_SIMD)
{
tree parms = DECL_ARGUMENTS (fndecl);
for (; parms && parms != void_list_node; parms = TREE_CHAIN (parms))
{
if (TREE_CODE (parms) == PARM_DECL
&& VECTOR_TYPE_P (TREE_TYPE (parms))
&& DECL_MODE (parms) != TYPE_MODE (TREE_TYPE (parms)))
relayout_decl (parms);
}
}
} }
/* Enum describing the various ways we can handle attributes. /* Enum describing the various ways we can handle attributes.
......
2016-03-11 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR target/70002
PR target/69245
* gcc.target/aarch64/pr69245_2.c: New test.
2016-03-11 Jakub Jelinek <jakub@redhat.com> 2016-03-11 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/70177 PR tree-optimization/70177
......
/* { dg-do compile } */
/* { dg-options "-O2 -march=armv8-a+fp" } */
#pragma GCC push_options
#pragma GCC target "arch=armv8-a+nofp"
static void
fn1 ()
{
}
#pragma GCC pop_options
float
fn2 (float a)
{
return a + 2.0;
}
/* { dg-final { scan-assembler-not "__addsf3" } } */
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