diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -5330,6 +5330,11 @@ Value *llvm::SimplifyCall(CallBase *Call, const SimplifyQuery &Q) { Value *Callee = Call->getCalledValue(); + // musttail calls can only be simplified if they are also DCEd. + // As we can't guarantee this here, don't simplify them. + if (Call->isMustTailCall()) + return nullptr; + // call undef -> undef // call null -> undef if (isa(Callee) || isa(Callee)) @@ -5512,6 +5517,9 @@ break; case Instruction::Call: { Result = SimplifyCall(cast(I), Q); + // Don't perform known bits simplification below for musttail calls. + if (cast(I)->isMustTailCall()) + return Result; break; } case Instruction::Freeze: diff --git a/llvm/test/Transforms/InstSimplify/call.ll b/llvm/test/Transforms/InstSimplify/call.ll --- a/llvm/test/Transforms/InstSimplify/call.ll +++ b/llvm/test/Transforms/InstSimplify/call.ll @@ -1007,3 +1007,30 @@ %x = call i32 @passthru_i32(i32 %arg) ret i32 %x } + +define i32 @returned_const_int_arg_musttail(i32 %arg) { +; CHECK-LABEL: @returned_const_int_arg_musttail( +; CHECK-NEXT: [[X:%.*]] = musttail call i32 @passthru_i32(i32 42) +; CHECK-NEXT: ret i32 [[X]] +; + %x = musttail call i32 @passthru_i32(i32 42) + ret i32 %x +} + +define i32 @returned_var_arg_musttail(i32 %arg) { +; CHECK-LABEL: @returned_var_arg_musttail( +; CHECK-NEXT: [[X:%.*]] = musttail call i32 @passthru_i32(i32 [[ARG:%.*]]) +; CHECK-NEXT: ret i32 [[X]] +; + %x = musttail call i32 @passthru_i32(i32 %arg) + ret i32 %x +} + +define i32 @call_undef_musttail() { +; CHECK-LABEL: @call_undef_musttail( +; CHECK-NEXT: [[X:%.*]] = musttail call i32 undef() +; CHECK-NEXT: ret i32 [[X]] +; + %x = musttail call i32 undef() + ret i32 %x +}