Add VirtRegMap::hasKnownPreference().
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Mon, 3 Dec 2012 23:23:50 +0000 (23:23 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Mon, 3 Dec 2012 23:23:50 +0000 (23:23 +0000)
Virtual registers with a known preferred register are prioritized by
RAGreedy. This function makes the condition explicit without depending
on getRegAllocPref().

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169179 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/VirtRegMap.h
lib/CodeGen/RegAllocGreedy.cpp
lib/CodeGen/VirtRegMap.cpp

index ebf42a32ba6e010185aca723da773f0b357b2e51..5fe6297f1821f750d1c0b377470d53a67e8f5a5d 100644 (file)
@@ -134,6 +134,11 @@ namespace llvm {
       return getPhys(VirtReg) == getRegAllocPref(VirtReg);
     }
 
+    /// @brief returns true if VirtReg has a known preferred register.
+    /// This returns false if VirtReg has a preference that is a virtual
+    /// register that hasn't been assigned yet.
+    bool hasKnownPreference(unsigned VirtReg);
+
     /// @brief records virtReg is a split live interval from SReg.
     void setIsSplitFromReg(unsigned virtReg, unsigned SReg) {
       Virt2SplitMap[virtReg] = SReg;
index 3d1b580207d364ec07be78f6dc62f5d10be4f9dc..994264338ddff50cc376afa49d27c209f82eca79 100644 (file)
@@ -413,7 +413,7 @@ void RAGreedy::enqueue(LiveInterval *LI) {
     Prio = (1u << 31) + Size;
 
     // Boost ranges that have a physical register hint.
-    if (TargetRegisterInfo::isPhysicalRegister(VRM->getRegAllocPref(Reg)))
+    if (VRM->hasKnownPreference(Reg))
       Prio |= (1u << 30);
   }
 
index cf674575ba4fdea2c0488939206f1855ceeac355..dcfad6641453622e87384cb9d15a6f29efee9e63 100644 (file)
@@ -88,6 +88,15 @@ unsigned VirtRegMap::getRegAllocPref(unsigned virtReg) {
   return TRI->ResolveRegAllocHint(Hint.first, physReg, *MF);
 }
 
+bool VirtRegMap::hasKnownPreference(unsigned VirtReg) {
+  std::pair<unsigned, unsigned> Hint = MRI->getRegAllocationHint(VirtReg);
+  if (TargetRegisterInfo::isPhysicalRegister(Hint.second))
+    return true;
+  if (TargetRegisterInfo::isVirtualRegister(Hint.second))
+    return hasPhys(Hint.second);
+  return false;
+}
+
 int VirtRegMap::assignVirt2StackSlot(unsigned virtReg) {
   assert(TargetRegisterInfo::isVirtualRegister(virtReg));
   assert(Virt2StackSlotMap[virtReg] == NO_STACK_SLOT &&