diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Transforms/Utils/InlineFunction.cpp | 7 | ||||
-rw-r--r-- | llvm/test/Transforms/Inline/deoptimize-intrinsic.ll | 16 |
2 files changed, 21 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp index 50eff521318..42179851718 100644 --- a/llvm/lib/Transforms/Utils/InlineFunction.cpp +++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp @@ -1703,11 +1703,14 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI, builder.CreateLifetimeStart(AI, AllocaSize); for (ReturnInst *RI : Returns) { - // Don't insert llvm.lifetime.end calls between a musttail call and a - // return. The return kills all local allocas. + // Don't insert llvm.lifetime.end calls between a musttail or deoptimize + // call and a return. The return kills all local allocas. if (InlinedMustTailCalls && RI->getParent()->getTerminatingMustTailCall()) continue; + if (InlinedDeoptimizeCalls && + RI->getParent()->getTerminatingDeoptimizeCall()) + continue; IRBuilder<>(RI).CreateLifetimeEnd(AI, AllocaSize); } } diff --git a/llvm/test/Transforms/Inline/deoptimize-intrinsic.ll b/llvm/test/Transforms/Inline/deoptimize-intrinsic.ll index 84e54a09e8a..d9b88985551 100644 --- a/llvm/test/Transforms/Inline/deoptimize-intrinsic.ll +++ b/llvm/test/Transforms/Inline/deoptimize-intrinsic.ll @@ -88,3 +88,19 @@ normal: store i8 %v, i8* %ptr ret i32 42 } + +define i8 @callee_with_alloca() alwaysinline { + %t = alloca i8 + %v0 = call i8(...) @llvm.experimental.deoptimize.i8(i32 1) [ "deopt"(i8* %t) ] + ret i8 %v0 +} + +define void @caller_with_lifetime() { +; CHECK-LABLE: @caller_with_lifetime( +; CHECK: call void (...) @llvm.experimental.deoptimize.isVoid(i32 1) [ "deopt"(i8* %t.i) ] +; CHECK-NEXT: ret void + +entry: + call i8 @callee_with_alloca(); + ret void +} |