diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index 349c35b3781d1..056f4f41ffca7 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -2166,7 +2166,8 @@ bool IRTranslator::translateKnownIntrinsic(const CallInst &CI, Intrinsic::ID ID, case Intrinsic::lifetime_start: case Intrinsic::lifetime_end: { // No stack colouring in O0, discard region information. - if (MF->getTarget().getOptLevel() == CodeGenOptLevel::None) + if (MF->getTarget().getOptLevel() == CodeGenOptLevel::None || + MF->getFunction().hasOptNone()) return true; unsigned Op = ID == Intrinsic::lifetime_start ? TargetOpcode::LIFETIME_START diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll index ed7bcff5160f8..7a67cf3fd4c94 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll +++ b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll @@ -1477,6 +1477,20 @@ define void @test_lifetime_intrin() { ret void } +define void @test_lifetime_intrin_optnone() optnone noinline { +; CHECK-LABEL: name: test_lifetime_intrin_optnone +; CHECK: RET_ReallyLR +; O3-LABEL: name: test_lifetime_intrin_optnone +; O3: {{%[0-9]+}}:_(p0) = G_FRAME_INDEX %stack.0.slot +; O3-NEXT: G_STORE +; O3-NEXT: RET_ReallyLR + %slot = alloca i8, i32 4 + call void @llvm.lifetime.start.p0(i64 0, ptr %slot) + store volatile i8 10, ptr %slot + call void @llvm.lifetime.end.p0(i64 0, ptr %slot) + ret void +} + define void @test_load_store_atomics(ptr %addr) { ; CHECK-LABEL: name: test_load_store_atomics ; CHECK: [[ADDR:%[0-9]+]]:_(p0) = COPY $x0