Index: llvm/lib/Transforms/Utils/InlineFunction.cpp =================================================================== --- llvm/lib/Transforms/Utils/InlineFunction.cpp +++ llvm/lib/Transforms/Utils/InlineFunction.cpp @@ -2374,6 +2374,7 @@ SmallVector OpBundles; DeoptCall->getOperandBundlesAsDefs(OpBundles); + auto DeoptAttributes = DeoptCall->getAttributes(); DeoptCall->eraseFromParent(); assert(!OpBundles.empty() && "Expected at least the deopt operand bundle"); @@ -2382,6 +2383,7 @@ CallInst *NewDeoptCall = Builder.CreateCall(NewDeoptIntrinsic, CallArgs, OpBundles); NewDeoptCall->setCallingConv(CallingConv); + NewDeoptCall->setAttributes(DeoptAttributes); if (NewDeoptCall->getType()->isVoidTy()) Builder.CreateRetVoid(); else Index: llvm/test/Transforms/Inline/deoptimize-intrinsic-attrs.ll =================================================================== --- /dev/null +++ llvm/test/Transforms/Inline/deoptimize-intrinsic-attrs.ll @@ -0,0 +1,22 @@ +; RUN: opt -S -always-inline < %s | FileCheck %s + +declare cc42 i32 @llvm.experimental.deoptimize.i32(...) + +define i32 @callee_with_coldcc() alwaysinline { + %v0 = call cc42 i32(...) @llvm.experimental.deoptimize.i32(i32 1) #0 [ "deopt"() ] + ret i32 %v0 +} + +define void @caller_with_coldcc() { +; CHECK-LABEL: @caller_with_coldcc( +; CHECK-NEXT: call cc42 void (...) @llvm.experimental.deoptimize.isVoid(i32 1) #1 [ "deopt"() ] +; CHECK-NEXT: ret void + + %val = call i32 @callee_with_coldcc() + ret void +} + +attributes #0 = { "deopt-lowering"="live-in" } + +; CHECK: declare cc42 void @llvm.experimental.deoptimize.isVoid(...) +; CHECK: attributes #1 = { "deopt-lowering"="live-in" } \ No newline at end of file