diff options
-rw-r--r-- | lib/CodeGen/StackColoring.cpp | 19 | ||||
-rw-r--r-- | test/CodeGen/X86/StackColoring.ll | 22 |
2 files changed, 30 insertions, 11 deletions
diff --git a/lib/CodeGen/StackColoring.cpp b/lib/CodeGen/StackColoring.cpp index ec44b8cb59..c10e3190f6 100644 --- a/lib/CodeGen/StackColoring.cpp +++ b/lib/CodeGen/StackColoring.cpp @@ -428,17 +428,14 @@ void StackColoring::calculateLiveIntervals(unsigned NumSlots) { } // Create the interval of the blocks that we previously found to be 'alive'. - BitVector Alive = BlockLiveness[MBB].LiveIn; - Alive |= BlockLiveness[MBB].LiveOut; - - if (Alive.any()) { - for (int pos = Alive.find_first(); pos != -1; - pos = Alive.find_next(pos)) { - if (!Starts[pos].isValid()) - Starts[pos] = Indexes->getMBBStartIdx(MBB); - if (!Finishes[pos].isValid()) - Finishes[pos] = Indexes->getMBBEndIdx(MBB); - } + BlockLifetimeInfo &MBBLiveness = BlockLiveness[MBB]; + for (int pos = MBBLiveness.LiveIn.find_first(); pos != -1; + pos = MBBLiveness.LiveIn.find_next(pos)) { + Starts[pos] = Indexes->getMBBStartIdx(MBB); + } + for (int pos = MBBLiveness.LiveOut.find_first(); pos != -1; + pos = MBBLiveness.LiveOut.find_next(pos)) { + Finishes[pos] = Indexes->getMBBEndIdx(MBB); } for (unsigned i = 0; i < NumSlots; ++i) { diff --git a/test/CodeGen/X86/StackColoring.ll b/test/CodeGen/X86/StackColoring.ll index f8ae74f292..6c0f00d17d 100644 --- a/test/CodeGen/X86/StackColoring.ll +++ b/test/CodeGen/X86/StackColoring.ll @@ -350,6 +350,28 @@ bb3: ret i32 0 } + +; Regression test for PR15707. %buf1 and %buf2 should not be merged +; in this test case. +;YESCOLOR: myCall_pr15707 +;YESCOLOR: subq $200008, %rsp +;NOCOLOR: myCall_pr15707 +;NOCOLOR: subq $200008, %rsp +define void @myCall_pr15707() { + %buf1 = alloca i8, i32 100000, align 16 + %buf2 = alloca i8, i32 100000, align 16 + + call void @llvm.lifetime.start(i64 -1, i8* %buf1) + call void @llvm.lifetime.end(i64 -1, i8* %buf1) + + call void @llvm.lifetime.start(i64 -1, i8* %buf1) + call void @llvm.lifetime.start(i64 -1, i8* %buf2) + %result1 = call i32 @foo(i32 0, i8* %buf1) + %result2 = call i32 @foo(i32 0, i8* %buf2) + ret void +} + + ; Check that we don't assert and crash even when there are allocas ; outside the declared lifetime regions. ;YESCOLOR: bad_range |