* Cannot safely commute an instruction there are other defs which can reach its uses.
authorEvan Cheng <evan.cheng@apple.com>
Wed, 13 Feb 2008 08:41:08 +0000 (08:41 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Wed, 13 Feb 2008 08:41:08 +0000 (08:41 +0000)
* Ignore copy instructions which have already been coalesced.

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

lib/CodeGen/SimpleRegisterCoalescing.cpp

index 94a94a1fe0417f0d1b09aa04575d22a4442a7d8a..df5d3fa6f0de61cd4ccb7e989d003ff7dede1803 100644 (file)
@@ -237,7 +237,9 @@ bool SimpleRegisterCoalescing::RemoveCopyByCommutingDef(LiveInterval &IntA,
   // AValNo is the value number in A that defines the copy, A3 in the example.
   LiveInterval::iterator ALR = IntA.FindLiveRangeContaining(CopyIdx-1);
   VNInfo *AValNo = ALR->valno;
-  if (AValNo->def == ~0U || AValNo->def == ~1U)
+  // If other defs can reach uses of this def, then it's not safe to perform
+  // the optimization.
+  if (AValNo->def == ~0U || AValNo->def == ~1U || AValNo->hasPHIKill)
     return false;
   MachineInstr *DefMI = li_->getInstructionFromIndex(AValNo->def);
   const TargetInstrDesc &TID = DefMI->getDesc();
@@ -312,6 +314,8 @@ bool SimpleRegisterCoalescing::RemoveCopyByCommutingDef(LiveInterval &IntA,
     MachineOperand &UseMO = UI.getOperand();
     ++UI;
     MachineInstr *UseMI = UseMO.getParent();
+  if (JoinedCopies.count(UseMI))
+    continue;
     unsigned UseIdx = li_->getInstructionIndex(UseMI);
     LiveInterval::iterator ULR = IntA.FindLiveRangeContaining(UseIdx);
     if (ULR->valno != AValNo)