From 388fac5de6c4ce1b93058f9963a66569ebf3e131 Mon Sep 17 00:00:00 2001 From: Vedant Kumar Date: Tue, 13 Feb 2018 03:34:23 +0000 Subject: [PATCH] [Utils] Salvage debug info from all no-op casts We already try to salvage debug values from no-op bitcasts and inttoptr instructions: we should handle ptrtoint instructions as well. This saves an additional 24,444 debug values in a stage2 build of clang, and (according to llvm-dwarfdump --statistics) provides an additional 289 unique source variables. llvm-svn: 324982 --- llvm/lib/Transforms/Utils/Local.cpp | 11 +++++++---- llvm/test/Transforms/InstCombine/debuginfo-variables.ll | 10 ++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index 45962ca..e170b22 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -1518,11 +1518,14 @@ void llvm::salvageDebugInfo(Instruction &I) { doSalvage(DII, Ops); }; - if (isa(&I) || isa(&I)) { - // Bitcasts are entirely irrelevant for debug info. Rewrite dbg.value, - // dbg.addr, and dbg.declare to use the cast's source. + if (auto *CI = dyn_cast(&I)) { + if (!CI->isNoopCast(M.getDataLayout())) + return; + + // No-op casts are irrelevant for debug info. + MetadataAsValue *CastSrc = wrapMD(I.getOperand(0)); for (auto *DII : DbgUsers) { - DII->setOperand(0, wrapMD(I.getOperand(0))); + DII->setOperand(0, CastSrc); DEBUG(dbgs() << "SALVAGE: " << *DII << '\n'); } } else if (auto *GEP = dyn_cast(&I)) { diff --git a/llvm/test/Transforms/InstCombine/debuginfo-variables.ll b/llvm/test/Transforms/InstCombine/debuginfo-variables.ll index 418ef81..d420346 100644 --- a/llvm/test/Transforms/InstCombine/debuginfo-variables.ll +++ b/llvm/test/Transforms/InstCombine/debuginfo-variables.ll @@ -80,6 +80,13 @@ define void @test_srem(i64 %A) { ret void } +define void @test_ptrtoint(i64* %P) { +; CHECK-LABEL: @test_ptrtoint +; CHECK-NEXT: call void @llvm.dbg.value(metadata i64* %P, metadata !67, metadata !DIExpression()), !dbg !68 + %1 = ptrtoint i64* %P to i64 + ret void +} + ; CHECK: !8 = !DILocalVariable(name: "1", scope: !5, file: !1, line: 1, type: !9) ; CHECK: !10 = !DILocalVariable(name: "2", scope: !5, file: !1, line: 2, type: !11) ; CHECK: !12 = !DILocation(line: 2, column: 1, scope: !5) @@ -114,3 +121,6 @@ define void @test_srem(i64 %A) { ; CHECK: !62 = !DILocalVariable(name: "12", scope: !60, file: !1, line: 22, type: !11) ; CHECK: !63 = !DILocation(line: 22, column: 1, scope: !60) + +; CHECK: !67 = !DILocalVariable(name: "13", scope: !65, file: !1, line: 24, type: !11) +; CHECK: !68 = !DILocation(line: 24, column: 1, scope: !65) -- 2.7.4