Index: lib/Transforms/Scalar/SROA.cpp =================================================================== --- lib/Transforms/Scalar/SROA.cpp +++ lib/Transforms/Scalar/SROA.cpp @@ -1738,6 +1738,8 @@ if (II->getIntrinsicID() != Intrinsic::lifetime_start && II->getIntrinsicID() != Intrinsic::lifetime_end) return false; + if (S.beginOffset() != P.beginOffset() || S.endOffset() != P.endOffset()) + return false; } else if (U->get()->getType()->getPointerElementType()->isStructTy()) { // Disable vector promotion when there are loads or stores of an FCA. return false; @@ -1950,6 +1952,8 @@ if (II->getIntrinsicID() != Intrinsic::lifetime_start && II->getIntrinsicID() != Intrinsic::lifetime_end) return false; + if (RelBegin != 0 || RelEnd != Size) + return false; } else { return false; } Index: test/Transforms/SROA/basictest.ll =================================================================== --- test/Transforms/SROA/basictest.ll +++ test/Transforms/SROA/basictest.ll @@ -1684,3 +1684,15 @@ call void @llvm.lifetime.end(i64 8, i8* %3) ret void } + +define void @PR29139() { +; CHECK-LABEL: @PR29139( +; CHECK: alloca i32 +; CHECK: call void @llvm.lifetime.end(i64 2 +bb1: + %e.7.sroa.6.i = alloca i32, align 1 + %e.7.sroa.6.0.load81.i = load i32, i32* %e.7.sroa.6.i, align 1 + %0 = bitcast i32* %e.7.sroa.6.i to i8* + call void @llvm.lifetime.end(i64 2, i8* %0) + unreachable +}