forked from OSchip/llvm-project
StackLifetime: Remove asserts for multiple lifetime intrinsics.
According to the langref, it is valid to have multiple consecutive lifetime start or end intrinsics on the same object. For llvm.lifetime.start: "If ptr [...] is a stack object that is already alive, it simply fills all bytes of the object with poison." For llvm.lifetime.end: "Calling llvm.lifetime.end on an already dead alloca is no-op." However, we currently fail an assertion in such cases. I've observed the assertion failure when the loop vectorization pass duplicates the intrinsic. We can conservatively handle these intrinsics by ignoring all but the first one, which can be implemented by removing the assertions. Differential Revision: https://reviews.llvm.org/D108337
This commit is contained in:
parent
5fdaaf7fd8
commit
6f85225ef3
|
@ -257,14 +257,12 @@ void StackLifetime::calculateLiveIntervals() {
|
|||
unsigned AllocaNo = It.second.AllocaNo;
|
||||
|
||||
if (IsStart) {
|
||||
assert(!Started.test(AllocaNo) || Start[AllocaNo] == BBStart);
|
||||
if (!Started.test(AllocaNo)) {
|
||||
Started.set(AllocaNo);
|
||||
Ended.reset(AllocaNo);
|
||||
Start[AllocaNo] = InstNo;
|
||||
}
|
||||
} else {
|
||||
assert(!Ended.test(AllocaNo));
|
||||
if (Started.test(AllocaNo)) {
|
||||
LiveRanges[AllocaNo].addRange(Start[AllocaNo], InstNo);
|
||||
Started.reset(AllocaNo);
|
||||
|
|
|
@ -924,6 +924,31 @@ entry:
|
|||
ret void
|
||||
}
|
||||
|
||||
define void @multiple_start_end() {
|
||||
; CHECK-LABEL: define void @multiple_start_end
|
||||
entry:
|
||||
; CHECK: entry:
|
||||
; CHECK-NEXT: Alive: <>
|
||||
%x = alloca i8
|
||||
call void @llvm.lifetime.start.p0i8(i64 1, i8* %x)
|
||||
; CHECK: call void @llvm.lifetime.start.p0i8(i64 1, i8* %x)
|
||||
; CHECK-NEXT: Alive: <x>
|
||||
|
||||
call void @llvm.lifetime.start.p0i8(i64 1, i8* %x)
|
||||
; CHECK: call void @llvm.lifetime.start.p0i8(i64 1, i8* %x)
|
||||
; CHECK-NEXT: Alive: <x>
|
||||
|
||||
call void @llvm.lifetime.end.p0i8(i64 1, i8* %x)
|
||||
; CHECK: call void @llvm.lifetime.end.p0i8(i64 1, i8* %x)
|
||||
; CHECK-NEXT: Alive: <>
|
||||
|
||||
call void @llvm.lifetime.end.p0i8(i64 1, i8* %x)
|
||||
; CHECK: call void @llvm.lifetime.end.p0i8(i64 1, i8* %x)
|
||||
; CHECK-NEXT: Alive: <>
|
||||
|
||||
ret void
|
||||
}
|
||||
|
||||
declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)
|
||||
declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture)
|
||||
declare void @llvm.lifetime.start.p0i32(i64, i32* nocapture)
|
||||
|
|
Loading…
Reference in New Issue