New virtual registers created for spill intervals should inherit allocation hints...
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Mon, 30 Nov 2009 22:55:54 +0000 (22:55 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Mon, 30 Nov 2009 22:55:54 +0000 (22:55 +0000)
This helps us avoid silly copies when rematting values that are copied to a physical register:

leaq _.str44(%rip), %rcx
movq %rcx, %rsi
call _strcmp

becomes:

leaq _.str44(%rip), %rsi
call _strcmp

The coalescer will not touch the movq because that would tie down the physical register.

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

lib/CodeGen/LiveIntervalAnalysis.cpp
test/CodeGen/X86/2008-08-05-SpillerBug.ll

index 4412c1b020a443ff0f5ef944246383776b4e3875..24adf364e710c02440430f2aa9cca5a496351512 100644 (file)
@@ -1095,6 +1095,12 @@ rewriteInstructionForSpills(const LiveInterval &li, const VNInfo *VNI,
       NewVReg = mri_->createVirtualRegister(rc);
       vrm.grow();
       CreatedNewVReg = true;
+
+      // The new virtual register should get the same allocation hints as the
+      // old one.
+      std::pair<unsigned, unsigned> Hint = mri_->getRegAllocationHint(Reg);
+      if (Hint.first || Hint.second)
+        mri_->setRegAllocationHint(NewVReg, Hint.first, Hint.second);
     }
 
     if (!TryFold)
index 1d166f48815861153e969b09a4033ccc5f86b7c2..67e14ffae5e6818343295dea1b200ee909b7c007 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc < %s -mtriple=i386-apple-darwin -disable-fp-elim -stats |& grep asm-printer | grep 59
+; RUN: llc < %s -mtriple=i386-apple-darwin -disable-fp-elim -stats |& grep asm-printer | grep 58
 ; PR2568
 
 @g_3 = external global i16             ; <i16*> [#uses=1]