lra-constraints.c (need_for_all_save_p): Use macro HARD_REGNO_CALL_PART_CLOBBERED.
authorVladimir Makarov <vmakarov@redhat.com>
Wed, 18 Sep 2013 19:12:16 +0000 (19:12 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Wed, 18 Sep 2013 19:12:16 +0000 (19:12 +0000)
2013-09-18  Vladimir Makarov  <vmakarov@redhat.com>

* lra-constraints.c (need_for_all_save_p): Use macro
HARD_REGNO_CALL_PART_CLOBBERED.
* lra-lives.c (check_pseudos_live_through_calls): Use the macro to
set up pseudo conflict hard regs.

From-SVN: r202721

gcc/ChangeLog
gcc/lra-constraints.c
gcc/lra-lives.c

index 5ef0f3793663337b2adff61fdf83a366c86b670d..ad70c24516e8e42b1246ddd302861826e8193c62 100644 (file)
@@ -1,3 +1,10 @@
+2013-09-18  Vladimir Makarov  <vmakarov@redhat.com>
+
+       * lra-constraints.c (need_for_all_save_p): Use macro
+       HARD_REGNO_CALL_PART_CLOBBERED.
+       * lra-lives.c (check_pseudos_live_through_calls): Use the macro to
+       set up pseudo conflict hard regs.
+
 2013-09-18  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        PR target/58452
index e87ba91f3c705a543d40a10d7c10d2163b3712bf..f9652c773cd89520de457f29a9569b3f90cc47b3 100644 (file)
@@ -4335,7 +4335,9 @@ need_for_call_save_p (int regno)
   return (usage_insns[regno].calls_num < calls_num
          && (overlaps_hard_reg_set_p
              (call_used_reg_set,
-              PSEUDO_REGNO_MODE (regno), reg_renumber[regno])));
+              PSEUDO_REGNO_MODE (regno), reg_renumber[regno])
+             || HARD_REGNO_CALL_PART_CLOBBERED (reg_renumber[regno],
+                                                PSEUDO_REGNO_MODE (regno))));
 }
 
 /* Global registers occurring in the current EBB.  */
index 6eaeb2d7779c907cbbe788bf7da712186bcbd4fe..f3bad974a87bb76f643ccbb09be42738d44af7ff 100644 (file)
@@ -457,11 +457,17 @@ lra_setup_reload_pseudo_preferenced_hard_reg (int regno,
 static inline void
 check_pseudos_live_through_calls (int regno)
 {
+  int hr;
+
   if (! sparseset_bit_p (pseudos_live_through_calls, regno))
     return;
   sparseset_clear_bit (pseudos_live_through_calls, regno);
   IOR_HARD_REG_SET (lra_reg_info[regno].conflict_hard_regs,
                    call_used_reg_set);
+
+  for (hr = 0; hr < FIRST_PSEUDO_REGISTER; hr++)
+    if (HARD_REGNO_CALL_PART_CLOBBERED (hr, PSEUDO_REGNO_MODE (regno)))
+      SET_HARD_REG_BIT (lra_reg_info[regno].conflict_hard_regs, hr);
 #ifdef ENABLE_CHECKING
   lra_reg_info[regno].call_p = true;
 #endif