aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Earnshaw <rearnsha@arm.com>2016-12-15 16:01:55 +0000
committerRichard Earnshaw <rearnsha@gcc.gnu.org>2016-12-15 16:01:55 +0000
commit56941f70ee29e73d41771be9a197d03a9c2f2d05 (patch)
treeda7040c9a5762f34f1257d94e0e135c9690ed687 /gcc
parenta53613c4ae9ad153ce5d12fdfef413c9e9ae82d6 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/config/arm/arm.c27
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. */