lra-constrints.c (process_alt_operands): Remove non allocatable hard regs when consid...
authorVladimir Makarov <vmakarov@redhat.com>
Wed, 17 Dec 2014 21:25:18 +0000 (21:25 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Wed, 17 Dec 2014 21:25:18 +0000 (21:25 +0000)
2014-12-17  Vladimir Makarov  <vmakarov@redhat.com>

* lra-constrints.c (process_alt_operands): Remove non allocatable
hard regs when considering ira_prohibited_class_mode_regs.

From-SVN: r218835

gcc/ChangeLog
gcc/lra-constraints.c

index eb016cdbc96d683eaf1a9a38150a47cf8e370832..aef7f045b36ae2cf2949c6a51e11a1b78ea81a85 100644 (file)
@@ -1,3 +1,8 @@
+2014-12-17  Vladimir Makarov  <vmakarov@redhat.com>
+
+       * lra-constrints.c (process_alt_operands): Remove non allocatable
+       hard regs when considering ira_prohibited_class_mode_regs.
+
 2014-12-17  Jan Hubicka  <hubicka@ucw.cz>
 
        * sreal.h (sreal::normalize): Implement inline.
index a108b84c1200dd76c456555b2eddd20842100777..2526954b02a51aa4a8a1246a24ec614a4938dfa6 100644 (file)
@@ -2280,22 +2280,28 @@ process_alt_operands (int only_alternative)
                     not hold the mode value.  */
                  && ! HARD_REGNO_MODE_OK (ira_class_hard_regs
                                           [this_alternative][0],
-                                          GET_MODE (*curr_id->operand_loc[nop]))
+                                          GET_MODE (*curr_id->operand_loc[nop])))
+               {
+                 HARD_REG_SET temp;
+                 
+                 COPY_HARD_REG_SET (temp, this_alternative_set);
+                 AND_COMPL_HARD_REG_SET (temp, lra_no_alloc_regs);
                  /* The above condition is not enough as the first
                     reg in ira_class_hard_regs can be not aligned for
                     multi-words mode values.  */
-                 && hard_reg_set_subset_p (this_alternative_set,
-                                           ira_prohibited_class_mode_regs
-                                           [this_alternative]
-                                           [GET_MODE (*curr_id->operand_loc[nop])]))
-               {
-                 if (lra_dump_file != NULL)
-                   fprintf
-                     (lra_dump_file,
-                      "            alt=%d: reload pseudo for op %d "
-                      " can not hold the mode value -- refuse\n",
-                      nalt, nop);
-                 goto fail;
+                 if (hard_reg_set_subset_p (temp,
+                                            ira_prohibited_class_mode_regs
+                                            [this_alternative]
+                                            [GET_MODE (*curr_id->operand_loc[nop])]))
+                   {
+                     if (lra_dump_file != NULL)
+                       fprintf
+                         (lra_dump_file,
+                          "            alt=%d: reload pseudo for op %d "
+                          " can not hold the mode value -- refuse\n",
+                          nalt, nop);
+                     goto fail;
+                   }
                }
 
              /* Check strong discouragement of reload of non-constant