aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>2017-02-14 10:33:50 +0000
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>2017-02-14 10:33:50 +0000
commitf6cc254a285a61e122ea64316a2726ae7286289d (patch)
treeb136843347f7179a9cd9e54b7fe04e9e391057b6 /gcc
parentb48d6421892860b065d69730f6fa8c757f6f6357 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/config/arm/arm.c33
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