From c3553ffc70ac8196629bc1d19b3186399e883a03 Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Thu, 17 May 2012 18:32:42 +0000 Subject: [PATCH] Never clear flags on already joined copies. RegisterCoalescer set flags on all operands of copy instructions that are scheduled to be removed. This is so they won't affect shrinkToUses() by introducing false register reads. Make sure those flags are never cleared, or shrinkToUses() could cause live intervals to end at instructions about to be deleted. This would be a lot simpler if RegisterCoalescer could just erase joined copies immediately instead of keeping all the to-be-deleted instructions around. This fixes PR12862. Unfortunately, bugpoint can't create a sane test case for this. Like many other coalescer problems, this failure depends of a very fragile series of events. llvm-svn: 157001 --- llvm/lib/CodeGen/RegisterCoalescer.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/llvm/lib/CodeGen/RegisterCoalescer.cpp b/llvm/lib/CodeGen/RegisterCoalescer.cpp index f879489..8dfd1b3 100644 --- a/llvm/lib/CodeGen/RegisterCoalescer.cpp +++ b/llvm/lib/CodeGen/RegisterCoalescer.cpp @@ -918,6 +918,8 @@ void RegisterCoalescer::updateRegDefsUses(unsigned SrcReg, for (MachineRegisterInfo::reg_iterator I = MRI->reg_begin(SrcReg); MachineInstr *UseMI = I.skipInstruction();) { + bool AlreadyJoined = JoinedCopies.count(UseMI); + // A PhysReg copy that won't be coalesced can perhaps be rematerialized // instead. if (DstIsPhys) { @@ -925,7 +927,7 @@ void RegisterCoalescer::updateRegDefsUses(unsigned SrcReg, UseMI->getOperand(1).getReg() == SrcReg && UseMI->getOperand(0).getReg() != SrcReg && UseMI->getOperand(0).getReg() != DstReg && - !JoinedCopies.count(UseMI) && + !AlreadyJoined && reMaterializeTrivialDef(LIS->getInterval(SrcReg), false, UseMI->getOperand(0).getReg(), UseMI)) continue; @@ -937,7 +939,7 @@ void RegisterCoalescer::updateRegDefsUses(unsigned SrcReg, // If SrcReg wasn't read, it may still be the case that DstReg is live-in // because SrcReg is a sub-register. - if (!Reads && SubIdx) + if (!Reads && SubIdx && !AlreadyJoined) Reads = DstInt.liveAt(LIS->getInstructionIndex(UseMI)); // Replace SrcReg with DstReg in all UseMI operands. @@ -947,7 +949,7 @@ void RegisterCoalescer::updateRegDefsUses(unsigned SrcReg, // Adjust flags in case of sub-register joins. We don't want to // turn a full def into a read-modify-write sub-register def and vice // versa. - if (SubIdx && MO.isDef()) + if (SubIdx && !AlreadyJoined && MO.isDef()) MO.setIsUndef(!Reads); if (DstIsPhys) @@ -957,7 +959,7 @@ void RegisterCoalescer::updateRegDefsUses(unsigned SrcReg, } // This instruction is a copy that will be removed. - if (JoinedCopies.count(UseMI)) + if (AlreadyJoined) continue; DEBUG({ -- 2.7.4