Index: llvm/lib/CodeGen/LiveDebugValues.cpp =================================================================== --- llvm/lib/CodeGen/LiveDebugValues.cpp +++ llvm/lib/CodeGen/LiveDebugValues.cpp @@ -1840,14 +1840,16 @@ MachineBasicBlock &First_MBB = *(MF.begin()); for (auto &MI : First_MBB) { collectRegDefs(MI, DefinedRegs, TRI); - if (MI.isDebugValue()) - recordEntryValue(MI, DefinedRegs, OpenRanges, VarLocIDs); + // We might already have generated the entry values within deadargelim, + // so we don't consider these as candidates for entry values anymore. + if (MI.isDebugValue() && !MI.isDebugEntryValue()) + recordEntryValue(MI, DefinedRegs, OpenRanges, VarLocIDs); } // Initialize per-block structures and scan for fragment overlaps. for (auto &MBB : MF) for (auto &MI : MBB) - if (MI.isDebugValue()) + if (MI.isDebugValue() && !MI.isDebugEntryValue()) accumulateFragmentMap(MI, SeenFragments, OverlapFragments); auto hasNonArtificialLocation = [](const MachineInstr &MI) -> bool { Index: llvm/lib/IR/Verifier.cpp =================================================================== --- llvm/lib/IR/Verifier.cpp +++ llvm/lib/IR/Verifier.cpp @@ -5431,8 +5431,6 @@ // We don't know whether this intrinsic verified correctly. if (!E || !E->isValid()) return; - - AssertDI(!E->isEntryValue(), "Entry values are only allowed in MIR", &I); } void Verifier::verifyCompileUnits() { Index: llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp =================================================================== --- llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp +++ llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp @@ -23,6 +23,7 @@ #include "llvm/IR/Attributes.h" #include "llvm/IR/BasicBlock.h" #include "llvm/IR/Constants.h" +#include "llvm/IR/DebugInfoMetadata.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/Function.h" #include "llvm/IR/IRBuilder.h" @@ -45,6 +46,7 @@ #include "llvm/Support/raw_ostream.h" #include "llvm/Transforms/IPO.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" +#include "llvm/Transforms/Utils/Local.h" #include #include #include @@ -291,7 +293,16 @@ if (!Arg.hasSwiftErrorAttr() && Arg.use_empty() && !Arg.hasPassPointeeByValueCopyAttr()) { if (Arg.isUsedByMetadata()) { - Arg.replaceAllUsesWith(UndefValue::get(Arg.getType())); + // Create entry values for unused args. + SmallVector DbgValues; + findDbgValues(DbgValues, &Arg); + for (auto *DVI : DbgValues) { + DIExpression *NewExpr = DIExpression::prepend( + DVI->getExpression(), DIExpression::EntryValue); + DVI->setArgOperand( + 2, MetadataAsValue::get(Arg.getType()->getContext(), NewExpr)); + } + Changed = true; } UnusedArgs.push_back(Arg.getArgNo()); Index: llvm/test/Transforms/DeadArgElim/dbginfo-update-dbgval.ll =================================================================== --- llvm/test/Transforms/DeadArgElim/dbginfo-update-dbgval.ll +++ llvm/test/Transforms/DeadArgElim/dbginfo-update-dbgval.ll @@ -24,7 +24,7 @@ ; Function Attrs: noinline nounwind uwtable define dso_local void @f2(i32 %k) local_unnamed_addr !dbg !11 { entry: -; CHECK: call void @llvm.dbg.value(metadata i32 undef, metadata !15, metadata !DIExpression()), !dbg !16 +; CHECK: call void @llvm.dbg.value(metadata i32 %k, metadata !15, metadata !DIExpression(DW_OP_LLVM_entry_value, 1)), !dbg !16 call void @llvm.dbg.value(metadata i32 %k, metadata !15, metadata !DIExpression()), !dbg !16 %0 = load i32, i32* @s, align 4, !dbg !17 %inc = add nsw i32 %0, 1, !dbg !17 Index: llvm/test/Verifier/diexpression-entry-value-llvm-ir.ll =================================================================== --- llvm/test/Verifier/diexpression-entry-value-llvm-ir.ll +++ /dev/null @@ -1,31 +0,0 @@ -; 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: call void @llvm.dbg.value(metadata i32 %param, metadata !{{.*}}, metadata !DIExpression(DW_OP_LLVM_entry_value, 1)) -; CHECK: warning: ignoring invalid debug info - -define void @foo(i32 %param) !dbg !4 { -entry: - call void @llvm.dbg.value(metadata i32 %param, metadata !8, metadata !DIExpression(DW_OP_LLVM_entry_value, 1)), !dbg !9 - ret void -} - -declare void @llvm.dbg.value(metadata, metadata, metadata) #0 - -attributes #0 = { nounwind readnone speculatable willreturn } - -!llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!2, !3} - -!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, emissionKind: FullDebug) -!1 = !DIFile(filename: "a.c", directory: "/") -!2 = !{i32 2, !"Dwarf Version", i32 4} -!3 = !{i32 2, !"Debug Info Version", i32 3} -!4 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, type: !5, unit: !0) -!5 = !DISubroutineType(types: !6) -!6 = !{null, !7} -!7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) -!8 = !DILocalVariable(name: "param", arg: 1, scope: !4, file: !1, type: !7) -!9 = !DILocation(line: 0, scope: !4)