target.def (additional_allocno_class_p): New.
authorVladimir Makarov <vmakarov@redhat.com>
Thu, 10 Nov 2016 17:04:31 +0000 (17:04 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Thu, 10 Nov 2016 17:04:31 +0000 (17:04 +0000)
2016-11-10  Vladimir Makarov  <vmakarov@redhat.com>

* target.def (additional_allocno_class_p): New.
* hooks.h (hook_bool_reg_class_t_false): New prototype.
* hooks.c (hook_bool_reg_class_t_false): New.
* ira.c (setup_allocno_and_important_classes): Use the new hook.
* doc/tm.texi.in (TARGET_ADDITIONAL_ALLOCNO_CLASS_P): Add it.
* doc/tm.texi: Update.

From-SVN: r242043

gcc/ChangeLog
gcc/doc/tm.texi
gcc/doc/tm.texi.in
gcc/hooks.c
gcc/hooks.h
gcc/ira.c
gcc/target.def

index 4a380cbf46053562356601fc62a62a0ba9070a5f..a87a17f13416b071032c6655e3cdf5e7bf29f069 100644 (file)
@@ -1,3 +1,12 @@
+2016-11-10  Vladimir Makarov  <vmakarov@redhat.com>
+
+       * target.def (additional_allocno_class_p): New.
+       * hooks.h (hook_bool_reg_class_t_false): New prototype.
+       * hooks.c (hook_bool_reg_class_t_false): New.
+       * ira.c (setup_allocno_and_important_classes): Use the new hook.
+       * doc/tm.texi.in (TARGET_ADDITIONAL_ALLOCNO_CLASS_P): Add it.
+       * doc/tm.texi: Update.
+
 2016-11-10  Jason Merrill  <jason@redhat.com>
 
        * gengtype.c (new_structure): Append to structures list.
index 81c63b71bffa9b23de4cc9c3c22bb074521c6090..85341aeeacea531ae2c8bc1e043eac376b6e2214 100644 (file)
@@ -2899,6 +2899,10 @@ addressing.
 This hook defines a class of registers which could be used for spilling  pseudos of the given mode and class, or @code{NO_REGS} if only memory  should be used.  Not defining this hook is equivalent to returning  @code{NO_REGS} for all inputs.
 @end deftypefn
 
+@deftypefn {Target Hook} bool TARGET_ADDITIONAL_ALLOCNO_CLASS_P (reg_class_t)
+This hook should return @code{true} if given class of registers should  be an allocno class in any way.  Usually RA uses only one register  class from all classes containing the same register set.  In some  complicated cases, you need to have two or more such classes as  allocno ones for RA correct work.  Not defining this hook is  equivalent to returning @code{false} for all inputs.
+@end deftypefn
+
 @deftypefn {Target Hook} machine_mode TARGET_CSTORE_MODE (enum insn_code @var{icode})
 This hook defines the machine mode to use for the boolean result of  conditional store patterns.  The ICODE argument is the instruction code  for the cstore being performed.  Not definiting this hook is the same  as accepting the mode encoded into operand 0 of the cstore expander  patterns.
 @end deftypefn
index 74e9200f749b799e7c6b9858169fbe65bdf11b47..400d574f3fa9e4b144cf2780e3edf5b9478e66c7 100644 (file)
@@ -2507,6 +2507,8 @@ value that the middle-end intended.
 
 @hook TARGET_SPILL_CLASS
 
+@hook TARGET_ADDITIONAL_ALLOCNO_CLASS_P
+
 @hook TARGET_CSTORE_MODE
 
 @hook TARGET_COMPUTE_PRESSURE_CLASSES
index 3995786d7c2a5ac09f1dfdb07f6d4e89f7d9d74d..6fed2c506c8bdb65093c61c2ab6953e4a36cdd48 100644 (file)
@@ -466,3 +466,11 @@ hook_bool_uint_uintp_false (unsigned int, unsigned int *)
 {
   return false;
 }
+
+/* Generic hook that takes a register class and returns false.  */
+bool
+hook_bool_reg_class_t_false (reg_class_t regclass ATTRIBUTE_UNUSED)
+{
+  return false;
+}
+
index a1d67769c44b779e5962b77c96f982c8e252080f..e59b42e3a7f10b6e85688d6509f70729b207f516 100644 (file)
@@ -55,6 +55,7 @@ extern bool hook_bool_rtx_insn_true (rtx_insn *);
 extern bool hook_bool_rtx_false (rtx);
 extern bool hook_bool_rtx_insn_int_false (rtx_insn *, int);
 extern bool hook_bool_uintp_uintp_false (unsigned int *, unsigned int *);
+extern bool hook_bool_reg_class_t_false (reg_class_t regclass);
 extern bool hook_bool_rtx_mode_int_int_intp_bool_false (rtx, machine_mode,
                                                        int, int, int *, bool);
 extern bool hook_bool_tree_tree_false (tree, tree);
index f453ea9e60445bfead0d75738010a8d80a0f1452..315b8470b7f28690cf493d61b2f18fea085a2e77 100644 (file)
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -1012,7 +1012,7 @@ setup_allocno_and_important_classes (void)
                                    temp_hard_regset2))
            break;
        }
-      if (j >= n)
+      if (j >= n || targetm.additional_allocno_class_p (i))
        classes[n++] = (enum reg_class) i;
       else if (i == GENERAL_REGS)
        /* Prefer general regs.  For i386 example, it means that
index bcdbc0e245258a3c23a952bdffae7009b39f671a..caeeff9c22ac7c577245f0e367d695da09212155 100644 (file)
@@ -5029,6 +5029,18 @@ DEFHOOK
  reg_class_t, (reg_class_t, machine_mode),
  NULL)
 
+/* Determine an additional allocno class.  */
+DEFHOOK
+(additional_allocno_class_p,
+ "This hook should return @code{true} if given class of registers should\
+  be an allocno class in any way.  Usually RA uses only one register\
+  class from all classes containing the same register set.  In some\
+  complicated cases, you need to have two or more such classes as\
+  allocno ones for RA correct work.  Not defining this hook is\
+  equivalent to returning @code{false} for all inputs.",
+ bool, (reg_class_t),
+ hook_bool_reg_class_t_false)
+
 DEFHOOK
 (cstore_mode,
  "This hook defines the machine mode to use for the boolean result of\