2013-09-18 Vladimir Makarov <vmakarov@redhat.com>
authorvmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 18 Sep 2013 19:12:16 +0000 (19:12 +0000)
committervmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 18 Sep 2013 19:12:16 +0000 (19:12 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@202721 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 5ef0f37..ad70c24 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 e87ba91..f9652c7 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 6eaeb2d..f3bad97 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