]> gcc.gnu.org Git - gcc.git/commitdiff
arm.h (MAX_CONDITIONAL_EXECUTE): Define macro.
authorGreta Yorsh <greta.yorsh@arm.com>
Wed, 26 Jun 2013 09:40:40 +0000 (10:40 +0100)
committerGreta Yorsh <gretay@gcc.gnu.org>
Wed, 26 Jun 2013 09:40:40 +0000 (10:40 +0100)
2013-06-26  Greta Yorsh  <Greta.Yorsh@arm.com>

* config/arm/arm.h (MAX_CONDITIONAL_EXECUTE): Define macro.
* config/arm/arm-protos.h (arm_max_conditional_execute): New
declaration.
(tune_params): Update comment.
* config/arm/arm.c (arm_cortex_a15_tune): Set max_cond_insns to 2.
(arm_max_conditional_execute): New function.
(thumb2_final_prescan_insn): Use max_insn_skipped and
MAX_INSN_PER_IT_BLOCK to compute maximum instructions in a block.

From-SVN: r200419

gcc/ChangeLog
gcc/config/arm/arm-protos.h
gcc/config/arm/arm.c
gcc/config/arm/arm.h

index 33715dc8db9d12052194733de51cb1409cd71047..88e09bf2e59b8e206e09a7248a39fb450fe8f98b 100644 (file)
@@ -1,3 +1,14 @@
+2013-06-26  Greta Yorsh  <Greta.Yorsh@arm.com>
+
+       * config/arm/arm.h (MAX_CONDITIONAL_EXECUTE): Define macro.
+       * config/arm/arm-protos.h (arm_max_conditional_execute): New
+       declaration.
+       (tune_params): Update comment.
+       * config/arm/arm.c (arm_cortex_a15_tune): Set max_cond_insns to 2.
+       (arm_max_conditional_execute): New function.
+       (thumb2_final_prescan_insn): Use max_insn_skipped and
+       MAX_INSN_PER_IT_BLOCK to compute maximum instructions in a block.
+
 2013-06-25  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/57705
index a426432061daa69e865cb0ee00ef43b698119919..ef94bbcea25ad3260bbba2b86748950871232a9d 100644 (file)
@@ -228,6 +228,8 @@ extern const char *arm_mangle_type (const_tree);
 
 extern void arm_order_regs_for_local_alloc (void);
 
+extern int arm_max_conditional_execute ();
+
 /* Vectorizer cost model implementation.  */
 struct cpu_vec_costs {
   const int scalar_stmt_cost;   /* Cost of any scalar operation, excluding
@@ -257,8 +259,7 @@ struct tune_params
   bool (*rtx_costs) (rtx, RTX_CODE, RTX_CODE, int *, bool);
   bool (*sched_adjust_cost) (rtx, rtx, rtx, int *);
   int constant_limit;
-  /* Maximum number of instructions to conditionalise in
-     arm_final_prescan_insn.  */
+  /* Maximum number of instructions to conditionalise.  */
   int max_insns_skipped;
   int num_prefetch_slots;
   int l1_cache_size;
index 88187ab69a74de21b0ad9058a9d2e2116880b5d9..e6fd42079cbe42c32d8c4712276865c8e08be8ee 100644 (file)
@@ -1059,7 +1059,7 @@ const struct tune_params arm_cortex_a15_tune =
   arm_9e_rtx_costs,
   NULL,
   1,                                           /* Constant limit.  */
-  5,                                           /* Max cond insns.  */
+  2,                                           /* Max cond insns.  */
   ARM_PREFETCH_NOT_BENEFICIAL,
   false,                                       /* Prefer constant pool.  */
   arm_default_branch_cost,
@@ -9145,6 +9145,12 @@ arm_adjust_cost (rtx insn, rtx link, rtx dep, int cost)
   return cost;
 }
 
+int
+arm_max_conditional_execute (void)
+{
+  return max_insns_skipped;
+}
+
 static int
 arm_default_branch_cost (bool speed_p, bool predictable_p ATTRIBUTE_UNUSED)
 {
@@ -19567,6 +19573,13 @@ thumb2_final_prescan_insn (rtx insn)
   enum arm_cond_code code;
   int n;
   int mask;
+  int max;
+
+  /* Maximum number of conditionally executed instructions in a block
+     is minimum of the two max values: maximum allowed in an IT block
+     and maximum that is beneficial according to the cost model and tune.  */
+  max = (max_insns_skipped < MAX_INSN_PER_IT_BLOCK) ?
+    max_insns_skipped : MAX_INSN_PER_IT_BLOCK;
 
   /* Remove the previous insn from the count of insns to be output.  */
   if (arm_condexec_count)
@@ -19609,9 +19622,9 @@ thumb2_final_prescan_insn (rtx insn)
       /* ??? Recognize conditional jumps, and combine them with IT blocks.  */
       if (GET_CODE (body) != COND_EXEC)
        break;
-      /* Allow up to 4 conditionally executed instructions in a block.  */
+      /* Maximum number of conditionally executed instructions in a block.  */
       n = get_attr_ce_count (insn);
-      if (arm_condexec_masklen + n > MAX_INSN_PER_IT_BLOCK)
+      if (arm_condexec_masklen + n > max)
        break;
 
       predicate = COND_EXEC_TEST (body);
index 3a49a90c184246f71957fb84bdc64d64ecc7e78d..387d2717431c374777000875e03f85d7423e20f2 100644 (file)
@@ -183,6 +183,11 @@ extern arm_cc arm_current_cc;
 
 #define ARM_INVERSE_CONDITION_CODE(X)  ((arm_cc) (((int)X) ^ 1))
 
+/* The maximaum number of instructions that is beneficial to
+   conditionally execute. */
+#undef MAX_CONDITIONAL_EXECUTE
+#define MAX_CONDITIONAL_EXECUTE arm_max_conditional_execute ()
+
 extern int arm_target_label;
 extern int arm_ccfsm_state;
 extern GTY(()) rtx arm_target_insn;
This page took 0.117311 seconds and 5 git commands to generate.