diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -7994,7 +7994,9 @@ // Does this dbg.value refer to a sunk address calculation? bool AnyChange = false; - for (Value *Location : DVI.getValues()) { + SmallDenseSet LocationOps(DVI.location_ops().begin(), + DVI.location_ops().end()); + for (Value *Location : LocationOps) { WeakTrackingVH SunkAddrVH = SunkAddrs[Location]; Value *SunkAddr = SunkAddrVH.pointsToAliveValue() ? SunkAddrVH : nullptr; if (SunkAddr) { diff --git a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp --- a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp @@ -1348,7 +1348,9 @@ for (auto &BB : F) { for (auto &Inst : BB) { if (auto *DVI = dyn_cast(&Inst)) { - for (Value *V : DVI->location_ops()) { + SmallDenseSet LocationOps(DVI->location_ops().begin(), + DVI->location_ops().end()); + for (Value *V : LocationOps) { if (auto *AI = dyn_cast_or_null(V)) { if (auto *NewAI = AllocaToPaddedAllocaMap.lookup(AI)) DVI->replaceVariableLocationOp(V, NewAI); diff --git a/llvm/test/DebugInfo/X86/codegenprep-addrsink.ll b/llvm/test/DebugInfo/X86/codegenprep-addrsink.ll --- a/llvm/test/DebugInfo/X86/codegenprep-addrsink.ll +++ b/llvm/test/DebugInfo/X86/codegenprep-addrsink.ll @@ -33,9 +33,12 @@ ; CHECK-NEXT: %loaded = load i8, i8* %[[GEPVAR]] ; CHECK-NEXT: call void @llvm.dbg.value(metadata i8* %[[GEPVAR]], ; CHECK-SAME: metadata ![[DIVAR]], +; CHECK-NEXT: call void @llvm.dbg.value(metadata !DIArgList(i8* %[[GEPVAR]], +; CHECK-SAME: i8* %[[GEPVAR]]), metadata ![[DIVAR]], call void @llvm.dbg.value(metadata i8 *%arith, metadata !12, metadata !DIExpression()), !dbg !14 %loaded = load i8, i8 *%arith call void @llvm.dbg.value(metadata i8 *%arith, metadata !12, metadata !DIExpression()), !dbg !14 + call void @llvm.dbg.value(metadata !DIArgList(i8 *%arith, i8 *%arith), metadata !12, metadata !DIExpression()), !dbg !14 ret i8 %loaded ret: diff --git a/llvm/test/Instrumentation/HWAddressSanitizer/alloca.ll b/llvm/test/Instrumentation/HWAddressSanitizer/alloca.ll --- a/llvm/test/Instrumentation/HWAddressSanitizer/alloca.ll +++ b/llvm/test/Instrumentation/HWAddressSanitizer/alloca.ll @@ -9,7 +9,7 @@ declare void @use32(i32*) -define void @test_alloca() sanitize_hwaddress { +define void @test_alloca() sanitize_hwaddress !dbg !15 { ; CHECK-LABEL: @test_alloca( ; CHECK: %[[FP:[^ ]*]] = call i8* @llvm.frameaddress.p0i8(i32 0) ; CHECK: %[[A:[^ ]*]] = ptrtoint i8* %[[FP]] to i64 @@ -34,6 +34,8 @@ ; CHECK: %[[X_I8:[^ ]*]] = bitcast i32* %[[X_BC]] to i8* ; CHECK: %[[X_I8_GEP:[^ ]*]] = getelementptr i8, i8* %[[X_I8]], i32 15 ; CHECK: store i8 %[[X_TAG2]], i8* %[[X_I8_GEP]] +; CHECK: call void @llvm.dbg.value( +; CHECK-SAME: metadata !DIArgList(i32* %[[X_BC]], i32* %[[X_BC]]) ; CHECK: call void @use32(i32* nonnull %[[X_HWASAN]]) ; UAR-TAGS: %[[BASE_TAG_COMPL:[^ ]*]] = xor i64 %[[BASE_TAG]], 255 @@ -49,6 +51,29 @@ entry: %x = alloca i32, align 4 - call void @use32(i32* nonnull %x) - ret void + call void @llvm.dbg.value(metadata !DIArgList(i32* %x, i32* %x), metadata !22, metadata !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_plus, DW_OP_deref)), !dbg !21 + call void @use32(i32* nonnull %x), !dbg !23 + ret void, !dbg !24 } + +declare void @llvm.dbg.value(metadata, metadata, metadata) + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!3, !4} +!llvm.ident = !{!14} + +!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 13.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None) +!1 = !DIFile(filename: "alloca.cpp", directory: "/") +!2 = !{} +!3 = !{i32 7, !"Dwarf Version", i32 4} +!4 = !{i32 2, !"Debug Info Version", i32 3} +!14 = !{!"clang version 13.0.0"} +!15 = distinct !DISubprogram(name: "test_alloca", linkageName: "_Z11test_allocav", scope: !1, file: !1, line: 4, type: !16, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) +!16 = !DISubroutineType(types: !17) +!17 = !{null} +!19 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !20, size: 64) +!20 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!21 = !DILocation(line: 0, scope: !15) +!22 = !DILocalVariable(name: "x", scope: !15, file: !1, line: 5, type: !20) +!23 = !DILocation(line: 7, column: 5, scope: !15) +!24 = !DILocation(line: 8, column: 1, scope: !15)