diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index c19a8d103cfcb..ff92abb77ac20 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -1724,9 +1724,11 @@ void llvm::ConvertDebugDeclareToDebugValue(DbgVariableIntrinsic *DII, SI->getIterator()); } +namespace llvm { // RemoveDIs: duplicate the getDebugValueLoc method using DPValues instead of -// dbg.value intrinsics. -static DebugLoc getDebugValueLocDPV(DPValue *DPV) { +// dbg.value intrinsics. In llvm namespace so that it overloads the +// DbgVariableIntrinsic version. +static DebugLoc getDebugValueLoc(DPValue *DPV) { // Original dbg.declare must have a location. const DebugLoc &DeclareLoc = DPV->getDebugLoc(); MDNode *Scope = DeclareLoc.getScope(); @@ -1734,6 +1736,7 @@ static DebugLoc getDebugValueLocDPV(DPValue *DPV) { // Produce an unknown location with the correct scope / inlinedAt fields. return DILocation::get(DPV->getContext(), 0, 0, Scope, InlinedAt); } +} // namespace llvm /// Inserts a llvm.dbg.value intrinsic before a load of an alloca'd value /// that has an associated llvm.dbg.declare intrinsic. @@ -1770,7 +1773,7 @@ void llvm::ConvertDebugDeclareToDebugValue(DPValue *DPV, StoreInst *SI, auto *DIExpr = DPV->getExpression(); Value *DV = SI->getValueOperand(); - DebugLoc NewLoc = getDebugValueLocDPV(DPV); + DebugLoc NewLoc = getDebugValueLoc(DPV); if (!valueCoversEntireFragment(DV->getType(), DPV)) { // FIXME: If storing to a part of the variable described by the dbg.declare, @@ -1842,7 +1845,7 @@ void llvm::ConvertDebugDeclareToDebugValue(DPValue *DPV, LoadInst *LI, return; } - DebugLoc NewLoc = getDebugValueLocDPV(DPV); + DebugLoc NewLoc = getDebugValueLoc(DPV); // We are now tracking the loaded value instead of the address. In the // future if multi-location support is added to the IR, it might be @@ -1887,7 +1890,7 @@ void llvm::ConvertDebugDeclareToDebugValue(DPValue *DPV, PHINode *APN, BasicBlock *BB = APN->getParent(); auto InsertionPt = BB->getFirstInsertionPt(); - DebugLoc NewLoc = getDebugValueLocDPV(DPV); + DebugLoc NewLoc = getDebugValueLoc(DPV); // The block may be a catchswitch block, which does not have a valid // insertion point. @@ -1903,17 +1906,24 @@ bool llvm::LowerDbgDeclare(Function &F) { bool Changed = false; DIBuilder DIB(*F.getParent(), /*AllowUnresolved*/ false); SmallVector Dbgs; - for (auto &FI : F) - for (Instruction &BI : FI) - if (auto DDI = dyn_cast(&BI)) + SmallVector DPVs; + for (auto &FI : F) { + for (Instruction &BI : FI) { + if (auto *DDI = dyn_cast(&BI)) Dbgs.push_back(DDI); + for (DPValue &DPV : BI.getDbgValueRange()) { + if (DPV.getType() == DPValue::LocationType::Declare) + DPVs.push_back(&DPV); + } + } + } - if (Dbgs.empty()) + if (Dbgs.empty() && DPVs.empty()) return Changed; - for (auto &I : Dbgs) { - DbgDeclareInst *DDI = I; - AllocaInst *AI = dyn_cast_or_null(DDI->getAddress()); + auto LowerOne = [&](auto *DDI) { + AllocaInst *AI = + dyn_cast_or_null(DDI->getVariableLocationOp(0)); // If this is an alloca for a scalar variable, insert a dbg.value // at each load and store to the alloca and erase the dbg.declare. // The dbg.values allow tracking a variable even if it is not @@ -1921,7 +1931,7 @@ bool llvm::LowerDbgDeclare(Function &F) { // the stack slot (and at a lexical-scope granularity). Later // passes will attempt to elide the stack slot. if (!AI || isArray(AI) || isStructure(AI)) - continue; + return; // A volatile load/store means that the alloca can't be elided anyway. if (llvm::any_of(AI->users(), [](User *U) -> bool { @@ -1931,7 +1941,7 @@ bool llvm::LowerDbgDeclare(Function &F) { return SI->isVolatile(); return false; })) - continue; + return; SmallVector WorkList; WorkList.push_back(AI); @@ -1963,11 +1973,14 @@ bool llvm::LowerDbgDeclare(Function &F) { } DDI->eraseFromParent(); Changed = true; - } + }; + + for_each(Dbgs, LowerOne); + for_each(DPVs, LowerOne); if (Changed) - for (BasicBlock &BB : F) - RemoveRedundantDbgInstrs(&BB); + for (BasicBlock &BB : F) + RemoveRedundantDbgInstrs(&BB); return Changed; } diff --git a/llvm/test/DebugInfo/ARM/lowerbdgdeclare_vla.ll b/llvm/test/DebugInfo/ARM/lowerbdgdeclare_vla.ll index 0b3375d511ebf..2a0ee339e52e8 100644 --- a/llvm/test/DebugInfo/ARM/lowerbdgdeclare_vla.ll +++ b/llvm/test/DebugInfo/ARM/lowerbdgdeclare_vla.ll @@ -1,4 +1,5 @@ ; RUN: opt -passes=instcombine %s -S | FileCheck %s +; RUN: opt --try-experimental-debuginfo-iterators -passes=instcombine %s -S | FileCheck %s ; ; Generate me from: ; clang -cc1 -triple thumbv7-apple-ios7.0.0 -S -target-abi apcs-gnu -gdwarf-2 -Os test.c -o test.ll -emit-llvm diff --git a/llvm/test/DebugInfo/Generic/dbg-value-lower-linenos.ll b/llvm/test/DebugInfo/Generic/dbg-value-lower-linenos.ll index 7c3490996c8c3..7fffa93008f6c 100644 --- a/llvm/test/DebugInfo/Generic/dbg-value-lower-linenos.ll +++ b/llvm/test/DebugInfo/Generic/dbg-value-lower-linenos.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -S -passes=mem2reg,instcombine | FileCheck %s +; RUN: opt --try-experimental-debuginfo-iterators < %s -S -passes=mem2reg,instcombine | FileCheck %s ; The '%bar' alloca will be promoted to an SSA register by mem2reg: test that ; zero line number are assigned to the dbg.value intrinsics that are inserted diff --git a/llvm/test/DebugInfo/X86/array2.ll b/llvm/test/DebugInfo/X86/array2.ll index 17128e37d83e8..8b386ca44c5fb 100644 --- a/llvm/test/DebugInfo/X86/array2.ll +++ b/llvm/test/DebugInfo/X86/array2.ll @@ -13,6 +13,7 @@ ; } ; ; RUN: opt %s -O2 -S -o - | FileCheck %s +; RUN: opt --try-experimental-debuginfo-iterators %s -O2 -S -o - | FileCheck %s ; Test that we correctly lower dbg.declares for arrays. ; ; CHECK: define i32 @main diff --git a/llvm/test/DebugInfo/X86/formal_parameter.ll b/llvm/test/DebugInfo/X86/formal_parameter.ll index 21f86fbece83e..553b20ff09ad2 100644 --- a/llvm/test/DebugInfo/X86/formal_parameter.ll +++ b/llvm/test/DebugInfo/X86/formal_parameter.ll @@ -15,6 +15,7 @@ target triple = "x86_64-apple-macosx10.9.0" ; RUN: opt %s -O2 -S -o %t ; RUN: cat %t | FileCheck --check-prefix=LOWERING %s ; RUN: llc -filetype=obj %t -o - | llvm-dwarfdump -debug-info - | FileCheck %s +; RUN: llc --try-experimental-debuginfo-iterators -filetype=obj %t -o - | llvm-dwarfdump -debug-info - | FileCheck %s ; Test that we only emit only one DW_AT_formal_parameter "map" for this function. ; rdar://problem/14874886 ; diff --git a/llvm/test/DebugInfo/X86/instcombine-instrinsics.ll b/llvm/test/DebugInfo/X86/instcombine-instrinsics.ll index c25cbbffee1ef..ff5e07318d1e7 100644 --- a/llvm/test/DebugInfo/X86/instcombine-instrinsics.ll +++ b/llvm/test/DebugInfo/X86/instcombine-instrinsics.ll @@ -1,4 +1,5 @@ ; RUN: opt %s -O2 -S -o - | FileCheck %s +; RUN: opt --try-experimental-debuginfo-iterators %s -O2 -S -o - | FileCheck %s ; Verify that we emit the same intrinsic at most once. ; rdar://problem/13056109 ; diff --git a/llvm/test/DebugInfo/duplicate_dbgvalue.ll b/llvm/test/DebugInfo/duplicate_dbgvalue.ll index 250d2b5a5f30f..685e666b2ffb8 100644 --- a/llvm/test/DebugInfo/duplicate_dbgvalue.ll +++ b/llvm/test/DebugInfo/duplicate_dbgvalue.ll @@ -1,4 +1,5 @@ ; RUN: opt -passes=instcombine -S -o - < %s | FileCheck %s +; RUN: opt --try-experimental-debuginfo-iterators -passes=instcombine -S -o - < %s | FileCheck %s ; CHECK-LABEL: %3 = load i32, ptr %i1_311 ; CHECK: call void @llvm.dbg.value(metadata i32 %3 diff --git a/llvm/test/DebugInfo/verify-di-preserve.ll b/llvm/test/DebugInfo/verify-di-preserve.ll index 46d17154ebf62..a2f1b1dd78dc5 100644 --- a/llvm/test/DebugInfo/verify-di-preserve.ll +++ b/llvm/test/DebugInfo/verify-di-preserve.ll @@ -1,8 +1,10 @@ ; RUN: opt %s -verify-debuginfo-preserve -passes=instcombine -disable-output 2>&1 | FileCheck --check-prefix=VERIFY %s +; RUN: opt --try-experimental-debuginfo-iterators %s -verify-debuginfo-preserve -passes=instcombine -disable-output 2>&1 | FileCheck --check-prefix=VERIFY %s ; VERIFY: CheckModuleDebugify (original debuginfo): ; RUN: opt %s -verify-each-debuginfo-preserve -O2 -disable-output 2>&1 | FileCheck --check-prefix=VERIFY-EACH %s +; RUN: opt %s --try-experimental-debuginfo-iterators -verify-each-debuginfo-preserve -O2 -disable-output 2>&1 | FileCheck --check-prefix=VERIFY-EACH %s ; VERIFY-EACH: DeadArgumentEliminationPass ; VERIFY-EACH: GlobalDCEPass diff --git a/llvm/test/Transforms/InstCombine/dbg-scalable-store-fixed-frag.ll b/llvm/test/Transforms/InstCombine/dbg-scalable-store-fixed-frag.ll index f1f107c4bf772..54c096b42e493 100644 --- a/llvm/test/Transforms/InstCombine/dbg-scalable-store-fixed-frag.ll +++ b/llvm/test/Transforms/InstCombine/dbg-scalable-store-fixed-frag.ll @@ -2,6 +2,7 @@ ; RUN: opt < %s -passes='instcombine' -S | FileCheck %s ; RUN: opt < %s -passes='instcombine' -S --try-experimental-debuginfo-iterators | FileCheck %s + define i32 @foo( %x) { ; CHECK-LABEL: @foo( ; CHECK-NEXT: entry: diff --git a/llvm/test/Transforms/InstCombine/dbg-simplify-alloca-size.ll b/llvm/test/Transforms/InstCombine/dbg-simplify-alloca-size.ll index 028b19fadf197..03e8e44109e6b 100644 --- a/llvm/test/Transforms/InstCombine/dbg-simplify-alloca-size.ll +++ b/llvm/test/Transforms/InstCombine/dbg-simplify-alloca-size.ll @@ -1,4 +1,5 @@ ; RUN: opt -S --passes=instcombine %s | FileCheck %s +; RUN: opt --try-experimental-debuginfo-iterators -S --passes=instcombine %s | FileCheck %s ; https://github.com/llvm/llvm-project/issues/56807 declare void @foo(ptr %pixels) diff --git a/llvm/test/Transforms/InstCombine/debuginfo-scalable-typesize.ll b/llvm/test/Transforms/InstCombine/debuginfo-scalable-typesize.ll index b2e78f1eff002..feea036519b85 100644 --- a/llvm/test/Transforms/InstCombine/debuginfo-scalable-typesize.ll +++ b/llvm/test/Transforms/InstCombine/debuginfo-scalable-typesize.ll @@ -1,4 +1,5 @@ ; RUN: opt -passes=instcombine -S < %s | FileCheck %s +; RUN: opt --try-experimental-debuginfo-iterators -passes=instcombine -S < %s | FileCheck %s ; This test is defending against a TypeSize message raised in the method ; `valueCoversEntireFragment` in Local.cpp because of an implicit cast from diff --git a/llvm/test/Transforms/InstCombine/lifetime-no-null-opt.ll b/llvm/test/Transforms/InstCombine/lifetime-no-null-opt.ll index 5e110c9d94387..1f85dd8646009 100644 --- a/llvm/test/Transforms/InstCombine/lifetime-no-null-opt.ll +++ b/llvm/test/Transforms/InstCombine/lifetime-no-null-opt.ll @@ -1,5 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -passes=instcombine -S | FileCheck %s +; RUN: opt --try-experimental-debuginfo-iterators < %s -passes=instcombine -S | FileCheck %s declare void @llvm.dbg.declare(metadata, metadata, metadata) declare void @llvm.lifetime.start.p0(i64, ptr nocapture) diff --git a/llvm/test/Transforms/InstCombine/lifetime.ll b/llvm/test/Transforms/InstCombine/lifetime.ll index e809e162a9667..fa1c38b7bdd00 100644 --- a/llvm/test/Transforms/InstCombine/lifetime.ll +++ b/llvm/test/Transforms/InstCombine/lifetime.ll @@ -1,5 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -passes=instcombine -S | FileCheck %s +; RUN: opt --try-experimental-debuginfo-iterators < %s -passes=instcombine -S | FileCheck %s declare void @llvm.dbg.declare(metadata, metadata, metadata) declare void @llvm.lifetime.start.p0(i64, ptr nocapture)