diff options
author | Evan Cheng <evan.cheng@apple.com> | 2008-03-26 19:03:01 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2008-03-26 19:03:01 +0000 |
commit | ed70cbb3f367bc0f77d34d22163abbe4879526bc (patch) | |
tree | ec25ced033c89f098d241a6db0cf6154314b5efe /lib/CodeGen/SimpleRegisterCoalescing.cpp | |
parent | e326332acd5fefb9854118603b4d07d4e44b64c5 (diff) | |
download | external_llvm-ed70cbb3f367bc0f77d34d22163abbe4879526bc.zip external_llvm-ed70cbb3f367bc0f77d34d22163abbe4879526bc.tar.gz external_llvm-ed70cbb3f367bc0f77d34d22163abbe4879526bc.tar.bz2 |
Avoid commuting a def MI in order to coalesce a copy instruction away if any use of the same val# is a copy instruction that has already been coalesced.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48833 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SimpleRegisterCoalescing.cpp')
-rw-r--r-- | lib/CodeGen/SimpleRegisterCoalescing.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/lib/CodeGen/SimpleRegisterCoalescing.cpp b/lib/CodeGen/SimpleRegisterCoalescing.cpp index 870fcc4..8ae36db 100644 --- a/lib/CodeGen/SimpleRegisterCoalescing.cpp +++ b/lib/CodeGen/SimpleRegisterCoalescing.cpp @@ -283,6 +283,17 @@ bool SimpleRegisterCoalescing::RemoveCopyByCommutingDef(LiveInterval &IntA, if (HasOtherReachingDefs(IntA, IntB, AValNo, BValNo)) return false; + // If some of the uses of IntA.reg is already coalesced away, return false. + // It's not possible to determine whether it's safe to perform the coalescing. + for (MachineRegisterInfo::use_iterator UI = mri_->use_begin(IntA.reg), + UE = mri_->use_end(); UI != UE; ++UI) { + MachineInstr *UseMI = &*UI; + unsigned UseIdx = li_->getInstructionIndex(UseMI); + LiveInterval::iterator ULR = IntA.FindLiveRangeContaining(UseIdx); + if (ULR->valno == AValNo && JoinedCopies.count(UseMI)) + return false; + } + // At this point we have decided that it is legal to do this // transformation. Start by commuting the instruction. MachineBasicBlock *MBB = DefMI->getParent(); @@ -323,8 +334,7 @@ bool SimpleRegisterCoalescing::RemoveCopyByCommutingDef(LiveInterval &IntA, MachineInstr *UseMI = &*UI; ++UI; if (JoinedCopies.count(UseMI)) - // It'll no longer be "joined" after the change. - JoinedCopies.erase(UseMI); + continue; unsigned UseIdx = li_->getInstructionIndex(UseMI); LiveInterval::iterator ULR = IntA.FindLiveRangeContaining(UseIdx); if (ULR->valno != AValNo) |