diff options
author | Kyrylo Tkachov <kyrylo.tkachov@arm.com> | 2017-02-14 10:33:50 +0000 |
---|---|---|
committer | Kyrylo Tkachov <ktkachov@gcc.gnu.org> | 2017-02-14 10:33:50 +0000 |
commit | f6cc254a285a61e122ea64316a2726ae7286289d (patch) | |
tree | b136843347f7179a9cd9e54b7fe04e9e391057b6 /gcc | |
parent | b48d6421892860b065d69730f6fa8c757f6f6357 (diff) | |
download | gcc-f6cc254a285a61e122ea64316a2726ae7286289d.zip gcc-f6cc254a285a61e122ea64316a2726ae7286289d.tar.gz gcc-f6cc254a285a61e122ea64316a2726ae7286289d.tar.bz2 |
[ARM] PR rtl-optimization/68664 Implement TARGET_SCHED_CAN_SPECULATE_INSN hook
PR rtl-optimization/68664
* config/arm/arm.c (arm_sched_can_speculate_insn):
New function. Declare prototype.
(TARGET_SCHED_CAN_SPECULATE_INSN): Define.
From-SVN: r245425
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/arm/arm.c | 33 |
2 files changed, 40 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d603091..2692bac 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,13 @@ 2017-02-14 Kyrylo Tkachov <kyrylo.tkachov@arm.com> PR rtl-optimization/68664 + * config/arm/arm.c (arm_sched_can_speculate_insn): + New function. Declare prototype. + (TARGET_SCHED_CAN_SPECULATE_INSN): Define. + +2017-02-14 Kyrylo Tkachov <kyrylo.tkachov@arm.com> + + PR rtl-optimization/68664 * config/aarch64/aarch64.c (aarch64_sched_can_speculate_insn): New function. (TARGET_SCHED_CAN_SPECULATE_INSN): Define. diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index bd5b699..3e482b5 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -240,6 +240,7 @@ static bool arm_can_inline_p (tree, tree); static void arm_relayout_function (tree); static bool arm_valid_target_attribute_p (tree, tree, tree, int); static unsigned HOST_WIDE_INT arm_shift_truncation_mask (machine_mode); +static bool arm_sched_can_speculate_insn (rtx_insn *); static bool arm_macro_fusion_p (void); static bool arm_cannot_copy_insn_p (rtx_insn *); static int arm_issue_rate (void); @@ -419,6 +420,9 @@ static const struct attribute_spec arm_attribute_table[] = #undef TARGET_COMP_TYPE_ATTRIBUTES #define TARGET_COMP_TYPE_ATTRIBUTES arm_comp_type_attributes +#undef TARGET_SCHED_CAN_SPECULATE_INSN +#define TARGET_SCHED_CAN_SPECULATE_INSN arm_sched_can_speculate_insn + #undef TARGET_SCHED_MACRO_FUSION_P #define TARGET_SCHED_MACRO_FUSION_P arm_macro_fusion_p @@ -30078,6 +30082,35 @@ arm_fusion_enabled_p (tune_params::fuse_ops op) return current_tune->fusible_ops & op; } +/* Implement TARGET_SCHED_CAN_SPECULATE_INSN. Return true if INSN can be + scheduled for speculative execution. Reject the long-running division + and square-root instructions. */ + +static bool +arm_sched_can_speculate_insn (rtx_insn *insn) +{ + switch (get_attr_type (insn)) + { + case TYPE_SDIV: + case TYPE_UDIV: + case TYPE_FDIVS: + case TYPE_FDIVD: + case TYPE_FSQRTS: + case TYPE_FSQRTD: + case TYPE_NEON_FP_SQRT_S: + case TYPE_NEON_FP_SQRT_D: + case TYPE_NEON_FP_SQRT_S_Q: + case TYPE_NEON_FP_SQRT_D_Q: + case TYPE_NEON_FP_DIV_S: + case TYPE_NEON_FP_DIV_D: + case TYPE_NEON_FP_DIV_S_Q: + case TYPE_NEON_FP_DIV_D_Q: + return false; + default: + return true; + } +} + /* Implement the TARGET_ASAN_SHADOW_OFFSET hook. */ static unsigned HOST_WIDE_INT |