diff options
author | Richard Earnshaw <rearnsha@arm.com> | 2016-12-15 16:01:55 +0000 |
---|---|---|
committer | Richard Earnshaw <rearnsha@gcc.gnu.org> | 2016-12-15 16:01:55 +0000 |
commit | 56941f70ee29e73d41771be9a197d03a9c2f2d05 (patch) | |
tree | da7040c9a5762f34f1257d94e0e135c9690ed687 /gcc | |
parent | a53613c4ae9ad153ce5d12fdfef413c9e9ae82d6 (diff) | |
download | gcc-56941f70ee29e73d41771be9a197d03a9c2f2d05.zip gcc-56941f70ee29e73d41771be9a197d03a9c2f2d05.tar.gz gcc-56941f70ee29e73d41771be9a197d03a9c2f2d05.tar.bz2 |
[arm] Use ISA feature sets for determining inlinability
Now that we can construct the build target isa from the cl_target_options
data we can use this to determine inlinability. This eliminates the
final remaining use of the FPU features field.
* arm.c (arm_can_inline_p): Use ISA features for determining
inlinability.
From-SVN: r243714
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/arm/arm.c | 27 |
2 files changed, 24 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index da2edc7..2258bf8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2016-12-15 Richard Earnshaw <rearnsha@arm.com> + * arm.c (arm_can_inline_p): Use ISA features for determining + inlinability. + +2016-12-15 Richard Earnshaw <rearnsha@arm.com> + * arm-protos.h (arm_configure_build_target): Change second argument to cl_target_options. * arm.c (arm_configure_build_target): Likewise. diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index df520e5..1d3bb89 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -30227,6 +30227,7 @@ arm_can_inline_p (tree caller, tree callee) { tree caller_tree = DECL_FUNCTION_SPECIFIC_TARGET (caller); tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (callee); + bool can_inline = true; struct cl_target_option *caller_opts = TREE_TARGET_OPTION (caller_tree ? caller_tree @@ -30236,19 +30237,29 @@ arm_can_inline_p (tree caller, tree callee) = TREE_TARGET_OPTION (callee_tree ? callee_tree : target_option_default_node); - const struct arm_fpu_desc *caller_fpu - = &all_fpus[caller_opts->x_arm_fpu_index]; - const struct arm_fpu_desc *callee_fpu - = &all_fpus[callee_opts->x_arm_fpu_index]; + if (callee_opts == caller_opts) + return true; - /* Callee's fpu features should be a subset of the caller's. */ - if ((caller_fpu->features & callee_fpu->features) != callee_fpu->features) - return false; + /* Callee's ISA features should be a subset of the caller's. */ + struct arm_build_target caller_target; + struct arm_build_target callee_target; + caller_target.isa = sbitmap_alloc (isa_num_bits); + callee_target.isa = sbitmap_alloc (isa_num_bits); + + arm_configure_build_target (&caller_target, caller_opts, &global_options_set, + false); + arm_configure_build_target (&callee_target, callee_opts, &global_options_set, + false); + if (!bitmap_subset_p (callee_target.isa, caller_target.isa)) + can_inline = false; + + sbitmap_free (caller_target.isa); + sbitmap_free (callee_target.isa); /* OK to inline between different modes. Function with mode specific instructions, e.g using asm, must be explicitly protected with noinline. */ - return true; + return can_inline; } /* Hook to fix function's alignment affected by target attribute. */ |