target.def (register_usage_leveling_p): New hook.
authorVladimir Makarov <vmakarov@redhat.com>
Thu, 30 May 2013 20:30:38 +0000 (20:30 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Thu, 30 May 2013 20:30:38 +0000 (20:30 +0000)
2013-05-30  Vladimir Makarov  <vmakarov@redhat.com>

* target.def (register_usage_leveling_p): New hook.
* targhooks.c (default_register_usage_leveling_p): New.
* targhooks.h (default_register_usage_leveling_p): New prototype.
* lra-assigns.c (register_usage_leveling_p): Use the hook.
* doc/tm.texi.in (TARGET_REGISTER_USAGE_LEVELING_P): New hook.
* doc/tm.texi: Update.
* config/i386/i386.c (TARGET_REGISTER_USAGE_LEVELING_P): Define.

From-SVN: r199459

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/doc/tm.texi
gcc/doc/tm.texi.in
gcc/lra-assigns.c
gcc/target.def
gcc/targhooks.c
gcc/targhooks.h

index f73640a97ec24dc12562538072499f66f7e79928..ddd2a30fbf6adb17526867719c2148050e7abed0 100644 (file)
@@ -1,3 +1,13 @@
+2013-05-30  Vladimir Makarov  <vmakarov@redhat.com>
+
+       * target.def (register_usage_leveling_p): New hook.
+       * targhooks.c (default_register_usage_leveling_p): New.
+       * targhooks.h (default_register_usage_leveling_p): New prototype.
+       * lra-assigns.c (register_usage_leveling_p): Use the hook.
+       * doc/tm.texi.in (TARGET_REGISTER_USAGE_LEVELING_P): New hook.
+       * doc/tm.texi: Update.
+       * config/i386/i386.c (TARGET_REGISTER_USAGE_LEVELING_P): Define.
+
 2013-05-30  Ian Bolton  <ian.bolton@arm.com>
 
        * config/aarch64/aarch64.md (insv<mode>): New define_expand.
index c37108b81bd6e59ce6fd23fd62d73962bdccf2dd..e8f47c9d417dbbd6d55cbeb7c7548f8324f4c2fd 100644 (file)
@@ -42812,6 +42812,9 @@ ix86_memmodel_check (unsigned HOST_WIDE_INT val)
 #undef TARGET_REGISTER_PRIORITY
 #define TARGET_REGISTER_PRIORITY ix86_register_priority
 
+#undef TARGET_REGISTER_USAGE_LEVELING_P
+#define TARGET_REGISTER_USAGE_LEVELING_P hook_bool_void_true
+
 #undef TARGET_LEGITIMATE_CONSTANT_P
 #define TARGET_LEGITIMATE_CONSTANT_P ix86_legitimate_constant_p
 
index cfde14af8acda8d4a348e90f1b19f542c34c87ad..f8404814c965bb72d18c7a1a057432e350358a82 100644 (file)
@@ -2898,6 +2898,10 @@ A target hook which returns true if we use LRA instead of reload pass.  It means
 A target hook which returns the register priority number to which the  register @var{hard_regno} belongs to.  The bigger the number, the  more preferable the hard register usage (when all other conditions are  the same).  This hook can be used to prefer some hard register over  others in LRA.  For example, some x86-64 register usage needs  additional prefix which makes instructions longer.  The hook can  return lower priority number for such registers make them less favorable  and as result making the generated code smaller.    The default version of this target hook returns always zero.
 @end deftypefn
 
+@deftypefn {Target Hook} bool TARGET_REGISTER_USAGE_LEVELING_P (void)
+A target hook which returns true if we need register usage leveling.  That means if a few hard registers are equally good for the  assignment, we choose the least used hard register.  The register  usage leveling may be profitable for some targets.  Don't use the  usage leveling for targets with conditional execution or targets  with big register files as it hurts if-conversion and cross-jumping  optimizations.    The default version of this target hook returns always false.
+@end deftypefn
+
 @deftypefn {Target Hook} bool TARGET_DIFFERENT_ADDR_DISPLACEMENT_P (void)
 A target hook which returns true if an address with the same structure  can have different maximal legitimate displacement.  For example, the  displacement can depend on memory mode or on operand combinations in  the insn.    The default version of this target hook returns always false.
 @end deftypefn
index 611d6813a56eb2369f1a12d44797dd6f4a0cee12..b08dece763aca1b0de075b6dbf2f9ba1cf857915 100644 (file)
@@ -2870,6 +2870,8 @@ as below:
 
 @hook TARGET_REGISTER_PRIORITY
 
+@hook TARGET_REGISTER_USAGE_LEVELING_P
+
 @hook TARGET_DIFFERENT_ADDR_DISPLACEMENT_P
 
 @hook TARGET_SPILL_CLASS
index 78bc2e7fcf6dac7d70acdf6d6ae8986be899309b..9719f0dc9e70fa3a58fa58305d891c7027c2b21a 100644 (file)
@@ -603,11 +603,7 @@ find_hard_regno_for (int regno, int *cost, int try_only_hard_regno)
          if (best_hard_regno < 0 || hard_regno_costs[hard_regno] < best_cost
              || (hard_regno_costs[hard_regno] == best_cost
                  && (priority > best_priority
-                     /* Hard register usage leveling actually results
-                        in bigger code for targets with conditional
-                        execution like ARM because it reduces chance
-                        of if-conversion after LRA.  */
-                     || (! targetm.have_conditional_execution ()
+                     || (targetm.register_usage_leveling_p ()
                          && priority == best_priority
                          && best_usage > lra_hard_reg_usage[hard_regno]))))
            {
index f4776a8df3773f637751b8baef5d7cd6e94ba036..3ba3e0a24541e598a4f6812478052540b80860ee 100644 (file)
@@ -2444,6 +2444,21 @@ DEFHOOK
  int, (int),
  default_register_priority)
 
+/* Return true if we need register usage leveling.  */
+DEFHOOK
+(register_usage_leveling_p,
+ "A target hook which returns true if we need register usage leveling.\
+  That means if a few hard registers are equally good for the\
+  assignment, we choose the least used hard register.  The register\
+  usage leveling may be profitable for some targets.  Don't use the\
+  usage leveling for targets with conditional execution or targets\
+  with big register files as it hurts if-conversion and cross-jumping\
+  optimizations.\
+  \
+  The default version of this target hook returns always false.",
+ bool, (void),
+ default_register_usage_leveling_p)
+
 /* Return true if maximal address displacement can be different.  */
 DEFHOOK
 (different_addr_displacement_p,
index 80b4aa6bafd9ae1590c119f0ca777e432a6842f2..d3a3f5fdd425da66ea9efe11f2bd6238194a6153 100644 (file)
@@ -858,6 +858,12 @@ default_register_priority (int hard_regno ATTRIBUTE_UNUSED)
   return 0;
 }
 
+extern bool
+default_register_usage_leveling_p (void)
+{
+  return false;
+}
+
 extern bool
 default_different_addr_displacement_p (void)
 {
index ce10ebc947b73f5637970399158ffa92c23d8c5f..2da6fb80631eb77dd9db8769cbf9355cb8405ba5 100644 (file)
@@ -135,6 +135,7 @@ extern int default_return_pops_args (tree, tree, int);
 extern reg_class_t default_branch_target_register_class (void);
 extern bool default_lra_p (void);
 extern int default_register_priority (int);
+extern bool default_register_usage_leveling_p (void);
 extern bool default_different_addr_displacement_p (void);
 extern reg_class_t default_secondary_reload (bool, rtx, reg_class_t,
                                             enum machine_mode,