diff options
author | Evan Cheng <evan.cheng@apple.com> | 2009-01-20 00:16:18 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2009-01-20 00:16:18 +0000 |
commit | d0deec20f6a77b3b22af9f91dd3e30314c5264bc (patch) | |
tree | a5d944554f05bc800910653ad01d14c151aa24ff | |
parent | 5049fa6bbc66534fe0cc361808dff80fd2d5cde2 (diff) | |
download | external_llvm-d0deec20f6a77b3b22af9f91dd3e30314c5264bc.zip external_llvm-d0deec20f6a77b3b22af9f91dd3e30314c5264bc.tar.gz external_llvm-d0deec20f6a77b3b22af9f91dd3e30314c5264bc.tar.bz2 |
Make linear scan's trivial coalescer slightly more aggressive.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@62547 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/RegAllocLinearScan.cpp | 12 | ||||
-rw-r--r-- | test/CodeGen/X86/uint_to_fp-2.ll | 8 |
2 files changed, 14 insertions, 6 deletions
diff --git a/lib/CodeGen/RegAllocLinearScan.cpp b/lib/CodeGen/RegAllocLinearScan.cpp index 1e7d0a8..96f8ab4 100644 --- a/lib/CodeGen/RegAllocLinearScan.cpp +++ b/lib/CodeGen/RegAllocLinearScan.cpp @@ -249,7 +249,7 @@ unsigned RALinScan::attemptTrivialCoalescing(LiveInterval &cur, unsigned Reg) { if ((cur.preference && cur.preference == Reg) || !cur.containsOneValue()) return Reg; - VNInfo *vni = cur.getValNumInfo(0); + VNInfo *vni = cur.begin()->valno; if (!vni->def || vni->def == ~1U || vni->def == ~0U) return Reg; MachineInstr *CopyMI = li_->getInstructionFromIndex(vni->def); @@ -686,13 +686,13 @@ void RALinScan::assignRegOrStackSlotAtInterval(LiveInterval* cur) unsigned StartPosition = cur->beginNumber(); const TargetRegisterClass *RCLeader = RelatedRegClasses.getLeaderValue(RC); - // If this live interval is defined by a move instruction and its source is - // assigned a physical register that is compatible with the target register - // class, then we should try to assign it the same register. + // If start of this live interval is defined by a move instruction and its + // source is assigned a physical register that is compatible with the target + // register class, then we should try to assign it the same register. // This can happen when the move is from a larger register class to a smaller // one, e.g. X86::mov32to32_. These move instructions are not coalescable. - if (!cur->preference && cur->containsOneValue()) { - VNInfo *vni = cur->getValNumInfo(0); + if (!cur->preference && cur->hasAtLeastOneValue()) { + VNInfo *vni = cur->begin()->valno; if (vni->def && vni->def != ~1U && vni->def != ~0U) { MachineInstr *CopyMI = li_->getInstructionFromIndex(vni->def); unsigned SrcReg, DstReg; diff --git a/test/CodeGen/X86/uint_to_fp-2.ll b/test/CodeGen/X86/uint_to_fp-2.ll new file mode 100644 index 0000000..d630437 --- /dev/null +++ b/test/CodeGen/X86/uint_to_fp-2.ll @@ -0,0 +1,8 @@ +; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse2 | grep movsd | count 1 +; rdar://6504833 + +define float @f(i32 %x) nounwind readnone { +entry: + %0 = uitofp i32 %x to float + ret float %0 +} |