re PR rtl-optimization/65862 ([MIPS] IRA/LRA issue: integers spilled to floating...
authorVladimir Makarov <vmakarov@redhat.com>
Thu, 14 May 2015 20:40:44 +0000 (20:40 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Thu, 14 May 2015 20:40:44 +0000 (20:40 +0000)
2015-05-14  Vladimir Makarov  <vmakarov@redhat.com>

PR rtl-optimization/65862
* target.def (ira_change_pseudo_allocno_class): New hook.
* targhooks.c (default_ira_change_pseudo_allocno_class): Default
value of the hook.
* targhooks.h (default_ira_change_pseudo_allocno_class): New
extern
* doc/tm.texi.in (TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS): Add the
hook.
* ira-costs.c (find_costs_and_classes): Call the hook and change
classes when it is necessary.
* doc/tm.texi: Update.

From-SVN: r223202

gcc/ChangeLog
gcc/doc/tm.texi
gcc/doc/tm.texi.in
gcc/ira-costs.c
gcc/target.def
gcc/targhooks.c
gcc/targhooks.h

index 97aa0ebe3416c4a9d729ebf9b2e7c7f059f73e2a..bf28867ac4da17f328d12ec0ea9d9ca574fc76ec 100644 (file)
@@ -1,3 +1,17 @@
+2015-05-14  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/65862
+       * target.def (ira_change_pseudo_allocno_class): New hook.
+       * targhooks.c (default_ira_change_pseudo_allocno_class): Default
+       value of the hook.
+       * targhooks.h (default_ira_change_pseudo_allocno_class): New
+       extern
+       * doc/tm.texi.in (TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS): Add the
+       hook.
+       * ira-costs.c (find_costs_and_classes): Call the hook and change
+       classes when it is necessary.
+       * doc/tm.texi: Update.
+
 2015-05-14  Alexander Monakov  <amonakov@ispras.ru>
 
        * config/i386/i386.md (sibcall_memory): Check that register with
index 9886f4ad2a98bf14bb1c9a99b98869ee73af2793..3a89eee7933c21bfac9f71d95998e33ad0086190 100644 (file)
@@ -2837,6 +2837,13 @@ as below:
 @end smallexample
 @end defmac
 
+@deftypefn {Target Hook} reg_class_t TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS (int, @var{reg_class_t})
+A target hook which can change allocno class for given pseudo from
+  allocno class calculated by IRA.
+  
+  The default version of this target hook always returns given class.
+@end deftypefn
+
 @deftypefn {Target Hook} bool TARGET_LRA_P (void)
 A target hook which returns true if we use LRA instead of reload pass.  It means that LRA was ported to the target.    The default version of this target hook returns always false.
 @end deftypefn
index 707d61042848ca88d57c6c8f0b80f2c7985d642b..e76b8a05e906ad6a3137e8fb63fee21393950347 100644 (file)
@@ -2475,6 +2475,8 @@ as below:
 @end smallexample
 @end defmac
 
+@hook TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS
+
 @hook TARGET_LRA_P
 
 @hook TARGET_REGISTER_PRIORITY
index fa6aec44db0ca7d1182d9d69946d180057cc30aa..b5c9bdd17c747340fa1426fa43d12973f9aa0329 100644 (file)
@@ -1636,7 +1636,7 @@ find_costs_and_classes (FILE *dump_file)
   int i, k, start, max_cost_classes_num;
   int pass;
   basic_block bb;
-  enum reg_class *regno_best_class;
+  enum reg_class *regno_best_class, new_class;
 
   init_recog ();
   regno_best_class
@@ -1878,6 +1878,18 @@ find_costs_and_classes (FILE *dump_file)
              ira_assert (regno_aclass[i] != NO_REGS
                          && ira_reg_allocno_class_p[regno_aclass[i]]);
            }
+         if ((new_class
+              = (reg_class) (targetm.ira_change_pseudo_allocno_class
+                             (i, regno_aclass[i]))) != regno_aclass[i])
+           {
+             regno_aclass[i] = new_class;
+             if (hard_reg_set_subset_p (reg_class_contents[new_class],
+                                        reg_class_contents[best]))
+               best = new_class;
+             if (hard_reg_set_subset_p (reg_class_contents[new_class],
+                                        reg_class_contents[alt_class]))
+               alt_class = new_class;
+           }
          if (pass == flag_expensive_optimizations)
            {
              if (best_cost > i_mem_cost)
index eba992102aa730ba3903e4f7aa2838e76c1b563e..f2cb81dff05162597ea48231f13333536c20d613 100644 (file)
@@ -4763,6 +4763,16 @@ This is currently used only by the C and C++ front ends.",
  tree, (tree type, tree expr),
  hook_tree_tree_tree_null)
 
+/* Change pseudo allocno class calculated by IRA.  */
+DEFHOOK
+(ira_change_pseudo_allocno_class,
+ "A target hook which can change allocno class for given pseudo from\n\
+  allocno class calculated by IRA.\n\
+  \n\
+  The default version of this target hook always returns given class.",
+ reg_class_t, (int, reg_class_t),
+ default_ira_change_pseudo_allocno_class)
+
 /* Return true if we use LRA instead of reload.  */
 DEFHOOK
 (lra_p,
index 806ff8cd51234f4d55dd8a1167e4af360b84a258..44fcd9b6a1239014e32a1af663884ef06eedb346 100644 (file)
@@ -914,6 +914,13 @@ default_branch_target_register_class (void)
   return NO_REGS;
 }
 
+reg_class_t
+default_ira_change_pseudo_allocno_class (int regno ATTRIBUTE_UNUSED,
+                                        reg_class_t cl)
+{
+  return cl;
+}
+
 extern bool
 default_lra_p (void)
 {
index 12a44ee8e72405f38b5d7ef192c806493f105fc3..5ae991d12508ed7c8fae37e971c59fc695f7521f 100644 (file)
@@ -140,6 +140,7 @@ extern rtx default_static_chain (const_tree, bool);
 extern void default_trampoline_init (rtx, tree, rtx);
 extern int default_return_pops_args (tree, tree, int);
 extern reg_class_t default_branch_target_register_class (void);
+extern reg_class_t default_ira_change_pseudo_allocno_class (int, reg_class_t);
 extern bool default_lra_p (void);
 extern int default_register_priority (int);
 extern bool default_register_usage_leveling_p (void);