diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -6332,7 +6332,16 @@ if (!E || !E->isValid()) return; - CheckDI(!E->isEntryValue(), "Entry values are only allowed in MIR", &I); + // We allow EntryValues for swift async arguments, as they have an + // ABI-guarantee to be turned into a specific register. + if (auto *ArgLoc = dyn_cast_or_null(I.getVariableLocationOp(0)); + ArgLoc && ArgLoc->hasAttribute(Attribute::SwiftAsync)) + return; + + CheckDI(!E->isEntryValue(), + "Entry values are only allowed in MIR unless they target a " + "swiftasync Argument", + &I); } void Verifier::verifyCompileUnits() { diff --git a/llvm/test/Verifier/diexpression-entry-value-llvm-ir.ll b/llvm/test/Verifier/diexpression-entry-value-llvm-ir.ll --- a/llvm/test/Verifier/diexpression-entry-value-llvm-ir.ll +++ b/llvm/test/Verifier/diexpression-entry-value-llvm-ir.ll @@ -1,14 +1,14 @@ ; RUN: llvm-as -disable-output <%s 2>&1| FileCheck %s -; The DW_OP_LLVM_entry_value operation can only be used in MIR. - -; CHECK: Entry values are only allowed in MIR +; CHECK: Entry values are only allowed in MIR unless they target a swiftasync Argument ; CHECK: call void @llvm.dbg.value(metadata i32 %param, metadata !{{.*}}, metadata !DIExpression(DW_OP_LLVM_entry_value, 1)) +; CHECK-NOT: llvm.dbg.value ; CHECK: warning: ignoring invalid debug info -define void @foo(i32 %param) !dbg !4 { +define void @foo(i32 %param, ptr swiftasync %ok_param) !dbg !4 { entry: call void @llvm.dbg.value(metadata i32 %param, metadata !8, metadata !DIExpression(DW_OP_LLVM_entry_value, 1)), !dbg !9 + call void @llvm.dbg.value(metadata ptr %ok_param, metadata !8, metadata !DIExpression(DW_OP_LLVM_entry_value, 1)), !dbg !9 ret void }