From 25f34a30d66e33381a023d97d72ce44ded2c7f72 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Mon, 15 Sep 2008 06:28:41 +0000 Subject: [PATCH] Correctly update kill infos after extending a live range and merge 2 val#'s; fix 56165 - do not mark val# copy field if the copy does not define the val#. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56199 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SimpleRegisterCoalescing.cpp | 11 +++++--- test/CodeGen/ARM/2008-09-14-CoaleserBug.ll | 29 ++++++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 test/CodeGen/ARM/2008-09-14-CoaleserBug.ll diff --git a/lib/CodeGen/SimpleRegisterCoalescing.cpp b/lib/CodeGen/SimpleRegisterCoalescing.cpp index 0a1419ce810..e06eb161c08 100644 --- a/lib/CodeGen/SimpleRegisterCoalescing.cpp +++ b/lib/CodeGen/SimpleRegisterCoalescing.cpp @@ -182,16 +182,20 @@ bool SimpleRegisterCoalescing::AdjustCopiesBackFrom(LiveInterval &IntA, } // Okay, merge "B1" into the same value number as "B0". - if (BValNo != ValLR->valno) + if (BValNo != ValLR->valno) { + IntB.addKills(ValLR->valno, BValNo->kills); IntB.MergeValueNumberInto(BValNo, ValLR->valno); + } DOUT << " result = "; IntB.print(DOUT, tri_); DOUT << "\n"; // If the source instruction was killing the source register before the // merge, unset the isKill marker given the live range has been extended. int UIdx = ValLREndInst->findRegisterUseOperandIdx(IntB.reg, true); - if (UIdx != -1) + if (UIdx != -1) { ValLREndInst->getOperand(UIdx).setIsKill(false); + IntB.removeKill(ValLR->valno, FillerStart); + } ++numExtends; return true; @@ -568,7 +572,8 @@ SimpleRegisterCoalescing::UpdateRegDefsUses(unsigned SrcReg, unsigned DstReg, LiveInterval &LI = li_->getInterval(CopyDstReg); unsigned DefIdx = li_->getDefIndex(li_->getInstructionIndex(UseMI)); const LiveRange *DLR = LI.getLiveRangeContaining(DefIdx); - DLR->valno->copy = UseMI; + if (DLR->valno->def == DefIdx) + DLR->valno->copy = UseMI; } } } diff --git a/test/CodeGen/ARM/2008-09-14-CoaleserBug.ll b/test/CodeGen/ARM/2008-09-14-CoaleserBug.ll new file mode 100644 index 00000000000..c601b90e071 --- /dev/null +++ b/test/CodeGen/ARM/2008-09-14-CoaleserBug.ll @@ -0,0 +1,29 @@ +; RUN: llvm-as < %s | llc -mtriple=arm-apple-darwin + +@"\01LC1" = external constant [288 x i8] ; <[288 x i8]*> [#uses=1] + +declare void @llvm.memcpy.i32(i8*, i8*, i32, i32) nounwind + +define i32 @main(i32 %argc, i8** %argv) nounwind { +entry: + br label %bb.i + +bb.i: ; preds = %bb.i, %entry + %i.01.i = phi i32 [ 0, %entry ], [ %indvar.next52, %bb.i ] ; [#uses=1] + %indvar.next52 = add i32 %i.01.i, 1 ; [#uses=2] + %exitcond53 = icmp eq i32 %indvar.next52, 15 ; [#uses=1] + br i1 %exitcond53, label %bb.i33.loopexit, label %bb.i + +bb.i33.loopexit: ; preds = %bb.i + %0 = malloc [347 x i8] ; <[347 x i8]*> [#uses=2] + %.sub = getelementptr [347 x i8]* %0, i32 0, i32 0 ; [#uses=1] + call void @llvm.memcpy.i32( i8* %.sub, i8* getelementptr ([288 x i8]* @"\01LC1", i32 0, i32 0), i32 287, i32 1 ) nounwind + br label %bb.i28 + +bb.i28: ; preds = %bb.i28, %bb.i33.loopexit + br i1 false, label %repeat_fasta.exit, label %bb.i28 + +repeat_fasta.exit: ; preds = %bb.i28 + free [347 x i8]* %0 + unreachable +}