[llvm] 259bdc0 - Revert "Reland "[NFC] Move DroppedVariableStats to its own file and redesign it to be extensible. (#117042)" (#118546)"

Shubham Sandeep Rastogi via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 3 16:50:58 PST 2024


Author: Shubham Sandeep Rastogi
Date: 2024-12-03T16:50:53-08:00
New Revision: 259bdc0033d1abacc80ad34f0a8ed86f6e218571

URL: https://github.com/llvm/llvm-project/commit/259bdc0033d1abacc80ad34f0a8ed86f6e218571
DIFF: https://github.com/llvm/llvm-project/commit/259bdc0033d1abacc80ad34f0a8ed86f6e218571.diff

LOG: Revert "Reland "[NFC] Move DroppedVariableStats to its own file and redesign it to be extensible. (#117042)" (#118546)"

This reverts commit 0c8928d456ac3ef23ed25bfc9e5d491dd7b62a11.

Broke Bot: https://lab.llvm.org/buildbot/#/builders/76/builds/5008

error: undefined reference to `vtable for llvm::DroppedVariableStatsIR'

Added: 
    llvm/unittests/IR/DroppedVariableStatsTest.cpp

Modified: 
    llvm/include/llvm/Passes/StandardInstrumentations.h
    llvm/lib/CodeGen/CMakeLists.txt
    llvm/lib/Passes/StandardInstrumentations.cpp
    llvm/unittests/CodeGen/CMakeLists.txt
    llvm/unittests/IR/CMakeLists.txt

Removed: 
    0001-Reland-Add-a-pass-to-collect-dropped-var-stats-for-M.patch
    0001-Reland-NFC-Move-DroppedVariableStats-to-its-own-file.patch
    llvm/include/llvm/CodeGen/DroppedVariableStats.h
    llvm/lib/CodeGen/DroppedVariableStats.cpp
    llvm/unittests/CodeGen/DroppedVariableStatsIRTest.cpp


################################################################################
diff  --git a/0001-Reland-Add-a-pass-to-collect-dropped-var-stats-for-M.patch b/0001-Reland-Add-a-pass-to-collect-dropped-var-stats-for-M.patch
deleted file mode 100644
index 95c0a0b54f7e24..00000000000000
--- a/0001-Reland-Add-a-pass-to-collect-dropped-var-stats-for-M.patch
+++ /dev/null
@@ -1,1301 +0,0 @@
-From 8f00eaaa595c1b908d43b1de288e3c03f1f998bf Mon Sep 17 00:00:00 2001
-From: Shubham Sandeep Rastogi <srastogi22 at apple.com>
-Date: Mon, 18 Nov 2024 16:06:59 -0800
-Subject: [PATCH] Reland "Add a pass to collect dropped var stats for MIR"
-
-Moved the MIR Test to the unittests/CodeGen folder
----
- .../llvm/CodeGen/DroppedVariableStats.h       |   48 +-
- .../llvm/CodeGen/MachineFunctionPass.h        |    2 +
- llvm/lib/CodeGen/DroppedVariableStats.cpp     |   63 +-
- llvm/lib/CodeGen/MachineFunctionPass.cpp      |   15 +-
- llvm/unittests/CodeGen/CMakeLists.txt         |    1 +
- .../CodeGen/DroppedVariableStatsMIRTest.cpp   | 1067 +++++++++++++++++
- 6 files changed, 1193 insertions(+), 3 deletions(-)
- create mode 100644 llvm/unittests/CodeGen/DroppedVariableStatsMIRTest.cpp
-
-
diff  --git a/llvm/include/llvm/CodeGen/DroppedVariableStats.h b/llvm/include/llvm/CodeGen/DroppedVariableStats.h
-index 371d775b02e8..f6050c68c91a 100644
---- a/llvm/include/llvm/CodeGen/DroppedVariableStats.h
-+++ b/llvm/include/llvm/CodeGen/DroppedVariableStats.h
-@@ -7,7 +7,7 @@
- ///===---------------------------------------------------------------------===//
- /// \file
- /// Dropped Variable Statistics for Debug Information. Reports any number
--/// of #dbg_value that get dropped due to an optimization pass.
-+/// of #dbg_values or DBG_VALUEs that get dropped due to an optimization pass.
- ///
- ///===---------------------------------------------------------------------===//
- 
-@@ -221,6 +221,52 @@ private:
-   }
- };
- 
-+/// A class to collect and print dropped debug information due to MIR
-+/// optimization passes. After every MIR pass is run, it will print how many
-+/// #DBG_VALUEs were dropped due to that pass.
-+class DroppedVariableStatsMIR : public DroppedVariableStats {
-+public:
-+  DroppedVariableStatsMIR() : llvm::DroppedVariableStats(false) {}
-+
-+  void runBeforePass(StringRef PassID, MachineFunction *MF) {
-+    if (PassID == "Debug Variable Analysis")
-+      return;
-+    setup();
-+    return runOnMachineFunction(MF, true);
-+  }
-+
-+  void runAfterPass(StringRef PassID, MachineFunction *MF) {
-+    if (PassID == "Debug Variable Analysis")
-+      return;
-+    runOnMachineFunction(MF, false);
-+    calculateDroppedVarStatsOnMachineFunction(MF, PassID, MF->getName().str());
-+    cleanup();
-+  }
-+
-+private:
-+  const MachineFunction *MFunc;
-+  /// Populate DebugVariablesBefore, DebugVariablesAfter, InlinedAts before or
-+  /// after a pass has run to facilitate dropped variable calculation for an
-+  /// llvm::MachineFunction.
-+  void runOnMachineFunction(const MachineFunction *MF, bool Before);
-+  /// Iterate over all Instructions in a MachineFunction and report any dropped
-+  /// debug information.
-+  void calculateDroppedVarStatsOnMachineFunction(const MachineFunction *MF,
-+                                                 StringRef PassID,
-+                                                 StringRef FuncOrModName);
-+  /// Override base class method to run on an llvm::MachineFunction
-+  /// specifically.
-+  virtual void
-+  visitEveryInstruction(unsigned &DroppedCount,
-+                        DenseMap<VarID, DILocation *> &InlinedAtsMap,
-+                        VarID Var) override;
-+  /// Override base class method to run on DBG_VALUEs specifically.
-+  virtual void visitEveryDebugRecord(
-+      DenseSet<VarID> &VarIDSet,
-+      DenseMap<StringRef, DenseMap<VarID, DILocation *>> &InlinedAtsMap,
-+      StringRef FuncName, bool Before) override;
-+};
-+
- } // namespace llvm
- 
- #endif
-
diff  --git a/llvm/include/llvm/CodeGen/MachineFunctionPass.h b/llvm/include/llvm/CodeGen/MachineFunctionPass.h
-index caaf22c2139e..d82b593497ff 100644
---- a/llvm/include/llvm/CodeGen/MachineFunctionPass.h
-+++ b/llvm/include/llvm/CodeGen/MachineFunctionPass.h
-@@ -18,6 +18,7 @@
- #ifndef LLVM_CODEGEN_MACHINEFUNCTIONPASS_H
- #define LLVM_CODEGEN_MACHINEFUNCTIONPASS_H
- 
-+#include "llvm/CodeGen/DroppedVariableStats.h"
- #include "llvm/CodeGen/MachineFunction.h"
- #include "llvm/Pass.h"
- 
-@@ -67,6 +68,7 @@ private:
-   MachineFunctionProperties RequiredProperties;
-   MachineFunctionProperties SetProperties;
-   MachineFunctionProperties ClearedProperties;
-+  DroppedVariableStatsMIR DroppedVarStatsMF;
- 
-   /// createPrinterPass - Get a machine function printer pass.
-   Pass *createPrinterPass(raw_ostream &O,
-
diff  --git a/llvm/lib/CodeGen/DroppedVariableStats.cpp b/llvm/lib/CodeGen/DroppedVariableStats.cpp
-index 122fcad1293f..71f91292160f 100644
---- a/llvm/lib/CodeGen/DroppedVariableStats.cpp
-+++ b/llvm/lib/CodeGen/DroppedVariableStats.cpp
-@@ -7,7 +7,7 @@
- ///===---------------------------------------------------------------------===//
- /// \file
- /// Dropped Variable Statistics for Debug Information. Reports any number
--/// of #dbg_value that get dropped due to an optimization pass.
-+/// of #dbg_values or DBG_VALUEs that get dropped due to an optimization pass.
- ///
- ///===---------------------------------------------------------------------===//
- 
-@@ -192,3 +192,64 @@ void DroppedVariableStatsIR::visitEveryDebugRecord(
-     }
-   }
- }
-+
-+void DroppedVariableStatsMIR::runOnMachineFunction(const MachineFunction *MF,
-+                                                   bool Before) {
-+  auto &DebugVariables = DebugVariablesStack.back()[&MF->getFunction()];
-+  auto FuncName = MF->getName();
-+  MFunc = MF;
-+  run(DebugVariables, FuncName, Before);
-+}
-+
-+void DroppedVariableStatsMIR::calculateDroppedVarStatsOnMachineFunction(
-+    const MachineFunction *MF, StringRef PassID, StringRef FuncOrModName) {
-+  MFunc = MF;
-+  StringRef FuncName = MF->getName();
-+  const Function *Func = &MF->getFunction();
-+  DebugVariables &DbgVariables = DebugVariablesStack.back()[Func];
-+  calculateDroppedStatsAndPrint(DbgVariables, FuncName, PassID, FuncOrModName,
-+                                "MachineFunction", Func);
-+}
-+
-+void DroppedVariableStatsMIR::visitEveryInstruction(
-+    unsigned &DroppedCount, DenseMap<VarID, DILocation *> &InlinedAtsMap,
-+    VarID Var) {
-+  unsigned PrevDroppedCount = DroppedCount;
-+  const DIScope *DbgValScope = std::get<0>(Var);
-+  for (const auto &MBB : *MFunc) {
-+    for (const auto &MI : MBB) {
-+      if (!MI.isDebugInstr()) {
-+        auto *DbgLoc = MI.getDebugLoc().get();
-+        if (!DbgLoc)
-+          continue;
-+
-+        auto *Scope = DbgLoc->getScope();
-+        if (updateDroppedCount(DbgLoc, Scope, DbgValScope, InlinedAtsMap, Var,
-+                               DroppedCount))
-+          break;
-+      }
-+    }
-+    if (PrevDroppedCount != DroppedCount) {
-+      PrevDroppedCount = DroppedCount;
-+      break;
-+    }
-+  }
-+}
-+
-+void DroppedVariableStatsMIR::visitEveryDebugRecord(
-+    DenseSet<VarID> &VarIDSet,
-+    DenseMap<StringRef, DenseMap<VarID, DILocation *>> &InlinedAtsMap,
-+    StringRef FuncName, bool Before) {
-+  for (const auto &MBB : *MFunc) {
-+    for (const auto &MI : MBB) {
-+      if (MI.isDebugValueLike()) {
-+        auto *DbgVar = MI.getDebugVariable();
-+        if (!DbgVar)
-+          continue;
-+        auto DbgLoc = MI.getDebugLoc();
-+        populateVarIDSetAndInlinedMap(DbgVar, DbgLoc, VarIDSet, InlinedAtsMap,
-+                                      FuncName, Before);
-+      }
-+    }
-+  }
-+}
-
diff  --git a/llvm/lib/CodeGen/MachineFunctionPass.cpp b/llvm/lib/CodeGen/MachineFunctionPass.cpp
-index 62ac3e32d24d..e803811643f8 100644
---- a/llvm/lib/CodeGen/MachineFunctionPass.cpp
-+++ b/llvm/lib/CodeGen/MachineFunctionPass.cpp
-@@ -32,6 +32,11 @@
- using namespace llvm;
- using namespace ore;
- 
-+static cl::opt<bool> DroppedVarStatsMIR(
-+    "dropped-variable-stats-mir", cl::Hidden,
-+    cl::desc("Dump dropped debug variables stats for MIR passes"),
-+    cl::init(false));
-+
- Pass *MachineFunctionPass::createPrinterPass(raw_ostream &O,
-                                              const std::string &Banner) const {
-   return createMachineFunctionPrinterPass(O, Banner);
-@@ -91,7 +96,15 @@ bool MachineFunctionPass::runOnFunction(Function &F) {
- 
-   MFProps.reset(ClearedProperties);
- 
--  bool RV = runOnMachineFunction(MF);
-+  bool RV;
-+  if (DroppedVarStatsMIR) {
-+    auto PassName = getPassName();
-+    DroppedVarStatsMF.runBeforePass(PassName, &MF);
-+    RV = runOnMachineFunction(MF);
-+    DroppedVarStatsMF.runAfterPass(PassName, &MF);
-+  } else {
-+    RV = runOnMachineFunction(MF);
-+  }
- 
-   if (ShouldEmitSizeRemarks) {
-     // We wanted size remarks. Check if there was a change to the number of
-
diff  --git a/llvm/unittests/CodeGen/CMakeLists.txt b/llvm/unittests/CodeGen/CMakeLists.txt
-index 807fd1a9b7b5..50ef1bb5b7af 100644
---- a/llvm/unittests/CodeGen/CMakeLists.txt
-+++ b/llvm/unittests/CodeGen/CMakeLists.txt
-@@ -28,6 +28,7 @@ add_llvm_unittest(CodeGenTests
-   DIEHashTest.cpp
-   DIETest.cpp
-   DroppedVariableStatsIRTest.cpp
-+  DroppedVariableStatsMIRTest.cpp
-   DwarfStringPoolEntryRefTest.cpp
-   InstrRefLDVTest.cpp
-   LowLevelTypeTest.cpp
-
diff  --git a/llvm/unittests/CodeGen/DroppedVariableStatsMIRTest.cpp b/llvm/unittests/CodeGen/DroppedVariableStatsMIRTest.cpp
-new file mode 100644
-index 000000000000..b26a89c7adcb
---- /dev/null
-+++ b/llvm/unittests/CodeGen/DroppedVariableStatsMIRTest.cpp
-@@ -0,0 +1,1067 @@
-+//===- unittests/IR/DroppedVariableStatsTest.cpp - TimePassesHandler tests
-+//----------===//
-+//
-+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-+// See https://llvm.org/LICENSE.txt for license information.
-+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-+//
-+//===----------------------------------------------------------------------===//
-+
-+#include "llvm/AsmParser/Parser.h"
-+#include "llvm/CodeGen/MIRParser/MIRParser.h"
-+#include "llvm/CodeGen/MachineModuleInfo.h"
-+#include "llvm/IR/Function.h"
-+#include "llvm/IR/LegacyPassManager.h"
-+#include "llvm/IR/Module.h"
-+#include "llvm/MC/TargetRegistry.h"
-+#include "llvm/Pass.h"
-+#include "llvm/Passes/StandardInstrumentations.h"
-+#include "llvm/Support/TargetSelect.h"
-+#include "llvm/Target/TargetMachine.h"
-+#include "gtest/gtest.h"
-+#include <gtest/gtest.h>
-+#include <llvm/ADT/SmallString.h>
-+#include <llvm/IR/LLVMContext.h>
-+#include <llvm/IR/Module.h>
-+#include <llvm/IR/PassInstrumentation.h>
-+#include <llvm/IR/PassManager.h>
-+#include <llvm/IR/PassTimingInfo.h>
-+#include <llvm/Support/raw_ostream.h>
-+
-+using namespace llvm;
-+
-+namespace {
-+
-+std::unique_ptr<TargetMachine>
-+createTargetMachine(std::string TT, StringRef CPU, StringRef FS) {
-+  std::string Error;
-+  const Target *T = TargetRegistry::lookupTarget(TT, Error);
-+  if (!T)
-+    return nullptr;
-+  TargetOptions Options;
-+  return std::unique_ptr<TargetMachine>(
-+      static_cast<TargetMachine *>(T->createTargetMachine(
-+          TT, CPU, FS, Options, std::nullopt, std::nullopt)));
-+}
-+
-+std::unique_ptr<Module> parseMIR(const TargetMachine &TM, StringRef MIRCode,
-+                                 MachineModuleInfo &MMI, LLVMContext *Context) {
-+  SMDiagnostic Diagnostic;
-+  std::unique_ptr<Module> M;
-+  std::unique_ptr<MemoryBuffer> MBuffer = MemoryBuffer::getMemBuffer(MIRCode);
-+  auto MIR = createMIRParser(std::move(MBuffer), *Context);
-+  if (!MIR)
-+    return nullptr;
-+
-+  std::unique_ptr<Module> Mod = MIR->parseIRModule();
-+  if (!Mod)
-+    return nullptr;
-+
-+  Mod->setDataLayout(TM.createDataLayout());
-+
-+  if (MIR->parseMachineFunctions(*Mod, MMI)) {
-+    M.reset();
-+    return nullptr;
-+  }
-+  return Mod;
-+}
-+// This test ensures that if a DBG_VALUE and an instruction that exists in the
-+// same scope as that DBG_VALUE are both deleted as a result of an optimization
-+// pass, debug information is considered not dropped.
-+TEST(DroppedVariableStatsMIR, BothDeleted) {
-+  InitializeAllTargetInfos();
-+  InitializeAllTargets();
-+  InitializeAllTargetMCs();
-+  PassInstrumentationCallbacks PIC;
-+  PassInstrumentation PI(&PIC);
-+
-+  LLVMContext C;
-+
-+  const char *MIR =
-+      R"(
-+--- |
-+  ; ModuleID = '/tmp/test.ll'
-+  source_filename = "/tmp/test.ll"
-+  target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32"
-+  
-+  define noundef range(i32 -2147483647, -2147483648) i32 @_Z3fooi(i32 noundef %x) local_unnamed_addr !dbg !4 {
-+  entry:
-+      #dbg_value(i32 %x, !10, !DIExpression(), !11)
-+    %add = add nsw i32 %x, 1, !dbg !12
-+    ret i32 0
-+  }
-+  
-+  !llvm.dbg.cu = !{!0}
-+  !llvm.module.flags = !{!2}
-+  !llvm.ident = !{!3}
-+  
-+  !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: Apple, sysroot: "/")
-+  !1 = !DIFile(filename: "/tmp/code.cpp", directory: "/")
-+  !2 = !{i32 2, !"Debug Info Version", i32 3}
-+  !3 = !{!"clang"}
-+  !4 = distinct !DISubprogram(name: "foo", linkageName: "_Z3fooi", scope: !5, file: !5, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !9)
-+  !5 = !DIFile(filename: "/tmp/code.cpp", directory: "")
-+  !6 = !DISubroutineType(types: !7)
-+  !7 = !{!8, !8}
-+  !8 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
-+  !9 = !{!10}
-+  !10 = !DILocalVariable(name: "x", arg: 1, scope: !4, file: !5, line: 1, type: !8)
-+  !11 = !DILocation(line: 0, scope: !4)
-+  !12 = !DILocation(line: 2, column: 11, scope: !4)
-+
-+...
-+---
-+name:            _Z3fooi
-+alignment:       4
-+exposesReturnsTwice: false
-+legalized:       false
-+regBankSelected: false
-+selected:        false
-+failedISel:      false
-+tracksRegLiveness: true
-+hasWinCFI:       false
-+noPhis:          false
-+isSSA:           true
-+noVRegs:         false
-+hasFakeUses:     false
-+callsEHReturn:   false
-+callsUnwindInit: false
-+hasEHCatchret:   false
-+hasEHScopes:     false
-+hasEHFunclets:   false
-+isOutlined:      false
-+debugInstrRef:   false
-+failsVerification: false
-+tracksDebugUserValues: false
-+registers:
-+  - { id: 0, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 1, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 2, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 3, class: _, preferred-register: '', flags: [  ] }
-+liveins:
-+  - { reg: '$w0', virtual-reg: '' }
-+frameInfo:
-+  isFrameAddressTaken: false
-+  isReturnAddressTaken: false
-+  hasStackMap:     false
-+  hasPatchPoint:   false
-+  stackSize:       0
-+  offsetAdjustment: 0
-+  maxAlignment:    1
-+  adjustsStack:    false
-+  hasCalls:        false
-+  stackProtector:  ''
-+  functionContext: ''
-+  maxCallFrameSize: 4294967295
-+  cvBytesOfCalleeSavedRegisters: 0
-+  hasOpaqueSPAdjustment: false
-+  hasVAStart:      false
-+  hasMustTailInVarArgFunc: false
-+  hasTailCall:     false
-+  isCalleeSavedInfoValid: false
-+  localFrameSize:  0
-+  savePoint:       ''
-+  restorePoint:    ''
-+fixedStack:      []
-+stack:           []
-+entry_values:    []
-+callSites:       []
-+debugValueSubstitutions: []
-+constants:       []
-+machineFunctionInfo: {}
-+body:             |
-+  bb.1.entry:
-+    liveins: $w0
-+  
-+    %0:_(s32) = COPY $w0
-+    %1:_(s32) = G_CONSTANT i32 1
-+    %3:_(s32) = G_CONSTANT i32 0
-+    DBG_VALUE %0(s32), $noreg, !10, !DIExpression(), debug-location !11
-+    %2:_(s32) = nsw G_ADD %0, %1, debug-location !12
-+    $w0 = COPY %3(s32)
-+    RET_ReallyLR implicit $w0
-+    )";
-+  auto TM = createTargetMachine(Triple::normalize("aarch64--"), "", "");
-+  MachineModuleInfo MMI(TM.get());
-+  std::unique_ptr<Module> M = parseMIR(*TM, MIR, MMI, &C);
-+  ASSERT_TRUE(M);
-+
-+  DroppedVariableStatsMIR Stats;
-+  auto *MF = MMI.getMachineFunction(*M->getFunction("_Z3fooi"));
-+  Stats.runBeforePass("Test", MF);
-+
-+  // This loop simulates an IR pass that drops debug information.
-+  for (auto &MBB : *MF) {
-+    for (auto &MI : MBB) {
-+      if (MI.isDebugValueLike()) {
-+        MI.eraseFromParent();
-+        break;
-+      }
-+    }
-+    for (auto &MI : MBB) {
-+      auto *DbgLoc = MI.getDebugLoc().get();
-+      if (DbgLoc) {
-+        MI.eraseFromParent();
-+        break;
-+      }
-+    }
-+    break;
-+  }
-+
-+  Stats.runAfterPass("Test", MF);
-+  ASSERT_EQ(Stats.getPassDroppedVariables(), false);
-+}
-+
-+// This test ensures that if a DBG_VALUE is dropped after an optimization pass,
-+// but an instruction that shares the same scope as the DBG_VALUE still exists,
-+// debug information is conisdered dropped.
-+TEST(DroppedVariableStatsMIR, DbgValLost) {
-+  InitializeAllTargetInfos();
-+  InitializeAllTargets();
-+  InitializeAllTargetMCs();
-+  PassInstrumentationCallbacks PIC;
-+  PassInstrumentation PI(&PIC);
-+
-+  LLVMContext C;
-+
-+  const char *MIR =
-+      R"(
-+--- |
-+  ; ModuleID = '/tmp/test.ll'
-+  source_filename = "/tmp/test.ll"
-+  target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32"
-+  
-+  define noundef range(i32 -2147483647, -2147483648) i32 @_Z3fooi(i32 noundef %x) local_unnamed_addr !dbg !4 {
-+  entry:
-+      #dbg_value(i32 %x, !10, !DIExpression(), !11)
-+    %add = add nsw i32 %x, 1, !dbg !12
-+    ret i32 0
-+  }
-+  
-+  !llvm.dbg.cu = !{!0}
-+  !llvm.module.flags = !{!2}
-+  !llvm.ident = !{!3}
-+  
-+  !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: Apple, sysroot: "/")
-+  !1 = !DIFile(filename: "/tmp/code.cpp", directory: "/")
-+  !2 = !{i32 2, !"Debug Info Version", i32 3}
-+  !3 = !{!"clang"}
-+  !4 = distinct !DISubprogram(name: "foo", linkageName: "_Z3fooi", scope: !5, file: !5, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !9)
-+  !5 = !DIFile(filename: "/tmp/code.cpp", directory: "")
-+  !6 = !DISubroutineType(types: !7)
-+  !7 = !{!8, !8}
-+  !8 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
-+  !9 = !{!10}
-+  !10 = !DILocalVariable(name: "x", arg: 1, scope: !4, file: !5, line: 1, type: !8)
-+  !11 = !DILocation(line: 0, scope: !4)
-+  !12 = !DILocation(line: 2, column: 11, scope: !4)
-+
-+...
-+---
-+name:            _Z3fooi
-+alignment:       4
-+exposesReturnsTwice: false
-+legalized:       false
-+regBankSelected: false
-+selected:        false
-+failedISel:      false
-+tracksRegLiveness: true
-+hasWinCFI:       false
-+noPhis:          false
-+isSSA:           true
-+noVRegs:         false
-+hasFakeUses:     false
-+callsEHReturn:   false
-+callsUnwindInit: false
-+hasEHCatchret:   false
-+hasEHScopes:     false
-+hasEHFunclets:   false
-+isOutlined:      false
-+debugInstrRef:   false
-+failsVerification: false
-+tracksDebugUserValues: false
-+registers:
-+  - { id: 0, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 1, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 2, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 3, class: _, preferred-register: '', flags: [  ] }
-+liveins:
-+  - { reg: '$w0', virtual-reg: '' }
-+frameInfo:
-+  isFrameAddressTaken: false
-+  isReturnAddressTaken: false
-+  hasStackMap:     false
-+  hasPatchPoint:   false
-+  stackSize:       0
-+  offsetAdjustment: 0
-+  maxAlignment:    1
-+  adjustsStack:    false
-+  hasCalls:        false
-+  stackProtector:  ''
-+  functionContext: ''
-+  maxCallFrameSize: 4294967295
-+  cvBytesOfCalleeSavedRegisters: 0
-+  hasOpaqueSPAdjustment: false
-+  hasVAStart:      false
-+  hasMustTailInVarArgFunc: false
-+  hasTailCall:     false
-+  isCalleeSavedInfoValid: false
-+  localFrameSize:  0
-+  savePoint:       ''
-+  restorePoint:    ''
-+fixedStack:      []
-+stack:           []
-+entry_values:    []
-+callSites:       []
-+debugValueSubstitutions: []
-+constants:       []
-+machineFunctionInfo: {}
-+body:             |
-+  bb.1.entry:
-+    liveins: $w0
-+  
-+    %0:_(s32) = COPY $w0
-+    %1:_(s32) = G_CONSTANT i32 1
-+    %3:_(s32) = G_CONSTANT i32 0
-+    DBG_VALUE %0(s32), $noreg, !10, !DIExpression(), debug-location !11
-+    %2:_(s32) = nsw G_ADD %0, %1, debug-location !12
-+    $w0 = COPY %3(s32)
-+    RET_ReallyLR implicit $w0
-+    )";
-+  auto TM = createTargetMachine(Triple::normalize("aarch64--"), "", "");
-+  MachineModuleInfo MMI(TM.get());
-+  std::unique_ptr<Module> M = parseMIR(*TM, MIR, MMI, &C);
-+  ASSERT_TRUE(M);
-+
-+  DroppedVariableStatsMIR Stats;
-+  auto *MF = MMI.getMachineFunction(*M->getFunction("_Z3fooi"));
-+  Stats.runBeforePass("Test", MF);
-+
-+  // This loop simulates an IR pass that drops debug information.
-+  for (auto &MBB : *MF) {
-+    for (auto &MI : MBB) {
-+      if (MI.isDebugValueLike()) {
-+        MI.eraseFromParent();
-+        break;
-+      }
-+    }
-+    break;
-+  }
-+
-+  Stats.runAfterPass("Test", MF);
-+  ASSERT_EQ(Stats.getPassDroppedVariables(), true);
-+}
-+
-+// This test ensures that if a #dbg_value is dropped after an optimization pass,
-+// but an instruction that has an unrelated scope as the #dbg_value still
-+// exists, debug information is conisdered not dropped.
-+TEST(DroppedVariableStatsMIR, UnrelatedScopes) {
-+  InitializeAllTargetInfos();
-+  InitializeAllTargets();
-+  InitializeAllTargetMCs();
-+  PassInstrumentationCallbacks PIC;
-+  PassInstrumentation PI(&PIC);
-+
-+  LLVMContext C;
-+
-+  const char *MIR =
-+      R"(
-+--- |
-+  ; ModuleID = '/tmp/test.ll'
-+  source_filename = "/tmp/test.ll"
-+  target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32"
-+  
-+  define noundef range(i32 -2147483647, -2147483648) i32 @_Z3fooi(i32 noundef %x) local_unnamed_addr !dbg !4 {
-+  entry:
-+      #dbg_value(i32 %x, !10, !DIExpression(), !11)
-+    %add = add nsw i32 %x, 1, !dbg !12
-+    ret i32 0
-+  }
-+  
-+  !llvm.dbg.cu = !{!0}
-+  !llvm.module.flags = !{!2}
-+  !llvm.ident = !{!3}
-+  
-+  !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: Apple, sysroot: "/")
-+  !1 = !DIFile(filename: "/tmp/code.cpp", directory: "/")
-+  !2 = !{i32 2, !"Debug Info Version", i32 3}
-+  !3 = !{!"clang"}
-+  !4 = distinct !DISubprogram(name: "foo", linkageName: "_Z3fooi", scope: !5, file: !5, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !9)
-+  !5 = !DIFile(filename: "/tmp/code.cpp", directory: "")
-+  !6 = !DISubroutineType(types: !7)
-+  !7 = !{!8, !8}
-+  !8 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
-+  !9 = !{!10}
-+  !10 = !DILocalVariable(name: "x", arg: 1, scope: !4, file: !5, line: 1, type: !8)
-+  !11 = !DILocation(line: 0, scope: !4)
-+  !12 = !DILocation(line: 2, column: 11, scope: !13)
-+  !13 = distinct !DISubprogram(name: "bar", linkageName: "_Z3bari", scope: !5, file: !5, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !9)
-+
-+...
-+---
-+name:            _Z3fooi
-+alignment:       4
-+exposesReturnsTwice: false
-+legalized:       false
-+regBankSelected: false
-+selected:        false
-+failedISel:      false
-+tracksRegLiveness: true
-+hasWinCFI:       false
-+noPhis:          false
-+isSSA:           true
-+noVRegs:         false
-+hasFakeUses:     false
-+callsEHReturn:   false
-+callsUnwindInit: false
-+hasEHCatchret:   false
-+hasEHScopes:     false
-+hasEHFunclets:   false
-+isOutlined:      false
-+debugInstrRef:   false
-+failsVerification: false
-+tracksDebugUserValues: false
-+registers:
-+  - { id: 0, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 1, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 2, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 3, class: _, preferred-register: '', flags: [  ] }
-+liveins:
-+  - { reg: '$w0', virtual-reg: '' }
-+frameInfo:
-+  isFrameAddressTaken: false
-+  isReturnAddressTaken: false
-+  hasStackMap:     false
-+  hasPatchPoint:   false
-+  stackSize:       0
-+  offsetAdjustment: 0
-+  maxAlignment:    1
-+  adjustsStack:    false
-+  hasCalls:        false
-+  stackProtector:  ''
-+  functionContext: ''
-+  maxCallFrameSize: 4294967295
-+  cvBytesOfCalleeSavedRegisters: 0
-+  hasOpaqueSPAdjustment: false
-+  hasVAStart:      false
-+  hasMustTailInVarArgFunc: false
-+  hasTailCall:     false
-+  isCalleeSavedInfoValid: false
-+  localFrameSize:  0
-+  savePoint:       ''
-+  restorePoint:    ''
-+fixedStack:      []
-+stack:           []
-+entry_values:    []
-+callSites:       []
-+debugValueSubstitutions: []
-+constants:       []
-+machineFunctionInfo: {}
-+body:             |
-+  bb.1.entry:
-+    liveins: $w0
-+  
-+    %0:_(s32) = COPY $w0
-+    %1:_(s32) = G_CONSTANT i32 1
-+    %3:_(s32) = G_CONSTANT i32 0
-+    DBG_VALUE %0(s32), $noreg, !10, !DIExpression(), debug-location !11
-+    %2:_(s32) = nsw G_ADD %0, %1, debug-location !12
-+    $w0 = COPY %3(s32)
-+    RET_ReallyLR implicit $w0
-+    )";
-+  auto TM = createTargetMachine(Triple::normalize("aarch64--"), "", "");
-+  MachineModuleInfo MMI(TM.get());
-+  std::unique_ptr<Module> M = parseMIR(*TM, MIR, MMI, &C);
-+  ASSERT_TRUE(M);
-+
-+  DroppedVariableStatsMIR Stats;
-+  auto *MF = MMI.getMachineFunction(*M->getFunction("_Z3fooi"));
-+  Stats.runBeforePass("Test", MF);
-+
-+  // This loop simulates an IR pass that drops debug information.
-+  for (auto &MBB : *MF) {
-+    for (auto &MI : MBB) {
-+      if (MI.isDebugValueLike()) {
-+        MI.eraseFromParent();
-+        break;
-+      }
-+    }
-+    break;
-+  }
-+
-+  Stats.runAfterPass("Test", MF);
-+  ASSERT_EQ(Stats.getPassDroppedVariables(), false);
-+}
-+
-+// This test ensures that if a #dbg_value is dropped after an optimization pass,
-+// but an instruction that has a scope which is a child of the #dbg_value scope
-+// still exists, debug information is conisdered dropped.
-+TEST(DroppedVariableStatsMIR, ChildScopes) {
-+  InitializeAllTargetInfos();
-+  InitializeAllTargets();
-+  InitializeAllTargetMCs();
-+  PassInstrumentationCallbacks PIC;
-+  PassInstrumentation PI(&PIC);
-+
-+  LLVMContext C;
-+
-+  const char *MIR =
-+      R"(
-+--- |
-+  ; ModuleID = '/tmp/test.ll'
-+  source_filename = "/tmp/test.ll"
-+  target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32"
-+  
-+  define noundef range(i32 -2147483647, -2147483648) i32 @_Z3fooi(i32 noundef %x) local_unnamed_addr !dbg !4 {
-+  entry:
-+      #dbg_value(i32 %x, !10, !DIExpression(), !11)
-+    %add = add nsw i32 %x, 1, !dbg !12
-+    ret i32 0
-+  }
-+  
-+  !llvm.dbg.cu = !{!0}
-+  !llvm.module.flags = !{!2}
-+  !llvm.ident = !{!3}
-+  
-+  !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: Apple, sysroot: "/")
-+  !1 = !DIFile(filename: "/tmp/code.cpp", directory: "/")
-+  !2 = !{i32 2, !"Debug Info Version", i32 3}
-+  !3 = !{!"clang"}
-+  !4 = distinct !DISubprogram(name: "foo", linkageName: "_Z3fooi", scope: !5, file: !5, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !9)
-+  !5 = !DIFile(filename: "/tmp/code.cpp", directory: "")
-+  !6 = !DISubroutineType(types: !7)
-+  !7 = !{!8, !8}
-+  !8 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
-+  !9 = !{!10}
-+  !10 = !DILocalVariable(name: "x", arg: 1, scope: !4, file: !5, line: 1, type: !8)
-+  !11 = !DILocation(line: 0, scope: !4)
-+  !12 = !DILocation(line: 2, column: 11, scope: !13)
-+  !13 = distinct !DILexicalBlock(scope: !4, file: !5, line: 10, column: 28)
-+
-+...
-+---
-+name:            _Z3fooi
-+alignment:       4
-+exposesReturnsTwice: false
-+legalized:       false
-+regBankSelected: false
-+selected:        false
-+failedISel:      false
-+tracksRegLiveness: true
-+hasWinCFI:       false
-+noPhis:          false
-+isSSA:           true
-+noVRegs:         false
-+hasFakeUses:     false
-+callsEHReturn:   false
-+callsUnwindInit: false
-+hasEHCatchret:   false
-+hasEHScopes:     false
-+hasEHFunclets:   false
-+isOutlined:      false
-+debugInstrRef:   false
-+failsVerification: false
-+tracksDebugUserValues: false
-+registers:
-+  - { id: 0, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 1, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 2, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 3, class: _, preferred-register: '', flags: [  ] }
-+liveins:
-+  - { reg: '$w0', virtual-reg: '' }
-+frameInfo:
-+  isFrameAddressTaken: false
-+  isReturnAddressTaken: false
-+  hasStackMap:     false
-+  hasPatchPoint:   false
-+  stackSize:       0
-+  offsetAdjustment: 0
-+  maxAlignment:    1
-+  adjustsStack:    false
-+  hasCalls:        false
-+  stackProtector:  ''
-+  functionContext: ''
-+  maxCallFrameSize: 4294967295
-+  cvBytesOfCalleeSavedRegisters: 0
-+  hasOpaqueSPAdjustment: false
-+  hasVAStart:      false
-+  hasMustTailInVarArgFunc: false
-+  hasTailCall:     false
-+  isCalleeSavedInfoValid: false
-+  localFrameSize:  0
-+  savePoint:       ''
-+  restorePoint:    ''
-+fixedStack:      []
-+stack:           []
-+entry_values:    []
-+callSites:       []
-+debugValueSubstitutions: []
-+constants:       []
-+machineFunctionInfo: {}
-+body:             |
-+  bb.1.entry:
-+    liveins: $w0
-+  
-+    %0:_(s32) = COPY $w0
-+    %1:_(s32) = G_CONSTANT i32 1
-+    %3:_(s32) = G_CONSTANT i32 0
-+    DBG_VALUE %0(s32), $noreg, !10, !DIExpression(), debug-location !11
-+    %2:_(s32) = nsw G_ADD %0, %1, debug-location !12
-+    $w0 = COPY %3(s32)
-+    RET_ReallyLR implicit $w0
-+    )";
-+  auto TM = createTargetMachine(Triple::normalize("aarch64--"), "", "");
-+  MachineModuleInfo MMI(TM.get());
-+  std::unique_ptr<Module> M = parseMIR(*TM, MIR, MMI, &C);
-+  ASSERT_TRUE(M);
-+
-+  DroppedVariableStatsMIR Stats;
-+  auto *MF = MMI.getMachineFunction(*M->getFunction("_Z3fooi"));
-+  Stats.runBeforePass("Test", MF);
-+
-+  // This loop simulates an IR pass that drops debug information.
-+  for (auto &MBB : *MF) {
-+    for (auto &MI : MBB) {
-+      if (MI.isDebugValueLike()) {
-+        MI.eraseFromParent();
-+        break;
-+      }
-+    }
-+    break;
-+  }
-+
-+  Stats.runAfterPass("Test", MF);
-+  ASSERT_EQ(Stats.getPassDroppedVariables(), true);
-+}
-+
-+// This test ensures that if a DBG_VALUE is dropped after an optimization pass,
-+// but an instruction that has a scope which is a child of the DBG_VALUE scope
-+// still exists, and the DBG_VALUE is inlined at another location, debug
-+// information is conisdered not dropped.
-+TEST(DroppedVariableStatsMIR, InlinedAt) {
-+  InitializeAllTargetInfos();
-+  InitializeAllTargets();
-+  InitializeAllTargetMCs();
-+  PassInstrumentationCallbacks PIC;
-+  PassInstrumentation PI(&PIC);
-+
-+  LLVMContext C;
-+
-+  const char *MIR =
-+      R"(
-+--- |
-+  ; ModuleID = '/tmp/test.ll'
-+  source_filename = "/tmp/test.ll"
-+  target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32"
-+  
-+  define noundef range(i32 -2147483647, -2147483648) i32 @_Z3fooi(i32 noundef %x) local_unnamed_addr !dbg !4 {
-+  entry:
-+      #dbg_value(i32 %x, !10, !DIExpression(), !11)
-+    %add = add nsw i32 %x, 1, !dbg !12
-+    ret i32 0
-+  }
-+  
-+  !llvm.dbg.cu = !{!0}
-+  !llvm.module.flags = !{!2}
-+  !llvm.ident = !{!3}
-+  
-+  !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: Apple, sysroot: "/")
-+  !1 = !DIFile(filename: "/tmp/code.cpp", directory: "/")
-+  !2 = !{i32 2, !"Debug Info Version", i32 3}
-+  !3 = !{!"clang"}
-+  !4 = distinct !DISubprogram(name: "foo", linkageName: "_Z3fooi", scope: !5, file: !5, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !9)
-+  !5 = !DIFile(filename: "/tmp/code.cpp", directory: "")
-+  !6 = !DISubroutineType(types: !7)
-+  !7 = !{!8, !8}
-+  !8 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
-+  !9 = !{!10}
-+  !10 = !DILocalVariable(name: "x", arg: 1, scope: !4, file: !5, line: 1, type: !8)
-+  !11 = !DILocation(line: 0, scope: !4, inlinedAt: !14)
-+  !12 = !DILocation(line: 2, column: 11, scope: !13)
-+  !13 = distinct !DILexicalBlock(scope: !4, file: !5, line: 10, column: 28)
-+  !14 = !DILocation(line: 3, column: 2, scope: !4)
-+
-+...
-+---
-+name:            _Z3fooi
-+alignment:       4
-+exposesReturnsTwice: false
-+legalized:       false
-+regBankSelected: false
-+selected:        false
-+failedISel:      false
-+tracksRegLiveness: true
-+hasWinCFI:       false
-+noPhis:          false
-+isSSA:           true
-+noVRegs:         false
-+hasFakeUses:     false
-+callsEHReturn:   false
-+callsUnwindInit: false
-+hasEHCatchret:   false
-+hasEHScopes:     false
-+hasEHFunclets:   false
-+isOutlined:      false
-+debugInstrRef:   false
-+failsVerification: false
-+tracksDebugUserValues: false
-+registers:
-+  - { id: 0, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 1, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 2, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 3, class: _, preferred-register: '', flags: [  ] }
-+liveins:
-+  - { reg: '$w0', virtual-reg: '' }
-+frameInfo:
-+  isFrameAddressTaken: false
-+  isReturnAddressTaken: false
-+  hasStackMap:     false
-+  hasPatchPoint:   false
-+  stackSize:       0
-+  offsetAdjustment: 0
-+  maxAlignment:    1
-+  adjustsStack:    false
-+  hasCalls:        false
-+  stackProtector:  ''
-+  functionContext: ''
-+  maxCallFrameSize: 4294967295
-+  cvBytesOfCalleeSavedRegisters: 0
-+  hasOpaqueSPAdjustment: false
-+  hasVAStart:      false
-+  hasMustTailInVarArgFunc: false
-+  hasTailCall:     false
-+  isCalleeSavedInfoValid: false
-+  localFrameSize:  0
-+  savePoint:       ''
-+  restorePoint:    ''
-+fixedStack:      []
-+stack:           []
-+entry_values:    []
-+callSites:       []
-+debugValueSubstitutions: []
-+constants:       []
-+machineFunctionInfo: {}
-+body:             |
-+  bb.1.entry:
-+    liveins: $w0
-+  
-+    %0:_(s32) = COPY $w0
-+    %1:_(s32) = G_CONSTANT i32 1
-+    %3:_(s32) = G_CONSTANT i32 0
-+    DBG_VALUE %0(s32), $noreg, !10, !DIExpression(), debug-location !11
-+    %2:_(s32) = nsw G_ADD %0, %1, debug-location !12
-+    $w0 = COPY %3(s32)
-+    RET_ReallyLR implicit $w0
-+    )";
-+  auto TM = createTargetMachine(Triple::normalize("aarch64--"), "", "");
-+  MachineModuleInfo MMI(TM.get());
-+  std::unique_ptr<Module> M = parseMIR(*TM, MIR, MMI, &C);
-+  ASSERT_TRUE(M);
-+
-+  DroppedVariableStatsMIR Stats;
-+  auto *MF = MMI.getMachineFunction(*M->getFunction("_Z3fooi"));
-+  Stats.runBeforePass("Test", MF);
-+
-+  // This loop simulates an IR pass that drops debug information.
-+  for (auto &MBB : *MF) {
-+    for (auto &MI : MBB) {
-+      if (MI.isDebugValueLike()) {
-+        MI.eraseFromParent();
-+        break;
-+      }
-+    }
-+    break;
-+  }
-+
-+  Stats.runAfterPass("Test", MF);
-+  ASSERT_EQ(Stats.getPassDroppedVariables(), false);
-+}
-+
-+// This test ensures that if a DBG_VALUE is dropped after an optimization pass,
-+// but an instruction that has a scope which is a child of the DBG_VALUE scope
-+// still exists, and the DBG_VALUE and the instruction are inlined at another
-+// location, debug information is conisdered dropped.
-+TEST(DroppedVariableStatsMIR, InlinedAtShared) {
-+  InitializeAllTargetInfos();
-+  InitializeAllTargets();
-+  InitializeAllTargetMCs();
-+  PassInstrumentationCallbacks PIC;
-+  PassInstrumentation PI(&PIC);
-+
-+  LLVMContext C;
-+
-+  const char *MIR =
-+      R"(
-+--- |
-+  ; ModuleID = '/tmp/test.ll'
-+  source_filename = "/tmp/test.ll"
-+  target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32"
-+  
-+  define noundef range(i32 -2147483647, -2147483648) i32 @_Z3fooi(i32 noundef %x) local_unnamed_addr !dbg !4 {
-+  entry:
-+      #dbg_value(i32 %x, !10, !DIExpression(), !11)
-+    %add = add nsw i32 %x, 1, !dbg !12
-+    ret i32 0
-+  }
-+  
-+  !llvm.dbg.cu = !{!0}
-+  !llvm.module.flags = !{!2}
-+  !llvm.ident = !{!3}
-+  
-+  !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: Apple, sysroot: "/")
-+  !1 = !DIFile(filename: "/tmp/code.cpp", directory: "/")
-+  !2 = !{i32 2, !"Debug Info Version", i32 3}
-+  !3 = !{!"clang"}
-+  !4 = distinct !DISubprogram(name: "foo", linkageName: "_Z3fooi", scope: !5, file: !5, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !9)
-+  !5 = !DIFile(filename: "/tmp/code.cpp", directory: "")
-+  !6 = !DISubroutineType(types: !7)
-+  !7 = !{!8, !8}
-+  !8 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
-+  !9 = !{!10}
-+  !10 = !DILocalVariable(name: "x", arg: 1, scope: !4, file: !5, line: 1, type: !8)
-+  !11 = !DILocation(line: 0, scope: !4, inlinedAt: !14)
-+  !12 = !DILocation(line: 2, column: 11, scope: !13, inlinedAt: !14)
-+  !13 = distinct !DILexicalBlock(scope: !4, file: !5, line: 10, column: 28)
-+  !14 = !DILocation(line: 3, column: 2, scope: !4)
-+
-+...
-+---
-+name:            _Z3fooi
-+alignment:       4
-+exposesReturnsTwice: false
-+legalized:       false
-+regBankSelected: false
-+selected:        false
-+failedISel:      false
-+tracksRegLiveness: true
-+hasWinCFI:       false
-+noPhis:          false
-+isSSA:           true
-+noVRegs:         false
-+hasFakeUses:     false
-+callsEHReturn:   false
-+callsUnwindInit: false
-+hasEHCatchret:   false
-+hasEHScopes:     false
-+hasEHFunclets:   false
-+isOutlined:      false
-+debugInstrRef:   false
-+failsVerification: false
-+tracksDebugUserValues: false
-+registers:
-+  - { id: 0, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 1, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 2, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 3, class: _, preferred-register: '', flags: [  ] }
-+liveins:
-+  - { reg: '$w0', virtual-reg: '' }
-+frameInfo:
-+  isFrameAddressTaken: false
-+  isReturnAddressTaken: false
-+  hasStackMap:     false
-+  hasPatchPoint:   false
-+  stackSize:       0
-+  offsetAdjustment: 0
-+  maxAlignment:    1
-+  adjustsStack:    false
-+  hasCalls:        false
-+  stackProtector:  ''
-+  functionContext: ''
-+  maxCallFrameSize: 4294967295
-+  cvBytesOfCalleeSavedRegisters: 0
-+  hasOpaqueSPAdjustment: false
-+  hasVAStart:      false
-+  hasMustTailInVarArgFunc: false
-+  hasTailCall:     false
-+  isCalleeSavedInfoValid: false
-+  localFrameSize:  0
-+  savePoint:       ''
-+  restorePoint:    ''
-+fixedStack:      []
-+stack:           []
-+entry_values:    []
-+callSites:       []
-+debugValueSubstitutions: []
-+constants:       []
-+machineFunctionInfo: {}
-+body:             |
-+  bb.1.entry:
-+    liveins: $w0
-+  
-+    %0:_(s32) = COPY $w0
-+    %1:_(s32) = G_CONSTANT i32 1
-+    %3:_(s32) = G_CONSTANT i32 0
-+    DBG_VALUE %0(s32), $noreg, !10, !DIExpression(), debug-location !11
-+    %2:_(s32) = nsw G_ADD %0, %1, debug-location !12
-+    $w0 = COPY %3(s32)
-+    RET_ReallyLR implicit $w0
-+    )";
-+  auto TM = createTargetMachine(Triple::normalize("aarch64--"), "", "");
-+  MachineModuleInfo MMI(TM.get());
-+  std::unique_ptr<Module> M = parseMIR(*TM, MIR, MMI, &C);
-+  ASSERT_TRUE(M);
-+
-+  DroppedVariableStatsMIR Stats;
-+  auto *MF = MMI.getMachineFunction(*M->getFunction("_Z3fooi"));
-+  Stats.runBeforePass("Test", MF);
-+
-+  // This loop simulates an IR pass that drops debug information.
-+  for (auto &MBB : *MF) {
-+    for (auto &MI : MBB) {
-+      if (MI.isDebugValueLike()) {
-+        MI.eraseFromParent();
-+        break;
-+      }
-+    }
-+    break;
-+  }
-+
-+  Stats.runAfterPass("Test", MF);
-+  ASSERT_EQ(Stats.getPassDroppedVariables(), true);
-+}
-+
-+// This test ensures that if a DBG_VALUE is dropped after an optimization pass,
-+// but an instruction that has a scope which is a child of the DBG_VALUE scope
-+// still exists, and the instruction is inlined at a location that is the
-+// DBG_VALUE's inlined at location, debug information is conisdered dropped.
-+TEST(DroppedVariableStatsMIR, InlinedAtChild) {
-+  InitializeAllTargetInfos();
-+  InitializeAllTargets();
-+  InitializeAllTargetMCs();
-+  PassInstrumentationCallbacks PIC;
-+  PassInstrumentation PI(&PIC);
-+
-+  LLVMContext C;
-+
-+  const char *MIR =
-+      R"(
-+--- |
-+  ; ModuleID = '/tmp/test.ll'
-+  source_filename = "/tmp/test.ll"
-+  target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32"
-+  
-+  define noundef range(i32 -2147483647, -2147483648) i32 @_Z3fooi(i32 noundef %x) local_unnamed_addr !dbg !4 {
-+  entry:
-+      #dbg_value(i32 %x, !10, !DIExpression(), !11)
-+    %add = add nsw i32 %x, 1, !dbg !12
-+    ret i32 0
-+  }
-+  
-+  !llvm.dbg.cu = !{!0}
-+  !llvm.module.flags = !{!2}
-+  !llvm.ident = !{!3}
-+  
-+  !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: Apple, sysroot: "/")
-+  !1 = !DIFile(filename: "/tmp/code.cpp", directory: "/")
-+  !2 = !{i32 2, !"Debug Info Version", i32 3}
-+  !3 = !{!"clang"}
-+  !4 = distinct !DISubprogram(name: "foo", linkageName: "_Z3fooi", scope: !5, file: !5, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !9)
-+  !5 = !DIFile(filename: "/tmp/code.cpp", directory: "")
-+  !6 = !DISubroutineType(types: !7)
-+  !7 = !{!8, !8}
-+  !8 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
-+  !9 = !{!10}
-+  !10 = !DILocalVariable(name: "x", arg: 1, scope: !4, file: !5, line: 1, type: !8)
-+  !11 = !DILocation(line: 0, scope: !4, inlinedAt: !14)
-+  !12 = !DILocation(line: 2, column: 11, scope: !13, inlinedAt: !15)
-+  !13 = distinct !DILexicalBlock(scope: !4, file: !5, line: 10, column: 28)
-+  !14 = !DILocation(line: 3, column: 2, scope: !4)
-+  !15 = !DILocation(line: 4, column: 5, scope: !13, inlinedAt: !14)
-+
-+...
-+---
-+name:            _Z3fooi
-+alignment:       4
-+exposesReturnsTwice: false
-+legalized:       false
-+regBankSelected: false
-+selected:        false
-+failedISel:      false
-+tracksRegLiveness: true
-+hasWinCFI:       false
-+noPhis:          false
-+isSSA:           true
-+noVRegs:         false
-+hasFakeUses:     false
-+callsEHReturn:   false
-+callsUnwindInit: false
-+hasEHCatchret:   false
-+hasEHScopes:     false
-+hasEHFunclets:   false
-+isOutlined:      false
-+debugInstrRef:   false
-+failsVerification: false
-+tracksDebugUserValues: false
-+registers:
-+  - { id: 0, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 1, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 2, class: _, preferred-register: '', flags: [  ] }
-+  - { id: 3, class: _, preferred-register: '', flags: [  ] }
-+liveins:
-+  - { reg: '$w0', virtual-reg: '' }
-+frameInfo:
-+  isFrameAddressTaken: false
-+  isReturnAddressTaken: false
-+  hasStackMap:     false
-+  hasPatchPoint:   false
-+  stackSize:       0
-+  offsetAdjustment: 0
-+  maxAlignment:    1
-+  adjustsStack:    false
-+  hasCalls:        false
-+  stackProtector:  ''
-+  functionContext: ''
-+  maxCallFrameSize: 4294967295
-+  cvBytesOfCalleeSavedRegisters: 0
-+  hasOpaqueSPAdjustment: false
-+  hasVAStart:      false
-+  hasMustTailInVarArgFunc: false
-+  hasTailCall:     false
-+  isCalleeSavedInfoValid: false
-+  localFrameSize:  0
-+  savePoint:       ''
-+  restorePoint:    ''
-+fixedStack:      []
-+stack:           []
-+entry_values:    []
-+callSites:       []
-+debugValueSubstitutions: []
-+constants:       []
-+machineFunctionInfo: {}
-+body:             |
-+  bb.1.entry:
-+    liveins: $w0
-+  
-+    %0:_(s32) = COPY $w0
-+    %1:_(s32) = G_CONSTANT i32 1
-+    %3:_(s32) = G_CONSTANT i32 0
-+    DBG_VALUE %0(s32), $noreg, !10, !DIExpression(), debug-location !11
-+    %2:_(s32) = nsw G_ADD %0, %1, debug-location !12
-+    $w0 = COPY %3(s32)
-+    RET_ReallyLR implicit $w0
-+    )";
-+  auto TM = createTargetMachine(Triple::normalize("aarch64--"), "", "");
-+  MachineModuleInfo MMI(TM.get());
-+  std::unique_ptr<Module> M = parseMIR(*TM, MIR, MMI, &C);
-+  ASSERT_TRUE(M);
-+
-+  DroppedVariableStatsMIR Stats;
-+  auto *MF = MMI.getMachineFunction(*M->getFunction("_Z3fooi"));
-+  Stats.runBeforePass("Test", MF);
-+
-+  // This loop simulates an IR pass that drops debug information.
-+  for (auto &MBB : *MF) {
-+    for (auto &MI : MBB) {
-+      if (MI.isDebugValueLike()) {
-+        MI.eraseFromParent();
-+        break;
-+      }
-+    }
-+    break;
-+  }
-+
-+  Stats.runAfterPass("Test", MF);
-+  ASSERT_EQ(Stats.getPassDroppedVariables(), true);
-+}
-+
-+} // end anonymous namespace
--- 
-2.46.2
-

diff  --git a/0001-Reland-NFC-Move-DroppedVariableStats-to-its-own-file.patch b/0001-Reland-NFC-Move-DroppedVariableStats-to-its-own-file.patch
deleted file mode 100644
index e68aa98b82b092..00000000000000
--- a/0001-Reland-NFC-Move-DroppedVariableStats-to-its-own-file.patch
+++ /dev/null
@@ -1,1045 +0,0 @@
-From 1f4f368b9c3b92787018a6ee410c5ab4e79b072d Mon Sep 17 00:00:00 2001
-From: Shubham Sandeep Rastogi <srastogi22 at apple.com>
-Date: Mon, 18 Nov 2024 16:06:26 -0800
-Subject: [PATCH] Reland [NFC] Move DroppedVariableStats to its own file and
- redesign it to be extensible.
-
-Moved the IR unit test to the CodeGen folder to resolve linker errors:
-
-error: undefined reference to 'vtable for llvm::DroppedVariableStatsIR'
----
- .../llvm/CodeGen/DroppedVariableStats.h       | 226 ++++++++++++++++++
- .../llvm/Passes/StandardInstrumentations.h    |  80 +------
- llvm/lib/CodeGen/CMakeLists.txt               |   1 +
- llvm/lib/CodeGen/DroppedVariableStats.cpp     | 194 +++++++++++++++
- llvm/lib/Passes/StandardInstrumentations.cpp  | 178 +-------------
- llvm/unittests/CodeGen/CMakeLists.txt         |   1 +
- .../DroppedVariableStatsIRTest.cpp}           |  74 +++---
- llvm/unittests/IR/CMakeLists.txt              |   1 -
- 8 files changed, 456 insertions(+), 299 deletions(-)
- create mode 100644 llvm/include/llvm/CodeGen/DroppedVariableStats.h
- create mode 100644 llvm/lib/CodeGen/DroppedVariableStats.cpp
- rename llvm/unittests/{IR/DroppedVariableStatsTest.cpp => CodeGen/DroppedVariableStatsIRTest.cpp} (91%)
-
-
diff  --git a/llvm/include/llvm/CodeGen/DroppedVariableStats.h b/llvm/include/llvm/CodeGen/DroppedVariableStats.h
-new file mode 100644
-index 000000000000..371d775b02e8
---- /dev/null
-+++ b/llvm/include/llvm/CodeGen/DroppedVariableStats.h
-@@ -0,0 +1,226 @@
-+///===- DroppedVariableStats.h - Opt Diagnostics -*- C++ -*----------------===//
-+///
-+/// Part of the LLVM Project, under the Apache License v2.0 with LLVM
-+/// Exceptions. See https://llvm.org/LICENSE.txt for license information.
-+/// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-+///
-+///===---------------------------------------------------------------------===//
-+/// \file
-+/// Dropped Variable Statistics for Debug Information. Reports any number
-+/// of #dbg_value that get dropped due to an optimization pass.
-+///
-+///===---------------------------------------------------------------------===//
-+
-+#ifndef LLVM_CODEGEN_DROPPEDVARIABLESTATS_H
-+#define LLVM_CODEGEN_DROPPEDVARIABLESTATS_H
-+
-+#include "llvm/CodeGen/MachinePassManager.h"
-+#include "llvm/IR/DebugInfoMetadata.h"
-+#include "llvm/IR/DiagnosticInfo.h"
-+#include "llvm/IR/Function.h"
-+#include "llvm/IR/Module.h"
-+#include "llvm/IR/PassInstrumentation.h"
-+
-+namespace llvm {
-+
-+/// A unique key that represents a debug variable.
-+/// First const DIScope *: Represents the scope of the debug variable.
-+/// Second const DIScope *: Represents the InlinedAt scope of the debug
-+/// variable. const DILocalVariable *: It is a pointer to the debug variable
-+/// itself.
-+using VarID =
-+    std::tuple<const DIScope *, const DIScope *, const DILocalVariable *>;
-+
-+/// A base class to collect and print dropped debug information variable
-+/// statistics.
-+class DroppedVariableStats {
-+public:
-+  DroppedVariableStats(bool DroppedVarStatsEnabled)
-+      : DroppedVariableStatsEnabled(DroppedVarStatsEnabled) {
-+    if (DroppedVarStatsEnabled)
-+      llvm::outs()
-+          << "Pass Level, Pass Name, Num of Dropped Variables, Func or "
-+             "Module Name\n";
-+  };
-+
-+  virtual ~DroppedVariableStats() = default;
-+
-+  // We intend this to be unique per-compilation, thus no copies.
-+  DroppedVariableStats(const DroppedVariableStats &) = delete;
-+  void operator=(const DroppedVariableStats &) = delete;
-+
-+  bool getPassDroppedVariables() { return PassDroppedVariables; }
-+
-+protected:
-+  void setup() {
-+    DebugVariablesStack.push_back(
-+        {DenseMap<const Function *, DebugVariables>()});
-+    InlinedAts.push_back(
-+        {DenseMap<StringRef, DenseMap<VarID, DILocation *>>()});
-+  }
-+
-+  void cleanup() {
-+    assert(!DebugVariablesStack.empty() &&
-+           "DebugVariablesStack shouldn't be empty!");
-+    assert(!InlinedAts.empty() && "InlinedAts shouldn't be empty!");
-+    DebugVariablesStack.pop_back();
-+    InlinedAts.pop_back();
-+  }
-+
-+  bool DroppedVariableStatsEnabled = false;
-+  struct DebugVariables {
-+    /// DenseSet of VarIDs before an optimization pass has run.
-+    DenseSet<VarID> DebugVariablesBefore;
-+    /// DenseSet of VarIDs after an optimization pass has run.
-+    DenseSet<VarID> DebugVariablesAfter;
-+  };
-+
-+protected:
-+  /// A stack of a DenseMap, that maps DebugVariables for every pass to an
-+  /// llvm::Function. A stack is used because an optimization pass can call
-+  /// other passes.
-+  SmallVector<DenseMap<const Function *, DebugVariables>> DebugVariablesStack;
-+
-+  /// A DenseSet tracking whether a scope was visited before.
-+  DenseSet<const DIScope *> VisitedScope;
-+  /// A stack of DenseMaps, which map the name of an llvm::Function to a
-+  /// DenseMap of VarIDs and their inlinedAt locations before an optimization
-+  /// pass has run.
-+  SmallVector<DenseMap<StringRef, DenseMap<VarID, DILocation *>>> InlinedAts;
-+  /// Calculate the number of dropped variables in an llvm::Function or
-+  /// llvm::MachineFunction and print the relevant information to stdout.
-+  void calculateDroppedStatsAndPrint(DebugVariables &DbgVariables,
-+                                     StringRef FuncName, StringRef PassID,
-+                                     StringRef FuncOrModName,
-+                                     StringRef PassLevel, const Function *Func);
-+
-+  /// Check if a \p Var has been dropped or is a false positive. Also update the
-+  /// \p DroppedCount if a debug variable is dropped.
-+  bool updateDroppedCount(DILocation *DbgLoc, const DIScope *Scope,
-+                          const DIScope *DbgValScope,
-+                          DenseMap<VarID, DILocation *> &InlinedAtsMap,
-+                          VarID Var, unsigned &DroppedCount);
-+  /// Run code to populate relevant data structures over an llvm::Function or
-+  /// llvm::MachineFunction.
-+  void run(DebugVariables &DbgVariables, StringRef FuncName, bool Before);
-+  /// Populate the VarIDSet and InlinedAtMap with the relevant information
-+  /// needed for before and after pass analysis to determine dropped variable
-+  /// status.
-+  void populateVarIDSetAndInlinedMap(
-+      const DILocalVariable *DbgVar, DebugLoc DbgLoc, DenseSet<VarID> &VarIDSet,
-+      DenseMap<StringRef, DenseMap<VarID, DILocation *>> &InlinedAtsMap,
-+      StringRef FuncName, bool Before);
-+  /// Visit every llvm::Instruction or llvm::MachineInstruction and check if the
-+  /// debug variable denoted by its ID \p Var may have been dropped by an
-+  /// optimization pass.
-+  virtual void
-+  visitEveryInstruction(unsigned &DroppedCount,
-+                        DenseMap<VarID, DILocation *> &InlinedAtsMap,
-+                        VarID Var) = 0;
-+  /// Visit every debug record in an llvm::Function or llvm::MachineFunction
-+  /// and call populateVarIDSetAndInlinedMap on it.
-+  virtual void visitEveryDebugRecord(
-+      DenseSet<VarID> &VarIDSet,
-+      DenseMap<StringRef, DenseMap<VarID, DILocation *>> &InlinedAtsMap,
-+      StringRef FuncName, bool Before) = 0;
-+
-+private:
-+  /// Remove a dropped debug variable's VarID from all Sets in the
-+  /// DroppedVariablesBefore stack.
-+  void removeVarFromAllSets(VarID Var, const Function *F) {
-+    // Do not remove Var from the last element, it will be popped from the
-+    // stack.
-+    for (auto &DebugVariablesMap : llvm::drop_end(DebugVariablesStack))
-+      DebugVariablesMap[F].DebugVariablesBefore.erase(Var);
-+  }
-+  /// Return true if \p Scope is the same as \p DbgValScope or a child scope of
-+  /// \p DbgValScope, return false otherwise.
-+  bool isScopeChildOfOrEqualTo(const DIScope *Scope,
-+                               const DIScope *DbgValScope);
-+  /// Return true if \p InlinedAt is the same as \p DbgValInlinedAt or part of
-+  /// the InlinedAt chain, return false otherwise.
-+  bool isInlinedAtChildOfOrEqualTo(const DILocation *InlinedAt,
-+                                   const DILocation *DbgValInlinedAt);
-+  bool PassDroppedVariables = false;
-+};
-+
-+/// A class to collect and print dropped debug information due to LLVM IR
-+/// optimization passes. After every LLVM IR pass is run, it will print how many
-+/// #dbg_values were dropped due to that pass.
-+class DroppedVariableStatsIR : public DroppedVariableStats {
-+public:
-+  DroppedVariableStatsIR(bool DroppedVarStatsEnabled)
-+      : llvm::DroppedVariableStats(DroppedVarStatsEnabled) {}
-+
-+  virtual ~DroppedVariableStatsIR() = default;
-+
-+  void runBeforePass(Any IR) {
-+    setup();
-+    if (const auto *M = unwrapIR<Module>(IR))
-+      return this->runOnModule(M, true);
-+    if (const auto *F = unwrapIR<Function>(IR))
-+      return this->runOnFunction(F, true);
-+  }
-+
-+  void runAfterPass(StringRef P, Any IR) {
-+    if (const auto *M = unwrapIR<Module>(IR))
-+      runAfterPassModule(P, M);
-+    else if (const auto *F = unwrapIR<Function>(IR))
-+      runAfterPassFunction(P, F);
-+    cleanup();
-+  }
-+
-+  void registerCallbacks(PassInstrumentationCallbacks &PIC);
-+
-+private:
-+  const Function *Func;
-+
-+  void runAfterPassFunction(StringRef PassID, const Function *F) {
-+    runOnFunction(F, false);
-+    calculateDroppedVarStatsOnFunction(F, PassID, F->getName().str(),
-+                                       "Function");
-+  }
-+
-+  void runAfterPassModule(StringRef PassID, const Module *M) {
-+    runOnModule(M, false);
-+    calculateDroppedVarStatsOnModule(M, PassID, M->getName().str(), "Module");
-+  }
-+  /// Populate DebugVariablesBefore, DebugVariablesAfter, InlinedAts before or
-+  /// after a pass has run to facilitate dropped variable calculation for an
-+  /// llvm::Function.
-+  void runOnFunction(const Function *F, bool Before);
-+  /// Iterate over all Instructions in a Function and report any dropped debug
-+  /// information.
-+  void calculateDroppedVarStatsOnFunction(const Function *F, StringRef PassID,
-+                                          StringRef FuncOrModName,
-+                                          StringRef PassLevel);
-+  /// Populate DebugVariablesBefore, DebugVariablesAfter, InlinedAts before or
-+  /// after a pass has run to facilitate dropped variable calculation for an
-+  /// llvm::Module. Calls runOnFunction on every Function in the Module.
-+  void runOnModule(const Module *M, bool Before);
-+  /// Iterate over all Functions in a Module and report any dropped debug
-+  /// information. Will call calculateDroppedVarStatsOnFunction on every
-+  /// Function.
-+  void calculateDroppedVarStatsOnModule(const Module *M, StringRef PassID,
-+                                        StringRef FuncOrModName,
-+                                        StringRef PassLevel);
-+  /// Override base class method to run on an llvm::Function specifically.
-+  virtual void
-+  visitEveryInstruction(unsigned &DroppedCount,
-+                        DenseMap<VarID, DILocation *> &InlinedAtsMap,
-+                        VarID Var) override;
-+  /// Override base class method to run on #dbg_values specifically.
-+  virtual void visitEveryDebugRecord(
-+      DenseSet<VarID> &VarIDSet,
-+      DenseMap<StringRef, DenseMap<VarID, DILocation *>> &InlinedAtsMap,
-+      StringRef FuncName, bool Before) override;
-+
-+  template <typename IRUnitT> static const IRUnitT *unwrapIR(Any IR) {
-+    const IRUnitT **IRPtr = llvm::any_cast<const IRUnitT *>(&IR);
-+    return IRPtr ? *IRPtr : nullptr;
-+  }
-+};
-+
-+} // namespace llvm
-+
-+#endif
-
diff  --git a/llvm/include/llvm/Passes/StandardInstrumentations.h b/llvm/include/llvm/Passes/StandardInstrumentations.h
-index 9301a12c740e..12a34c099eaf 100644
---- a/llvm/include/llvm/Passes/StandardInstrumentations.h
-+++ b/llvm/include/llvm/Passes/StandardInstrumentations.h
-@@ -19,6 +19,7 @@
- #include "llvm/ADT/SmallVector.h"
- #include "llvm/ADT/StringRef.h"
- #include "llvm/ADT/StringSet.h"
-+#include "llvm/CodeGen/DroppedVariableStats.h"
- #include "llvm/CodeGen/MachineBasicBlock.h"
- #include "llvm/IR/BasicBlock.h"
- #include "llvm/IR/DebugInfoMetadata.h"
-@@ -579,83 +580,6 @@ private:
-   static void SignalHandler(void *);
- };
- 
--/// A class to collect and print dropped debug information variable statistics.
--/// After every LLVM IR pass is run, it will print how many #dbg_values were
--/// dropped due to that pass.
--class DroppedVariableStats {
--public:
--  DroppedVariableStats(bool DroppedVarStatsEnabled) {
--    if (DroppedVarStatsEnabled)
--      llvm::outs()
--          << "Pass Level, Pass Name, Num of Dropped Variables, Func or "
--             "Module Name\n";
--  };
--  // We intend this to be unique per-compilation, thus no copies.
--  DroppedVariableStats(const DroppedVariableStats &) = delete;
--  void operator=(const DroppedVariableStats &) = delete;
--
--  void registerCallbacks(PassInstrumentationCallbacks &PIC);
--  void runBeforePass(StringRef PassID, Any IR);
--  void runAfterPass(StringRef PassID, Any IR, const PreservedAnalyses &PA);
--  void runAfterPassInvalidated(StringRef PassID, const PreservedAnalyses &PA);
--  bool getPassDroppedVariables() { return PassDroppedVariables; }
--
--private:
--  bool PassDroppedVariables = false;
--  /// A unique key that represents a #dbg_value.
--  using VarID =
--      std::tuple<const DIScope *, const DIScope *, const DILocalVariable *>;
--
--  struct DebugVariables {
--    /// DenseSet of VarIDs before an optimization pass has run.
--    DenseSet<VarID> DebugVariablesBefore;
--    /// DenseSet of VarIDs after an optimization pass has run.
--    DenseSet<VarID> DebugVariablesAfter;
--  };
--
--  /// A stack of a DenseMap, that maps DebugVariables for every pass to an
--  /// llvm::Function. A stack is used because an optimization pass can call
--  /// other passes.
--  SmallVector<DenseMap<const Function *, DebugVariables>> DebugVariablesStack;
--
--  /// A DenseSet tracking whether a scope was visited before.
--  DenseSet<const DIScope *> VisitedScope;
--  /// A stack of DenseMaps, which map the name of an llvm::Function to a
--  /// DenseMap of VarIDs and their inlinedAt locations before an optimization
--  /// pass has run.
--  SmallVector<DenseMap<StringRef, DenseMap<VarID, DILocation *>>> InlinedAts;
--
--  /// Iterate over all Functions in a Module and report any dropped debug
--  /// information. Will call calculateDroppedVarStatsOnFunction on every
--  /// Function.
--  void calculateDroppedVarStatsOnModule(const Module *M, StringRef PassID,
--                                        std::string FuncOrModName,
--                                        std::string PassLevel);
--  /// Iterate over all Instructions in a Function and report any dropped debug
--  /// information.
--  void calculateDroppedVarStatsOnFunction(const Function *F, StringRef PassID,
--                                          std::string FuncOrModName,
--                                          std::string PassLevel);
--  /// Populate DebugVariablesBefore, DebugVariablesAfter, InlinedAts before or
--  /// after a pass has run to facilitate dropped variable calculation for an
--  /// llvm::Function.
--  void runOnFunction(const Function *F, bool Before);
--  /// Populate DebugVariablesBefore, DebugVariablesAfter, InlinedAts before or
--  /// after a pass has run to facilitate dropped variable calculation for an
--  /// llvm::Module. Calls runOnFunction on every Function in the Module.
--  void runOnModule(const Module *M, bool Before);
--  /// Remove a dropped #dbg_value VarID from all Sets in the
--  /// DroppedVariablesBefore stack.
--  void removeVarFromAllSets(VarID Var, const Function *F);
--  /// Return true if \p Scope is the same as \p DbgValScope or a child scope of
--  /// \p DbgValScope, return false otherwise.
--  bool isScopeChildOfOrEqualTo(DIScope *Scope, const DIScope *DbgValScope);
--  /// Return true if \p InlinedAt is the same as \p DbgValInlinedAt or part of
--  /// the InlinedAt chain, return false otherwise.
--  bool isInlinedAtChildOfOrEqualTo(const DILocation *InlinedAt,
--                                   const DILocation *DbgValInlinedAt);
--};
--
- /// This class provides an interface to register all the standard pass
- /// instrumentations and manages their state (if any).
- class StandardInstrumentations {
-@@ -673,7 +597,7 @@ class StandardInstrumentations {
-   PrintCrashIRInstrumentation PrintCrashIR;
-   IRChangedTester ChangeTester;
-   VerifyInstrumentation Verify;
--  DroppedVariableStats DroppedStats;
-+  DroppedVariableStatsIR DroppedStatsIR;
- 
-   bool VerifyEach;
- 
-
diff  --git a/llvm/lib/CodeGen/CMakeLists.txt b/llvm/lib/CodeGen/CMakeLists.txt
-index 7b47c0e6f75d..263d4a9ee94d 100644
---- a/llvm/lib/CodeGen/CMakeLists.txt
-+++ b/llvm/lib/CodeGen/CMakeLists.txt
-@@ -50,6 +50,7 @@ add_llvm_component_library(LLVMCodeGen
-   DeadMachineInstructionElim.cpp
-   DetectDeadLanes.cpp
-   DFAPacketizer.cpp
-+  DroppedVariableStats.cpp
-   DwarfEHPrepare.cpp
-   EarlyIfConversion.cpp
-   EdgeBundles.cpp
-
diff  --git a/llvm/lib/CodeGen/DroppedVariableStats.cpp b/llvm/lib/CodeGen/DroppedVariableStats.cpp
-new file mode 100644
-index 000000000000..122fcad1293f
---- /dev/null
-+++ b/llvm/lib/CodeGen/DroppedVariableStats.cpp
-@@ -0,0 +1,194 @@
-+///===- DroppedVariableStats.cpp ------------------------------------------===//
-+///
-+/// Part of the LLVM Project, under the Apache License v2.0 with LLVM
-+/// Exceptions. See https://llvm.org/LICENSE.txt for license information.
-+/// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-+///
-+///===---------------------------------------------------------------------===//
-+/// \file
-+/// Dropped Variable Statistics for Debug Information. Reports any number
-+/// of #dbg_value that get dropped due to an optimization pass.
-+///
-+///===---------------------------------------------------------------------===//
-+
-+#include "llvm/CodeGen/DroppedVariableStats.h"
-+#include "llvm/IR/DebugInfoMetadata.h"
-+#include "llvm/IR/InstIterator.h"
-+#include "llvm/IR/Module.h"
-+
-+using namespace llvm;
-+
-+bool DroppedVariableStats::isScopeChildOfOrEqualTo(const DIScope *Scope,
-+                                                   const DIScope *DbgValScope) {
-+  while (Scope != nullptr) {
-+    if (VisitedScope.find(Scope) == VisitedScope.end()) {
-+      VisitedScope.insert(Scope);
-+      if (Scope == DbgValScope) {
-+        VisitedScope.clear();
-+        return true;
-+      }
-+      Scope = Scope->getScope();
-+    } else {
-+      VisitedScope.clear();
-+      return false;
-+    }
-+  }
-+  return false;
-+}
-+
-+bool DroppedVariableStats::isInlinedAtChildOfOrEqualTo(
-+    const DILocation *InlinedAt, const DILocation *DbgValInlinedAt) {
-+  if (DbgValInlinedAt == InlinedAt)
-+    return true;
-+  if (!DbgValInlinedAt)
-+    return false;
-+  auto *IA = InlinedAt;
-+  while (IA) {
-+    if (IA == DbgValInlinedAt)
-+      return true;
-+    IA = IA->getInlinedAt();
-+  }
-+  return false;
-+}
-+
-+void DroppedVariableStats::calculateDroppedStatsAndPrint(
-+    DebugVariables &DbgVariables, StringRef FuncName, StringRef PassID,
-+    StringRef FuncOrModName, StringRef PassLevel, const Function *Func) {
-+  unsigned DroppedCount = 0;
-+  DenseSet<VarID> &DebugVariablesBeforeSet = DbgVariables.DebugVariablesBefore;
-+  DenseSet<VarID> &DebugVariablesAfterSet = DbgVariables.DebugVariablesAfter;
-+  DenseMap<VarID, DILocation *> &InlinedAtsMap = InlinedAts.back()[FuncName];
-+  // Find an Instruction that shares the same scope as the dropped #dbg_value or
-+  // has a scope that is the child of the scope of the #dbg_value, and has an
-+  // inlinedAt equal to the inlinedAt of the #dbg_value or it's inlinedAt chain
-+  // contains the inlinedAt of the #dbg_value, if such an Instruction is found,
-+  // debug information is dropped.
-+  for (VarID Var : DebugVariablesBeforeSet) {
-+    if (DebugVariablesAfterSet.contains(Var))
-+      continue;
-+    visitEveryInstruction(DroppedCount, InlinedAtsMap, Var);
-+    removeVarFromAllSets(Var, Func);
-+  }
-+  if (DroppedCount > 0) {
-+    llvm::outs() << PassLevel << ", " << PassID << ", " << DroppedCount << ", "
-+                 << FuncOrModName << "\n";
-+    PassDroppedVariables = true;
-+  } else
-+    PassDroppedVariables = false;
-+}
-+
-+bool DroppedVariableStats::updateDroppedCount(
-+    DILocation *DbgLoc, const DIScope *Scope, const DIScope *DbgValScope,
-+    DenseMap<VarID, DILocation *> &InlinedAtsMap, VarID Var,
-+    unsigned &DroppedCount) {
-+
-+  // If the Scope is a child of, or equal to the DbgValScope and is inlined at
-+  // the Var's InlinedAt location, return true to signify that the Var has been
-+  // dropped.
-+  if (isScopeChildOfOrEqualTo(Scope, DbgValScope))
-+    if (isInlinedAtChildOfOrEqualTo(DbgLoc->getInlinedAt(),
-+                                    InlinedAtsMap[Var])) {
-+      // Found another instruction in the variable's scope, so there exists a
-+      // break point at which the variable could be observed. Count it as
-+      // dropped.
-+      DroppedCount++;
-+      return true;
-+    }
-+  return false;
-+}
-+
-+void DroppedVariableStats::run(DebugVariables &DbgVariables, StringRef FuncName,
-+                               bool Before) {
-+  auto &VarIDSet = (Before ? DbgVariables.DebugVariablesBefore
-+                           : DbgVariables.DebugVariablesAfter);
-+  auto &InlinedAtsMap = InlinedAts.back();
-+  if (Before)
-+    InlinedAtsMap.try_emplace(FuncName, DenseMap<VarID, DILocation *>());
-+  VarIDSet = DenseSet<VarID>();
-+  visitEveryDebugRecord(VarIDSet, InlinedAtsMap, FuncName, Before);
-+}
-+
-+void DroppedVariableStats::populateVarIDSetAndInlinedMap(
-+    const DILocalVariable *DbgVar, DebugLoc DbgLoc, DenseSet<VarID> &VarIDSet,
-+    DenseMap<StringRef, DenseMap<VarID, DILocation *>> &InlinedAtsMap,
-+    StringRef FuncName, bool Before) {
-+  VarID Key{DbgVar->getScope(), DbgLoc->getInlinedAtScope(), DbgVar};
-+  VarIDSet.insert(Key);
-+  if (Before)
-+    InlinedAtsMap[FuncName].try_emplace(Key, DbgLoc.getInlinedAt());
-+}
-+
-+void DroppedVariableStatsIR::runOnFunction(const Function *F, bool Before) {
-+  auto &DebugVariables = DebugVariablesStack.back()[F];
-+  auto FuncName = F->getName();
-+  Func = F;
-+  run(DebugVariables, FuncName, Before);
-+}
-+
-+void DroppedVariableStatsIR::calculateDroppedVarStatsOnFunction(
-+    const Function *F, StringRef PassID, StringRef FuncOrModName,
-+    StringRef PassLevel) {
-+  Func = F;
-+  StringRef FuncName = F->getName();
-+  DebugVariables &DbgVariables = DebugVariablesStack.back()[F];
-+  calculateDroppedStatsAndPrint(DbgVariables, FuncName, PassID, FuncOrModName,
-+                                PassLevel, Func);
-+}
-+
-+void DroppedVariableStatsIR::runOnModule(const Module *M, bool Before) {
-+  for (auto &F : *M)
-+    runOnFunction(&F, Before);
-+}
-+
-+void DroppedVariableStatsIR::calculateDroppedVarStatsOnModule(
-+    const Module *M, StringRef PassID, StringRef FuncOrModName,
-+    StringRef PassLevel) {
-+  for (auto &F : *M) {
-+    calculateDroppedVarStatsOnFunction(&F, PassID, FuncOrModName, PassLevel);
-+  }
-+}
-+
-+void DroppedVariableStatsIR::registerCallbacks(
-+    PassInstrumentationCallbacks &PIC) {
-+  if (!DroppedVariableStatsEnabled)
-+    return;
-+
-+  PIC.registerBeforeNonSkippedPassCallback(
-+      [this](StringRef P, Any IR) { return runBeforePass(IR); });
-+  PIC.registerAfterPassCallback(
-+      [this](StringRef P, Any IR, const PreservedAnalyses &PA) {
-+        return runAfterPass(P, IR);
-+      });
-+  PIC.registerAfterPassInvalidatedCallback(
-+      [this](StringRef P, const PreservedAnalyses &PA) { return cleanup(); });
-+}
-+
-+void DroppedVariableStatsIR::visitEveryInstruction(
-+    unsigned &DroppedCount, DenseMap<VarID, DILocation *> &InlinedAtsMap,
-+    VarID Var) {
-+  const DIScope *DbgValScope = std::get<0>(Var);
-+  for (const auto &I : instructions(Func)) {
-+    auto *DbgLoc = I.getDebugLoc().get();
-+    if (!DbgLoc)
-+      continue;
-+    if (updateDroppedCount(DbgLoc, DbgLoc->getScope(), DbgValScope,
-+                           InlinedAtsMap, Var, DroppedCount))
-+      break;
-+  }
-+}
-+
-+void DroppedVariableStatsIR::visitEveryDebugRecord(
-+    DenseSet<VarID> &VarIDSet,
-+    DenseMap<StringRef, DenseMap<VarID, DILocation *>> &InlinedAtsMap,
-+    StringRef FuncName, bool Before) {
-+  for (const auto &I : instructions(Func)) {
-+    for (DbgRecord &DR : I.getDbgRecordRange()) {
-+      if (auto *Dbg = dyn_cast<DbgVariableRecord>(&DR)) {
-+        auto *DbgVar = Dbg->getVariable();
-+        auto DbgLoc = DR.getDebugLoc();
-+        populateVarIDSetAndInlinedMap(DbgVar, DbgLoc, VarIDSet, InlinedAtsMap,
-+                                      FuncName, Before);
-+      }
-+    }
-+  }
-+}
-
diff  --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp
-index 6259f8f736c8..b766517e68eb 100644
---- a/llvm/lib/Passes/StandardInstrumentations.cpp
-+++ b/llvm/lib/Passes/StandardInstrumentations.cpp
-@@ -2462,7 +2462,7 @@ StandardInstrumentations::StandardInstrumentations(
-                        PrintChanged == ChangePrinter::ColourDiffVerbose ||
-                            PrintChanged == ChangePrinter::ColourDiffQuiet),
-       WebsiteChangeReporter(PrintChanged == ChangePrinter::DotCfgVerbose),
--      Verify(DebugLogging), DroppedStats(DroppedVarStats),
-+      Verify(DebugLogging), DroppedStatsIR(DroppedVarStats),
-       VerifyEach(VerifyEach) {}
- 
- PrintCrashIRInstrumentation *PrintCrashIRInstrumentation::CrashReporter =
-@@ -2523,180 +2523,6 @@ void PrintCrashIRInstrumentation::registerCallbacks(
-       });
- }
- 
--void DroppedVariableStats::registerCallbacks(
--    PassInstrumentationCallbacks &PIC) {
--  if (!DroppedVarStats)
--    return;
--
--  PIC.registerBeforeNonSkippedPassCallback(
--      [this](StringRef P, Any IR) { return this->runBeforePass(P, IR); });
--  PIC.registerAfterPassCallback(
--      [this](StringRef P, Any IR, const PreservedAnalyses &PA) {
--        return this->runAfterPass(P, IR, PA);
--      });
--  PIC.registerAfterPassInvalidatedCallback(
--      [this](StringRef P, const PreservedAnalyses &PA) {
--        return this->runAfterPassInvalidated(P, PA);
--      });
--}
--
--void DroppedVariableStats::runBeforePass(StringRef PassID, Any IR) {
--  DebugVariablesStack.push_back({DenseMap<const Function *, DebugVariables>()});
--  InlinedAts.push_back({DenseMap<StringRef, DenseMap<VarID, DILocation *>>()});
--  if (auto *M = unwrapIR<Module>(IR))
--    return this->runOnModule(M, true);
--  if (auto *F = unwrapIR<Function>(IR))
--    return this->runOnFunction(F, true);
--}
--
--void DroppedVariableStats::runOnFunction(const Function *F, bool Before) {
--  auto &DebugVariables = DebugVariablesStack.back()[F];
--  auto &VarIDSet = (Before ? DebugVariables.DebugVariablesBefore
--                           : DebugVariables.DebugVariablesAfter);
--  auto &InlinedAtsMap = InlinedAts.back();
--  auto FuncName = F->getName();
--  if (Before)
--    InlinedAtsMap.try_emplace(FuncName, DenseMap<VarID, DILocation *>());
--  VarIDSet = DenseSet<VarID>();
--  for (const auto &I : instructions(F)) {
--    for (DbgRecord &DR : I.getDbgRecordRange()) {
--      if (auto *Dbg = dyn_cast<DbgVariableRecord>(&DR)) {
--        auto *DbgVar = Dbg->getVariable();
--        auto DbgLoc = DR.getDebugLoc();
--        VarID Key{DbgVar->getScope(), DbgLoc->getInlinedAtScope(), DbgVar};
--        VarIDSet.insert(Key);
--        if (Before)
--          InlinedAtsMap[FuncName].try_emplace(Key, DbgLoc.getInlinedAt());
--      }
--    }
--  }
--}
--
--void DroppedVariableStats::runOnModule(const Module *M, bool Before) {
--  for (auto &F : *M)
--    runOnFunction(&F, Before);
--}
--
--void DroppedVariableStats::removeVarFromAllSets(VarID Var, const Function *F) {
--  // Do not remove Var from the last element, it will be popped from the stack.
--  for (auto &DebugVariablesMap : llvm::drop_end(DebugVariablesStack))
--    DebugVariablesMap[F].DebugVariablesBefore.erase(Var);
--}
--
--void DroppedVariableStats::calculateDroppedVarStatsOnModule(
--    const Module *M, StringRef PassID, std::string FuncOrModName,
--    std::string PassLevel) {
--  for (auto &F : *M) {
--    calculateDroppedVarStatsOnFunction(&F, PassID, FuncOrModName, PassLevel);
--  }
--}
--
--void DroppedVariableStats::calculateDroppedVarStatsOnFunction(
--    const Function *F, StringRef PassID, std::string FuncOrModName,
--    std::string PassLevel) {
--  unsigned DroppedCount = 0;
--  StringRef FuncName = F->getName();
--  DebugVariables &DbgVariables = DebugVariablesStack.back()[F];
--  DenseSet<VarID> &DebugVariablesBeforeSet = DbgVariables.DebugVariablesBefore;
--  DenseSet<VarID> &DebugVariablesAfterSet = DbgVariables.DebugVariablesAfter;
--  DenseMap<VarID, DILocation *> &InlinedAtsMap = InlinedAts.back()[FuncName];
--  // Find an Instruction that shares the same scope as the dropped #dbg_value or
--  // has a scope that is the child of the scope of the #dbg_value, and has an
--  // inlinedAt equal to the inlinedAt of the #dbg_value or it's inlinedAt chain
--  // contains the inlinedAt of the #dbg_value, if such an Instruction is found,
--  // debug information is dropped.
--  for (VarID Var : DebugVariablesBeforeSet) {
--    if (DebugVariablesAfterSet.contains(Var))
--      continue;
--    const DIScope *DbgValScope = std::get<0>(Var);
--    for (const auto &I : instructions(F)) {
--      auto *DbgLoc = I.getDebugLoc().get();
--      if (!DbgLoc)
--        continue;
--
--      auto *Scope = DbgLoc->getScope();
--      if (isScopeChildOfOrEqualTo(Scope, DbgValScope)) {
--        if (isInlinedAtChildOfOrEqualTo(DbgLoc->getInlinedAt(),
--                                        InlinedAtsMap[Var])) {
--          // Found another instruction in the variable's scope, so there exists
--          // a break point at which the variable could be observed. Count it as
--          // dropped.
--          DroppedCount++;
--          break;
--        }
--      }
--    }
--    removeVarFromAllSets(Var, F);
--  }
--  if (DroppedCount > 0) {
--    llvm::outs() << PassLevel << ", " << PassID << ", " << DroppedCount << ", "
--                 << FuncOrModName << "\n";
--    PassDroppedVariables = true;
--  } else
--    PassDroppedVariables = false;
--}
--
--void DroppedVariableStats::runAfterPassInvalidated(
--    StringRef PassID, const PreservedAnalyses &PA) {
--  DebugVariablesStack.pop_back();
--  InlinedAts.pop_back();
--}
--
--void DroppedVariableStats::runAfterPass(StringRef PassID, Any IR,
--                                        const PreservedAnalyses &PA) {
--  std::string PassLevel;
--  std::string FuncOrModName;
--  if (auto *M = unwrapIR<Module>(IR)) {
--    this->runOnModule(M, false);
--    PassLevel = "Module";
--    FuncOrModName = M->getName();
--    calculateDroppedVarStatsOnModule(M, PassID, FuncOrModName, PassLevel);
--  } else if (auto *F = unwrapIR<Function>(IR)) {
--    this->runOnFunction(F, false);
--    PassLevel = "Function";
--    FuncOrModName = F->getName();
--    calculateDroppedVarStatsOnFunction(F, PassID, FuncOrModName, PassLevel);
--  }
--
--  DebugVariablesStack.pop_back();
--  InlinedAts.pop_back();
--}
--
--bool DroppedVariableStats::isScopeChildOfOrEqualTo(DIScope *Scope,
--                                                   const DIScope *DbgValScope) {
--  while (Scope != nullptr) {
--    if (VisitedScope.find(Scope) == VisitedScope.end()) {
--      VisitedScope.insert(Scope);
--      if (Scope == DbgValScope) {
--        VisitedScope.clear();
--        return true;
--      }
--      Scope = Scope->getScope();
--    } else {
--      VisitedScope.clear();
--      return false;
--    }
--  }
--  return false;
--}
--
--bool DroppedVariableStats::isInlinedAtChildOfOrEqualTo(
--    const DILocation *InlinedAt, const DILocation *DbgValInlinedAt) {
--  if (DbgValInlinedAt == InlinedAt)
--    return true;
--  if (!DbgValInlinedAt)
--    return false;
--  if (!InlinedAt)
--    return false;
--  auto *IA = InlinedAt;
--  while (IA) {
--    if (IA == DbgValInlinedAt)
--      return true;
--    IA = IA->getInlinedAt();
--  }
--  return false;
--}
--
- void StandardInstrumentations::registerCallbacks(
-     PassInstrumentationCallbacks &PIC, ModuleAnalysisManager *MAM) {
-   PrintIR.registerCallbacks(PIC);
-@@ -2712,7 +2538,7 @@ void StandardInstrumentations::registerCallbacks(
-   WebsiteChangeReporter.registerCallbacks(PIC);
-   ChangeTester.registerCallbacks(PIC);
-   PrintCrashIR.registerCallbacks(PIC);
--  DroppedStats.registerCallbacks(PIC);
-+  DroppedStatsIR.registerCallbacks(PIC);
-   if (MAM)
-     PreservedCFGChecker.registerCallbacks(PIC, *MAM);
- 
-
diff  --git a/llvm/unittests/CodeGen/CMakeLists.txt b/llvm/unittests/CodeGen/CMakeLists.txt
-index 963cdcc0275e..807fd1a9b7b5 100644
---- a/llvm/unittests/CodeGen/CMakeLists.txt
-+++ b/llvm/unittests/CodeGen/CMakeLists.txt
-@@ -27,6 +27,7 @@ add_llvm_unittest(CodeGenTests
-   CCStateTest.cpp
-   DIEHashTest.cpp
-   DIETest.cpp
-+  DroppedVariableStatsIRTest.cpp
-   DwarfStringPoolEntryRefTest.cpp
-   InstrRefLDVTest.cpp
-   LowLevelTypeTest.cpp
-
diff  --git a/llvm/unittests/IR/DroppedVariableStatsTest.cpp b/llvm/unittests/CodeGen/DroppedVariableStatsIRTest.cpp
-similarity index 91%
-rename from llvm/unittests/IR/DroppedVariableStatsTest.cpp
-rename to llvm/unittests/CodeGen/DroppedVariableStatsIRTest.cpp
-index 61f3a87bb355..094ec7b65763 100644
---- a/llvm/unittests/IR/DroppedVariableStatsTest.cpp
-+++ b/llvm/unittests/CodeGen/DroppedVariableStatsIRTest.cpp
-@@ -1,5 +1,4 @@
--//===- unittests/IR/DroppedVariableStatsTest.cpp - TimePassesHandler tests
--//----------===//
-+//===- unittests/IR/DroppedVariableStatsIRTest.cpp ------------------------===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
-@@ -8,6 +7,7 @@
- //===----------------------------------------------------------------------===//
- 
- #include "llvm/AsmParser/Parser.h"
-+#include "llvm/CodeGen/DroppedVariableStats.h"
- #include "llvm/IR/Function.h"
- #include "llvm/IR/InstIterator.h"
- #include "llvm/IR/LegacyPassManager.h"
-@@ -44,7 +44,7 @@ namespace {
- // This test ensures that if a #dbg_value and an instruction that exists in the
- // same scope as that #dbg_value are both deleted as a result of an optimization
- // pass, debug information is considered not dropped.
--TEST(DroppedVariableStats, BothDeleted) {
-+TEST(DroppedVariableStatsIR, BothDeleted) {
-   PassInstrumentationCallbacks PIC;
-   PassInstrumentation PI(&PIC);
- 
-@@ -79,9 +79,8 @@ TEST(DroppedVariableStats, BothDeleted) {
-   std::unique_ptr<llvm::Module> M = parseIR(C, IR);
-   ASSERT_TRUE(M);
- 
--  DroppedVariableStats Stats(true);
--  Stats.runBeforePass("Test",
--                      llvm::Any(const_cast<const llvm::Module *>(M.get())));
-+  DroppedVariableStatsIR Stats(true);
-+  Stats.runBeforePass(llvm::Any(const_cast<const llvm::Module *>(M.get())));
- 
-   // This loop simulates an IR pass that drops debug information.
-   for (auto &F : *M) {
-@@ -92,16 +91,15 @@ TEST(DroppedVariableStats, BothDeleted) {
-     }
-     break;
-   }
--  PreservedAnalyses PA;
-   Stats.runAfterPass("Test",
--                     llvm::Any(const_cast<const llvm::Module *>(M.get())), PA);
-+                     llvm::Any(const_cast<const llvm::Module *>(M.get())));
-   ASSERT_EQ(Stats.getPassDroppedVariables(), false);
- }
- 
- // This test ensures that if a #dbg_value is dropped after an optimization pass,
- // but an instruction that shares the same scope as the #dbg_value still exists,
- // debug information is conisdered dropped.
--TEST(DroppedVariableStats, DbgValLost) {
-+TEST(DroppedVariableStatsIR, DbgValLost) {
-   PassInstrumentationCallbacks PIC;
-   PassInstrumentation PI(&PIC);
- 
-@@ -136,9 +134,8 @@ TEST(DroppedVariableStats, DbgValLost) {
-   std::unique_ptr<llvm::Module> M = parseIR(C, IR);
-   ASSERT_TRUE(M);
- 
--  DroppedVariableStats Stats(true);
--  Stats.runBeforePass("Test",
--                      llvm::Any(const_cast<const llvm::Module *>(M.get())));
-+  DroppedVariableStatsIR Stats(true);
-+  Stats.runBeforePass(llvm::Any(const_cast<const llvm::Module *>(M.get())));
- 
-   // This loop simulates an IR pass that drops debug information.
-   for (auto &F : *M) {
-@@ -148,16 +145,15 @@ TEST(DroppedVariableStats, DbgValLost) {
-     }
-     break;
-   }
--  PreservedAnalyses PA;
-   Stats.runAfterPass("Test",
--                     llvm::Any(const_cast<const llvm::Module *>(M.get())), PA);
-+                     llvm::Any(const_cast<const llvm::Module *>(M.get())));
-   ASSERT_EQ(Stats.getPassDroppedVariables(), true);
- }
- 
- // This test ensures that if a #dbg_value is dropped after an optimization pass,
- // but an instruction that has an unrelated scope as the #dbg_value still
- // exists, debug information is conisdered not dropped.
--TEST(DroppedVariableStats, UnrelatedScopes) {
-+TEST(DroppedVariableStatsIR, UnrelatedScopes) {
-   PassInstrumentationCallbacks PIC;
-   PassInstrumentation PI(&PIC);
- 
-@@ -193,9 +189,8 @@ TEST(DroppedVariableStats, UnrelatedScopes) {
-   std::unique_ptr<llvm::Module> M = parseIR(C, IR);
-   ASSERT_TRUE(M);
- 
--  DroppedVariableStats Stats(true);
--  Stats.runBeforePass("Test",
--                      llvm::Any(const_cast<const llvm::Module *>(M.get())));
-+  DroppedVariableStatsIR Stats(true);
-+  Stats.runBeforePass(llvm::Any(const_cast<const llvm::Module *>(M.get())));
- 
-   // This loop simulates an IR pass that drops debug information.
-   for (auto &F : *M) {
-@@ -205,16 +200,15 @@ TEST(DroppedVariableStats, UnrelatedScopes) {
-     }
-     break;
-   }
--  PreservedAnalyses PA;
-   Stats.runAfterPass("Test",
--                     llvm::Any(const_cast<const llvm::Module *>(M.get())), PA);
-+                     llvm::Any(const_cast<const llvm::Module *>(M.get())));
-   ASSERT_EQ(Stats.getPassDroppedVariables(), false);
- }
- 
- // This test ensures that if a #dbg_value is dropped after an optimization pass,
- // but an instruction that has a scope which is a child of the #dbg_value scope
- // still exists, debug information is conisdered dropped.
--TEST(DroppedVariableStats, ChildScopes) {
-+TEST(DroppedVariableStatsIR, ChildScopes) {
-   PassInstrumentationCallbacks PIC;
-   PassInstrumentation PI(&PIC);
- 
-@@ -250,9 +244,8 @@ TEST(DroppedVariableStats, ChildScopes) {
-   std::unique_ptr<llvm::Module> M = parseIR(C, IR);
-   ASSERT_TRUE(M);
- 
--  DroppedVariableStats Stats(true);
--  Stats.runBeforePass("Test",
--                      llvm::Any(const_cast<const llvm::Module *>(M.get())));
-+  DroppedVariableStatsIR Stats(true);
-+  Stats.runBeforePass(llvm::Any(const_cast<const llvm::Module *>(M.get())));
- 
-   // This loop simulates an IR pass that drops debug information.
-   for (auto &F : *M) {
-@@ -262,9 +255,8 @@ TEST(DroppedVariableStats, ChildScopes) {
-     }
-     break;
-   }
--  PreservedAnalyses PA;
-   Stats.runAfterPass("Test",
--                     llvm::Any(const_cast<const llvm::Module *>(M.get())), PA);
-+                     llvm::Any(const_cast<const llvm::Module *>(M.get())));
-   ASSERT_EQ(Stats.getPassDroppedVariables(), true);
- }
- 
-@@ -272,7 +264,7 @@ TEST(DroppedVariableStats, ChildScopes) {
- // but an instruction that has a scope which is a child of the #dbg_value scope
- // still exists, and the #dbg_value is inlined at another location, debug
- // information is conisdered not dropped.
--TEST(DroppedVariableStats, InlinedAt) {
-+TEST(DroppedVariableStatsIR, InlinedAt) {
-   PassInstrumentationCallbacks PIC;
-   PassInstrumentation PI(&PIC);
- 
-@@ -308,9 +300,8 @@ TEST(DroppedVariableStats, InlinedAt) {
-   std::unique_ptr<llvm::Module> M = parseIR(C, IR);
-   ASSERT_TRUE(M);
- 
--  DroppedVariableStats Stats(true);
--  Stats.runBeforePass("Test",
--                      llvm::Any(const_cast<const llvm::Module *>(M.get())));
-+  DroppedVariableStatsIR Stats(true);
-+  Stats.runBeforePass(llvm::Any(const_cast<const llvm::Module *>(M.get())));
- 
-   // This loop simulates an IR pass that drops debug information.
-   for (auto &F : *M) {
-@@ -320,9 +311,8 @@ TEST(DroppedVariableStats, InlinedAt) {
-     }
-     break;
-   }
--  PreservedAnalyses PA;
-   Stats.runAfterPass("Test",
--                     llvm::Any(const_cast<const llvm::Module *>(M.get())), PA);
-+                     llvm::Any(const_cast<const llvm::Module *>(M.get())));
-   ASSERT_EQ(Stats.getPassDroppedVariables(), false);
- }
- 
-@@ -330,7 +320,7 @@ TEST(DroppedVariableStats, InlinedAt) {
- // but an instruction that has a scope which is a child of the #dbg_value scope
- // still exists, and the #dbg_value and the instruction are inlined at another
- // location, debug information is conisdered dropped.
--TEST(DroppedVariableStats, InlinedAtShared) {
-+TEST(DroppedVariableStatsIR, InlinedAtShared) {
-   PassInstrumentationCallbacks PIC;
-   PassInstrumentation PI(&PIC);
- 
-@@ -366,9 +356,8 @@ TEST(DroppedVariableStats, InlinedAtShared) {
-   std::unique_ptr<llvm::Module> M = parseIR(C, IR);
-   ASSERT_TRUE(M);
- 
--  DroppedVariableStats Stats(true);
--  Stats.runBeforePass("Test",
--                      llvm::Any(const_cast<const llvm::Module *>(M.get())));
-+  DroppedVariableStatsIR Stats(true);
-+  Stats.runBeforePass(llvm::Any(const_cast<const llvm::Module *>(M.get())));
- 
-   // This loop simulates an IR pass that drops debug information.
-   for (auto &F : *M) {
-@@ -378,9 +367,8 @@ TEST(DroppedVariableStats, InlinedAtShared) {
-     }
-     break;
-   }
--  PreservedAnalyses PA;
-   Stats.runAfterPass("Test",
--                     llvm::Any(const_cast<const llvm::Module *>(M.get())), PA);
-+                     llvm::Any(const_cast<const llvm::Module *>(M.get())));
-   ASSERT_EQ(Stats.getPassDroppedVariables(), true);
- }
- 
-@@ -388,7 +376,7 @@ TEST(DroppedVariableStats, InlinedAtShared) {
- // but an instruction that has a scope which is a child of the #dbg_value scope
- // still exists, and the instruction is inlined at a location that is the
- // #dbg_value's inlined at location, debug information is conisdered dropped.
--TEST(DroppedVariableStats, InlinedAtChild) {
-+TEST(DroppedVariableStatsIR, InlinedAtChild) {
-   PassInstrumentationCallbacks PIC;
-   PassInstrumentation PI(&PIC);
- 
-@@ -425,9 +413,8 @@ TEST(DroppedVariableStats, InlinedAtChild) {
-   std::unique_ptr<llvm::Module> M = parseIR(C, IR);
-   ASSERT_TRUE(M);
- 
--  DroppedVariableStats Stats(true);
--  Stats.runBeforePass("Test",
--                      llvm::Any(const_cast<const llvm::Module *>(M.get())));
-+  DroppedVariableStatsIR Stats(true);
-+  Stats.runBeforePass(llvm::Any(const_cast<const llvm::Module *>(M.get())));
- 
-   // This loop simulates an IR pass that drops debug information.
-   for (auto &F : *M) {
-@@ -437,9 +424,8 @@ TEST(DroppedVariableStats, InlinedAtChild) {
-     }
-     break;
-   }
--  PreservedAnalyses PA;
-   Stats.runAfterPass("Test",
--                     llvm::Any(const_cast<const llvm::Module *>(M.get())), PA);
-+                     llvm::Any(const_cast<const llvm::Module *>(M.get())));
-   ASSERT_EQ(Stats.getPassDroppedVariables(), true);
- }
- 
-
diff  --git a/llvm/unittests/IR/CMakeLists.txt b/llvm/unittests/IR/CMakeLists.txt
-index ed93ee547d22..e5c8630f3eed 100644
---- a/llvm/unittests/IR/CMakeLists.txt
-+++ b/llvm/unittests/IR/CMakeLists.txt
-@@ -43,7 +43,6 @@ add_llvm_unittest(IRTests
-   ShuffleVectorInstTest.cpp
-   StructuralHashTest.cpp
-   TimePassesTest.cpp
--  DroppedVariableStatsTest.cpp
-   TypesTest.cpp
-   UseTest.cpp
-   UserTest.cpp
--- 
-2.46.2
-

diff  --git a/llvm/include/llvm/CodeGen/DroppedVariableStats.h b/llvm/include/llvm/CodeGen/DroppedVariableStats.h
deleted file mode 100644
index c7b654ea585577..00000000000000
--- a/llvm/include/llvm/CodeGen/DroppedVariableStats.h
+++ /dev/null
@@ -1,224 +0,0 @@
-///===- DroppedVariableStats.h - Opt Diagnostics -*- C++ -*----------------===//
-///
-/// Part of the LLVM Project, under the Apache License v2.0 with LLVM
-/// Exceptions. See https://llvm.org/LICENSE.txt for license information.
-/// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-///
-///===---------------------------------------------------------------------===//
-/// \file
-/// Dropped Variable Statistics for Debug Information. Reports any number
-/// of #dbg_value that get dropped due to an optimization pass.
-///
-///===---------------------------------------------------------------------===//
-
-#ifndef LLVM_CODEGEN_DROPPEDVARIABLESTATS_H
-#define LLVM_CODEGEN_DROPPEDVARIABLESTATS_H
-
-#include "llvm/CodeGen/MachinePassManager.h"
-#include "llvm/IR/DebugInfoMetadata.h"
-#include "llvm/IR/DiagnosticInfo.h"
-#include "llvm/IR/Function.h"
-#include "llvm/IR/Module.h"
-#include "llvm/IR/PassInstrumentation.h"
-
-namespace llvm {
-
-/// A unique key that represents a debug variable.
-/// First const DIScope *: Represents the scope of the debug variable.
-/// Second const DIScope *: Represents the InlinedAt scope of the debug
-/// variable. const DILocalVariable *: It is a pointer to the debug variable
-/// itself.
-using VarID =
-    std::tuple<const DIScope *, const DIScope *, const DILocalVariable *>;
-
-/// A base class to collect and print dropped debug information variable
-/// statistics.
-class DroppedVariableStats {
-public:
-  DroppedVariableStats(bool DroppedVarStatsEnabled)
-      : DroppedVariableStatsEnabled(DroppedVarStatsEnabled) {
-    if (DroppedVarStatsEnabled)
-      llvm::outs()
-          << "Pass Level, Pass Name, Num of Dropped Variables, Func or "
-             "Module Name\n";
-  };
-
-  virtual ~DroppedVariableStats() = default;
-
-  // We intend this to be unique per-compilation, thus no copies.
-  DroppedVariableStats(const DroppedVariableStats &) = delete;
-  void operator=(const DroppedVariableStats &) = delete;
-
-  bool getPassDroppedVariables() { return PassDroppedVariables; }
-
-protected:
-  void setup() {
-    DebugVariablesStack.push_back(
-        {DenseMap<const Function *, DebugVariables>()});
-    InlinedAts.push_back(
-        {DenseMap<StringRef, DenseMap<VarID, DILocation *>>()});
-  }
-
-  void cleanup() {
-    assert(!DebugVariablesStack.empty() &&
-           "DebugVariablesStack shouldn't be empty!");
-    assert(!InlinedAts.empty() && "InlinedAts shouldn't be empty!");
-    DebugVariablesStack.pop_back();
-    InlinedAts.pop_back();
-  }
-
-  bool DroppedVariableStatsEnabled = false;
-  struct DebugVariables {
-    /// DenseSet of VarIDs before an optimization pass has run.
-    DenseSet<VarID> DebugVariablesBefore;
-    /// DenseSet of VarIDs after an optimization pass has run.
-    DenseSet<VarID> DebugVariablesAfter;
-  };
-
-protected:
-  /// A stack of a DenseMap, that maps DebugVariables for every pass to an
-  /// llvm::Function. A stack is used because an optimization pass can call
-  /// other passes.
-  SmallVector<DenseMap<const Function *, DebugVariables>> DebugVariablesStack;
-
-  /// A DenseSet tracking whether a scope was visited before.
-  DenseSet<const DIScope *> VisitedScope;
-  /// A stack of DenseMaps, which map the name of an llvm::Function to a
-  /// DenseMap of VarIDs and their inlinedAt locations before an optimization
-  /// pass has run.
-  SmallVector<DenseMap<StringRef, DenseMap<VarID, DILocation *>>> InlinedAts;
-  /// Calculate the number of dropped variables in an llvm::Function or
-  /// llvm::MachineFunction and print the relevant information to stdout.
-  void calculateDroppedStatsAndPrint(DebugVariables &DbgVariables,
-                                     StringRef FuncName, StringRef PassID,
-                                     StringRef FuncOrModName,
-                                     StringRef PassLevel, const Function *Func);
-
-  /// Check if a \p Var has been dropped or is a false positive. Also update the
-  /// \p DroppedCount if a debug variable is dropped.
-  bool updateDroppedCount(DILocation *DbgLoc, const DIScope *Scope,
-                          const DIScope *DbgValScope,
-                          DenseMap<VarID, DILocation *> &InlinedAtsMap,
-                          VarID Var, unsigned &DroppedCount);
-  /// Run code to populate relevant data structures over an llvm::Function or
-  /// llvm::MachineFunction.
-  void run(DebugVariables &DbgVariables, StringRef FuncName, bool Before);
-  /// Populate the VarIDSet and InlinedAtMap with the relevant information
-  /// needed for before and after pass analysis to determine dropped variable
-  /// status.
-  void populateVarIDSetAndInlinedMap(
-      const DILocalVariable *DbgVar, DebugLoc DbgLoc, DenseSet<VarID> &VarIDSet,
-      DenseMap<StringRef, DenseMap<VarID, DILocation *>> &InlinedAtsMap,
-      StringRef FuncName, bool Before);
-  /// Visit every llvm::Instruction or llvm::MachineInstruction and check if the
-  /// debug variable denoted by its ID \p Var may have been dropped by an
-  /// optimization pass.
-  virtual void
-  visitEveryInstruction(unsigned &DroppedCount,
-                        DenseMap<VarID, DILocation *> &InlinedAtsMap,
-                        VarID Var) = 0;
-  /// Visit every debug record in an llvm::Function or llvm::MachineFunction
-  /// and call populateVarIDSetAndInlinedMap on it.
-  virtual void visitEveryDebugRecord(
-      DenseSet<VarID> &VarIDSet,
-      DenseMap<StringRef, DenseMap<VarID, DILocation *>> &InlinedAtsMap,
-      StringRef FuncName, bool Before) = 0;
-
-private:
-  /// Remove a dropped debug variable's VarID from all Sets in the
-  /// DroppedVariablesBefore stack.
-  void removeVarFromAllSets(VarID Var, const Function *F) {
-    // Do not remove Var from the last element, it will be popped from the
-    // stack.
-    for (auto &DebugVariablesMap : llvm::drop_end(DebugVariablesStack))
-      DebugVariablesMap[F].DebugVariablesBefore.erase(Var);
-  }
-  /// Return true if \p Scope is the same as \p DbgValScope or a child scope of
-  /// \p DbgValScope, return false otherwise.
-  bool isScopeChildOfOrEqualTo(const DIScope *Scope,
-                               const DIScope *DbgValScope);
-  /// Return true if \p InlinedAt is the same as \p DbgValInlinedAt or part of
-  /// the InlinedAt chain, return false otherwise.
-  bool isInlinedAtChildOfOrEqualTo(const DILocation *InlinedAt,
-                                   const DILocation *DbgValInlinedAt);
-  bool PassDroppedVariables = false;
-};
-
-/// A class to collect and print dropped debug information due to LLVM IR
-/// optimization passes. After every LLVM IR pass is run, it will print how many
-/// #dbg_values were dropped due to that pass.
-class DroppedVariableStatsIR : public DroppedVariableStats {
-public:
-  DroppedVariableStatsIR(bool DroppedVarStatsEnabled)
-      : llvm::DroppedVariableStats(DroppedVarStatsEnabled) {}
-
-  void runBeforePass(Any IR) {
-    setup();
-    if (const auto *M = unwrapIR<Module>(IR))
-      return this->runOnModule(M, true);
-    if (const auto *F = unwrapIR<Function>(IR))
-      return this->runOnFunction(F, true);
-  }
-
-  void runAfterPass(StringRef P, Any IR) {
-    if (const auto *M = unwrapIR<Module>(IR))
-      runAfterPassModule(P, M);
-    else if (const auto *F = unwrapIR<Function>(IR))
-      runAfterPassFunction(P, F);
-    cleanup();
-  }
-
-  void registerCallbacks(PassInstrumentationCallbacks &PIC);
-
-private:
-  const Function *Func;
-
-  void runAfterPassFunction(StringRef PassID, const Function *F) {
-    runOnFunction(F, false);
-    calculateDroppedVarStatsOnFunction(F, PassID, F->getName().str(),
-                                       "Function");
-  }
-
-  void runAfterPassModule(StringRef PassID, const Module *M) {
-    runOnModule(M, false);
-    calculateDroppedVarStatsOnModule(M, PassID, M->getName().str(), "Module");
-  }
-  /// Populate DebugVariablesBefore, DebugVariablesAfter, InlinedAts before or
-  /// after a pass has run to facilitate dropped variable calculation for an
-  /// llvm::Function.
-  void runOnFunction(const Function *F, bool Before);
-  /// Iterate over all Instructions in a Function and report any dropped debug
-  /// information.
-  void calculateDroppedVarStatsOnFunction(const Function *F, StringRef PassID,
-                                          StringRef FuncOrModName,
-                                          StringRef PassLevel);
-  /// Populate DebugVariablesBefore, DebugVariablesAfter, InlinedAts before or
-  /// after a pass has run to facilitate dropped variable calculation for an
-  /// llvm::Module. Calls runOnFunction on every Function in the Module.
-  void runOnModule(const Module *M, bool Before);
-  /// Iterate over all Functions in a Module and report any dropped debug
-  /// information. Will call calculateDroppedVarStatsOnFunction on every
-  /// Function.
-  void calculateDroppedVarStatsOnModule(const Module *M, StringRef PassID,
-                                        StringRef FuncOrModName,
-                                        StringRef PassLevel);
-  /// Override base class method to run on an llvm::Function specifically.
-  virtual void
-  visitEveryInstruction(unsigned &DroppedCount,
-                        DenseMap<VarID, DILocation *> &InlinedAtsMap,
-                        VarID Var) override;
-  /// Override base class method to run on #dbg_values specifically.
-  virtual void visitEveryDebugRecord(
-      DenseSet<VarID> &VarIDSet,
-      DenseMap<StringRef, DenseMap<VarID, DILocation *>> &InlinedAtsMap,
-      StringRef FuncName, bool Before) override;
-
-  template <typename IRUnitT> static const IRUnitT *unwrapIR(Any IR) {
-    const IRUnitT **IRPtr = llvm::any_cast<const IRUnitT *>(&IR);
-    return IRPtr ? *IRPtr : nullptr;
-  }
-};
-
-} // namespace llvm
-
-#endif

diff  --git a/llvm/include/llvm/Passes/StandardInstrumentations.h b/llvm/include/llvm/Passes/StandardInstrumentations.h
index 12a34c099eaffe..9301a12c740eec 100644
--- a/llvm/include/llvm/Passes/StandardInstrumentations.h
+++ b/llvm/include/llvm/Passes/StandardInstrumentations.h
@@ -19,7 +19,6 @@
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/StringSet.h"
-#include "llvm/CodeGen/DroppedVariableStats.h"
 #include "llvm/CodeGen/MachineBasicBlock.h"
 #include "llvm/IR/BasicBlock.h"
 #include "llvm/IR/DebugInfoMetadata.h"
@@ -580,6 +579,83 @@ class PrintCrashIRInstrumentation {
   static void SignalHandler(void *);
 };
 
+/// A class to collect and print dropped debug information variable statistics.
+/// After every LLVM IR pass is run, it will print how many #dbg_values were
+/// dropped due to that pass.
+class DroppedVariableStats {
+public:
+  DroppedVariableStats(bool DroppedVarStatsEnabled) {
+    if (DroppedVarStatsEnabled)
+      llvm::outs()
+          << "Pass Level, Pass Name, Num of Dropped Variables, Func or "
+             "Module Name\n";
+  };
+  // We intend this to be unique per-compilation, thus no copies.
+  DroppedVariableStats(const DroppedVariableStats &) = delete;
+  void operator=(const DroppedVariableStats &) = delete;
+
+  void registerCallbacks(PassInstrumentationCallbacks &PIC);
+  void runBeforePass(StringRef PassID, Any IR);
+  void runAfterPass(StringRef PassID, Any IR, const PreservedAnalyses &PA);
+  void runAfterPassInvalidated(StringRef PassID, const PreservedAnalyses &PA);
+  bool getPassDroppedVariables() { return PassDroppedVariables; }
+
+private:
+  bool PassDroppedVariables = false;
+  /// A unique key that represents a #dbg_value.
+  using VarID =
+      std::tuple<const DIScope *, const DIScope *, const DILocalVariable *>;
+
+  struct DebugVariables {
+    /// DenseSet of VarIDs before an optimization pass has run.
+    DenseSet<VarID> DebugVariablesBefore;
+    /// DenseSet of VarIDs after an optimization pass has run.
+    DenseSet<VarID> DebugVariablesAfter;
+  };
+
+  /// A stack of a DenseMap, that maps DebugVariables for every pass to an
+  /// llvm::Function. A stack is used because an optimization pass can call
+  /// other passes.
+  SmallVector<DenseMap<const Function *, DebugVariables>> DebugVariablesStack;
+
+  /// A DenseSet tracking whether a scope was visited before.
+  DenseSet<const DIScope *> VisitedScope;
+  /// A stack of DenseMaps, which map the name of an llvm::Function to a
+  /// DenseMap of VarIDs and their inlinedAt locations before an optimization
+  /// pass has run.
+  SmallVector<DenseMap<StringRef, DenseMap<VarID, DILocation *>>> InlinedAts;
+
+  /// Iterate over all Functions in a Module and report any dropped debug
+  /// information. Will call calculateDroppedVarStatsOnFunction on every
+  /// Function.
+  void calculateDroppedVarStatsOnModule(const Module *M, StringRef PassID,
+                                        std::string FuncOrModName,
+                                        std::string PassLevel);
+  /// Iterate over all Instructions in a Function and report any dropped debug
+  /// information.
+  void calculateDroppedVarStatsOnFunction(const Function *F, StringRef PassID,
+                                          std::string FuncOrModName,
+                                          std::string PassLevel);
+  /// Populate DebugVariablesBefore, DebugVariablesAfter, InlinedAts before or
+  /// after a pass has run to facilitate dropped variable calculation for an
+  /// llvm::Function.
+  void runOnFunction(const Function *F, bool Before);
+  /// Populate DebugVariablesBefore, DebugVariablesAfter, InlinedAts before or
+  /// after a pass has run to facilitate dropped variable calculation for an
+  /// llvm::Module. Calls runOnFunction on every Function in the Module.
+  void runOnModule(const Module *M, bool Before);
+  /// Remove a dropped #dbg_value VarID from all Sets in the
+  /// DroppedVariablesBefore stack.
+  void removeVarFromAllSets(VarID Var, const Function *F);
+  /// Return true if \p Scope is the same as \p DbgValScope or a child scope of
+  /// \p DbgValScope, return false otherwise.
+  bool isScopeChildOfOrEqualTo(DIScope *Scope, const DIScope *DbgValScope);
+  /// Return true if \p InlinedAt is the same as \p DbgValInlinedAt or part of
+  /// the InlinedAt chain, return false otherwise.
+  bool isInlinedAtChildOfOrEqualTo(const DILocation *InlinedAt,
+                                   const DILocation *DbgValInlinedAt);
+};
+
 /// This class provides an interface to register all the standard pass
 /// instrumentations and manages their state (if any).
 class StandardInstrumentations {
@@ -597,7 +673,7 @@ class StandardInstrumentations {
   PrintCrashIRInstrumentation PrintCrashIR;
   IRChangedTester ChangeTester;
   VerifyInstrumentation Verify;
-  DroppedVariableStatsIR DroppedStatsIR;
+  DroppedVariableStats DroppedStats;
 
   bool VerifyEach;
 

diff  --git a/llvm/lib/CodeGen/CMakeLists.txt b/llvm/lib/CodeGen/CMakeLists.txt
index 263d4a9ee94d2e..7b47c0e6f75dbe 100644
--- a/llvm/lib/CodeGen/CMakeLists.txt
+++ b/llvm/lib/CodeGen/CMakeLists.txt
@@ -50,7 +50,6 @@ add_llvm_component_library(LLVMCodeGen
   DeadMachineInstructionElim.cpp
   DetectDeadLanes.cpp
   DFAPacketizer.cpp
-  DroppedVariableStats.cpp
   DwarfEHPrepare.cpp
   EarlyIfConversion.cpp
   EdgeBundles.cpp

diff  --git a/llvm/lib/CodeGen/DroppedVariableStats.cpp b/llvm/lib/CodeGen/DroppedVariableStats.cpp
deleted file mode 100644
index 122fcad1293f1e..00000000000000
--- a/llvm/lib/CodeGen/DroppedVariableStats.cpp
+++ /dev/null
@@ -1,194 +0,0 @@
-///===- DroppedVariableStats.cpp ------------------------------------------===//
-///
-/// Part of the LLVM Project, under the Apache License v2.0 with LLVM
-/// Exceptions. See https://llvm.org/LICENSE.txt for license information.
-/// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-///
-///===---------------------------------------------------------------------===//
-/// \file
-/// Dropped Variable Statistics for Debug Information. Reports any number
-/// of #dbg_value that get dropped due to an optimization pass.
-///
-///===---------------------------------------------------------------------===//
-
-#include "llvm/CodeGen/DroppedVariableStats.h"
-#include "llvm/IR/DebugInfoMetadata.h"
-#include "llvm/IR/InstIterator.h"
-#include "llvm/IR/Module.h"
-
-using namespace llvm;
-
-bool DroppedVariableStats::isScopeChildOfOrEqualTo(const DIScope *Scope,
-                                                   const DIScope *DbgValScope) {
-  while (Scope != nullptr) {
-    if (VisitedScope.find(Scope) == VisitedScope.end()) {
-      VisitedScope.insert(Scope);
-      if (Scope == DbgValScope) {
-        VisitedScope.clear();
-        return true;
-      }
-      Scope = Scope->getScope();
-    } else {
-      VisitedScope.clear();
-      return false;
-    }
-  }
-  return false;
-}
-
-bool DroppedVariableStats::isInlinedAtChildOfOrEqualTo(
-    const DILocation *InlinedAt, const DILocation *DbgValInlinedAt) {
-  if (DbgValInlinedAt == InlinedAt)
-    return true;
-  if (!DbgValInlinedAt)
-    return false;
-  auto *IA = InlinedAt;
-  while (IA) {
-    if (IA == DbgValInlinedAt)
-      return true;
-    IA = IA->getInlinedAt();
-  }
-  return false;
-}
-
-void DroppedVariableStats::calculateDroppedStatsAndPrint(
-    DebugVariables &DbgVariables, StringRef FuncName, StringRef PassID,
-    StringRef FuncOrModName, StringRef PassLevel, const Function *Func) {
-  unsigned DroppedCount = 0;
-  DenseSet<VarID> &DebugVariablesBeforeSet = DbgVariables.DebugVariablesBefore;
-  DenseSet<VarID> &DebugVariablesAfterSet = DbgVariables.DebugVariablesAfter;
-  DenseMap<VarID, DILocation *> &InlinedAtsMap = InlinedAts.back()[FuncName];
-  // Find an Instruction that shares the same scope as the dropped #dbg_value or
-  // has a scope that is the child of the scope of the #dbg_value, and has an
-  // inlinedAt equal to the inlinedAt of the #dbg_value or it's inlinedAt chain
-  // contains the inlinedAt of the #dbg_value, if such an Instruction is found,
-  // debug information is dropped.
-  for (VarID Var : DebugVariablesBeforeSet) {
-    if (DebugVariablesAfterSet.contains(Var))
-      continue;
-    visitEveryInstruction(DroppedCount, InlinedAtsMap, Var);
-    removeVarFromAllSets(Var, Func);
-  }
-  if (DroppedCount > 0) {
-    llvm::outs() << PassLevel << ", " << PassID << ", " << DroppedCount << ", "
-                 << FuncOrModName << "\n";
-    PassDroppedVariables = true;
-  } else
-    PassDroppedVariables = false;
-}
-
-bool DroppedVariableStats::updateDroppedCount(
-    DILocation *DbgLoc, const DIScope *Scope, const DIScope *DbgValScope,
-    DenseMap<VarID, DILocation *> &InlinedAtsMap, VarID Var,
-    unsigned &DroppedCount) {
-
-  // If the Scope is a child of, or equal to the DbgValScope and is inlined at
-  // the Var's InlinedAt location, return true to signify that the Var has been
-  // dropped.
-  if (isScopeChildOfOrEqualTo(Scope, DbgValScope))
-    if (isInlinedAtChildOfOrEqualTo(DbgLoc->getInlinedAt(),
-                                    InlinedAtsMap[Var])) {
-      // Found another instruction in the variable's scope, so there exists a
-      // break point at which the variable could be observed. Count it as
-      // dropped.
-      DroppedCount++;
-      return true;
-    }
-  return false;
-}
-
-void DroppedVariableStats::run(DebugVariables &DbgVariables, StringRef FuncName,
-                               bool Before) {
-  auto &VarIDSet = (Before ? DbgVariables.DebugVariablesBefore
-                           : DbgVariables.DebugVariablesAfter);
-  auto &InlinedAtsMap = InlinedAts.back();
-  if (Before)
-    InlinedAtsMap.try_emplace(FuncName, DenseMap<VarID, DILocation *>());
-  VarIDSet = DenseSet<VarID>();
-  visitEveryDebugRecord(VarIDSet, InlinedAtsMap, FuncName, Before);
-}
-
-void DroppedVariableStats::populateVarIDSetAndInlinedMap(
-    const DILocalVariable *DbgVar, DebugLoc DbgLoc, DenseSet<VarID> &VarIDSet,
-    DenseMap<StringRef, DenseMap<VarID, DILocation *>> &InlinedAtsMap,
-    StringRef FuncName, bool Before) {
-  VarID Key{DbgVar->getScope(), DbgLoc->getInlinedAtScope(), DbgVar};
-  VarIDSet.insert(Key);
-  if (Before)
-    InlinedAtsMap[FuncName].try_emplace(Key, DbgLoc.getInlinedAt());
-}
-
-void DroppedVariableStatsIR::runOnFunction(const Function *F, bool Before) {
-  auto &DebugVariables = DebugVariablesStack.back()[F];
-  auto FuncName = F->getName();
-  Func = F;
-  run(DebugVariables, FuncName, Before);
-}
-
-void DroppedVariableStatsIR::calculateDroppedVarStatsOnFunction(
-    const Function *F, StringRef PassID, StringRef FuncOrModName,
-    StringRef PassLevel) {
-  Func = F;
-  StringRef FuncName = F->getName();
-  DebugVariables &DbgVariables = DebugVariablesStack.back()[F];
-  calculateDroppedStatsAndPrint(DbgVariables, FuncName, PassID, FuncOrModName,
-                                PassLevel, Func);
-}
-
-void DroppedVariableStatsIR::runOnModule(const Module *M, bool Before) {
-  for (auto &F : *M)
-    runOnFunction(&F, Before);
-}
-
-void DroppedVariableStatsIR::calculateDroppedVarStatsOnModule(
-    const Module *M, StringRef PassID, StringRef FuncOrModName,
-    StringRef PassLevel) {
-  for (auto &F : *M) {
-    calculateDroppedVarStatsOnFunction(&F, PassID, FuncOrModName, PassLevel);
-  }
-}
-
-void DroppedVariableStatsIR::registerCallbacks(
-    PassInstrumentationCallbacks &PIC) {
-  if (!DroppedVariableStatsEnabled)
-    return;
-
-  PIC.registerBeforeNonSkippedPassCallback(
-      [this](StringRef P, Any IR) { return runBeforePass(IR); });
-  PIC.registerAfterPassCallback(
-      [this](StringRef P, Any IR, const PreservedAnalyses &PA) {
-        return runAfterPass(P, IR);
-      });
-  PIC.registerAfterPassInvalidatedCallback(
-      [this](StringRef P, const PreservedAnalyses &PA) { return cleanup(); });
-}
-
-void DroppedVariableStatsIR::visitEveryInstruction(
-    unsigned &DroppedCount, DenseMap<VarID, DILocation *> &InlinedAtsMap,
-    VarID Var) {
-  const DIScope *DbgValScope = std::get<0>(Var);
-  for (const auto &I : instructions(Func)) {
-    auto *DbgLoc = I.getDebugLoc().get();
-    if (!DbgLoc)
-      continue;
-    if (updateDroppedCount(DbgLoc, DbgLoc->getScope(), DbgValScope,
-                           InlinedAtsMap, Var, DroppedCount))
-      break;
-  }
-}
-
-void DroppedVariableStatsIR::visitEveryDebugRecord(
-    DenseSet<VarID> &VarIDSet,
-    DenseMap<StringRef, DenseMap<VarID, DILocation *>> &InlinedAtsMap,
-    StringRef FuncName, bool Before) {
-  for (const auto &I : instructions(Func)) {
-    for (DbgRecord &DR : I.getDbgRecordRange()) {
-      if (auto *Dbg = dyn_cast<DbgVariableRecord>(&DR)) {
-        auto *DbgVar = Dbg->getVariable();
-        auto DbgLoc = DR.getDebugLoc();
-        populateVarIDSetAndInlinedMap(DbgVar, DbgLoc, VarIDSet, InlinedAtsMap,
-                                      FuncName, Before);
-      }
-    }
-  }
-}

diff  --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp
index b766517e68eba5..6259f8f736c80b 100644
--- a/llvm/lib/Passes/StandardInstrumentations.cpp
+++ b/llvm/lib/Passes/StandardInstrumentations.cpp
@@ -2462,7 +2462,7 @@ StandardInstrumentations::StandardInstrumentations(
                        PrintChanged == ChangePrinter::ColourDiffVerbose ||
                            PrintChanged == ChangePrinter::ColourDiffQuiet),
       WebsiteChangeReporter(PrintChanged == ChangePrinter::DotCfgVerbose),
-      Verify(DebugLogging), DroppedStatsIR(DroppedVarStats),
+      Verify(DebugLogging), DroppedStats(DroppedVarStats),
       VerifyEach(VerifyEach) {}
 
 PrintCrashIRInstrumentation *PrintCrashIRInstrumentation::CrashReporter =
@@ -2523,6 +2523,180 @@ void PrintCrashIRInstrumentation::registerCallbacks(
       });
 }
 
+void DroppedVariableStats::registerCallbacks(
+    PassInstrumentationCallbacks &PIC) {
+  if (!DroppedVarStats)
+    return;
+
+  PIC.registerBeforeNonSkippedPassCallback(
+      [this](StringRef P, Any IR) { return this->runBeforePass(P, IR); });
+  PIC.registerAfterPassCallback(
+      [this](StringRef P, Any IR, const PreservedAnalyses &PA) {
+        return this->runAfterPass(P, IR, PA);
+      });
+  PIC.registerAfterPassInvalidatedCallback(
+      [this](StringRef P, const PreservedAnalyses &PA) {
+        return this->runAfterPassInvalidated(P, PA);
+      });
+}
+
+void DroppedVariableStats::runBeforePass(StringRef PassID, Any IR) {
+  DebugVariablesStack.push_back({DenseMap<const Function *, DebugVariables>()});
+  InlinedAts.push_back({DenseMap<StringRef, DenseMap<VarID, DILocation *>>()});
+  if (auto *M = unwrapIR<Module>(IR))
+    return this->runOnModule(M, true);
+  if (auto *F = unwrapIR<Function>(IR))
+    return this->runOnFunction(F, true);
+}
+
+void DroppedVariableStats::runOnFunction(const Function *F, bool Before) {
+  auto &DebugVariables = DebugVariablesStack.back()[F];
+  auto &VarIDSet = (Before ? DebugVariables.DebugVariablesBefore
+                           : DebugVariables.DebugVariablesAfter);
+  auto &InlinedAtsMap = InlinedAts.back();
+  auto FuncName = F->getName();
+  if (Before)
+    InlinedAtsMap.try_emplace(FuncName, DenseMap<VarID, DILocation *>());
+  VarIDSet = DenseSet<VarID>();
+  for (const auto &I : instructions(F)) {
+    for (DbgRecord &DR : I.getDbgRecordRange()) {
+      if (auto *Dbg = dyn_cast<DbgVariableRecord>(&DR)) {
+        auto *DbgVar = Dbg->getVariable();
+        auto DbgLoc = DR.getDebugLoc();
+        VarID Key{DbgVar->getScope(), DbgLoc->getInlinedAtScope(), DbgVar};
+        VarIDSet.insert(Key);
+        if (Before)
+          InlinedAtsMap[FuncName].try_emplace(Key, DbgLoc.getInlinedAt());
+      }
+    }
+  }
+}
+
+void DroppedVariableStats::runOnModule(const Module *M, bool Before) {
+  for (auto &F : *M)
+    runOnFunction(&F, Before);
+}
+
+void DroppedVariableStats::removeVarFromAllSets(VarID Var, const Function *F) {
+  // Do not remove Var from the last element, it will be popped from the stack.
+  for (auto &DebugVariablesMap : llvm::drop_end(DebugVariablesStack))
+    DebugVariablesMap[F].DebugVariablesBefore.erase(Var);
+}
+
+void DroppedVariableStats::calculateDroppedVarStatsOnModule(
+    const Module *M, StringRef PassID, std::string FuncOrModName,
+    std::string PassLevel) {
+  for (auto &F : *M) {
+    calculateDroppedVarStatsOnFunction(&F, PassID, FuncOrModName, PassLevel);
+  }
+}
+
+void DroppedVariableStats::calculateDroppedVarStatsOnFunction(
+    const Function *F, StringRef PassID, std::string FuncOrModName,
+    std::string PassLevel) {
+  unsigned DroppedCount = 0;
+  StringRef FuncName = F->getName();
+  DebugVariables &DbgVariables = DebugVariablesStack.back()[F];
+  DenseSet<VarID> &DebugVariablesBeforeSet = DbgVariables.DebugVariablesBefore;
+  DenseSet<VarID> &DebugVariablesAfterSet = DbgVariables.DebugVariablesAfter;
+  DenseMap<VarID, DILocation *> &InlinedAtsMap = InlinedAts.back()[FuncName];
+  // Find an Instruction that shares the same scope as the dropped #dbg_value or
+  // has a scope that is the child of the scope of the #dbg_value, and has an
+  // inlinedAt equal to the inlinedAt of the #dbg_value or it's inlinedAt chain
+  // contains the inlinedAt of the #dbg_value, if such an Instruction is found,
+  // debug information is dropped.
+  for (VarID Var : DebugVariablesBeforeSet) {
+    if (DebugVariablesAfterSet.contains(Var))
+      continue;
+    const DIScope *DbgValScope = std::get<0>(Var);
+    for (const auto &I : instructions(F)) {
+      auto *DbgLoc = I.getDebugLoc().get();
+      if (!DbgLoc)
+        continue;
+
+      auto *Scope = DbgLoc->getScope();
+      if (isScopeChildOfOrEqualTo(Scope, DbgValScope)) {
+        if (isInlinedAtChildOfOrEqualTo(DbgLoc->getInlinedAt(),
+                                        InlinedAtsMap[Var])) {
+          // Found another instruction in the variable's scope, so there exists
+          // a break point at which the variable could be observed. Count it as
+          // dropped.
+          DroppedCount++;
+          break;
+        }
+      }
+    }
+    removeVarFromAllSets(Var, F);
+  }
+  if (DroppedCount > 0) {
+    llvm::outs() << PassLevel << ", " << PassID << ", " << DroppedCount << ", "
+                 << FuncOrModName << "\n";
+    PassDroppedVariables = true;
+  } else
+    PassDroppedVariables = false;
+}
+
+void DroppedVariableStats::runAfterPassInvalidated(
+    StringRef PassID, const PreservedAnalyses &PA) {
+  DebugVariablesStack.pop_back();
+  InlinedAts.pop_back();
+}
+
+void DroppedVariableStats::runAfterPass(StringRef PassID, Any IR,
+                                        const PreservedAnalyses &PA) {
+  std::string PassLevel;
+  std::string FuncOrModName;
+  if (auto *M = unwrapIR<Module>(IR)) {
+    this->runOnModule(M, false);
+    PassLevel = "Module";
+    FuncOrModName = M->getName();
+    calculateDroppedVarStatsOnModule(M, PassID, FuncOrModName, PassLevel);
+  } else if (auto *F = unwrapIR<Function>(IR)) {
+    this->runOnFunction(F, false);
+    PassLevel = "Function";
+    FuncOrModName = F->getName();
+    calculateDroppedVarStatsOnFunction(F, PassID, FuncOrModName, PassLevel);
+  }
+
+  DebugVariablesStack.pop_back();
+  InlinedAts.pop_back();
+}
+
+bool DroppedVariableStats::isScopeChildOfOrEqualTo(DIScope *Scope,
+                                                   const DIScope *DbgValScope) {
+  while (Scope != nullptr) {
+    if (VisitedScope.find(Scope) == VisitedScope.end()) {
+      VisitedScope.insert(Scope);
+      if (Scope == DbgValScope) {
+        VisitedScope.clear();
+        return true;
+      }
+      Scope = Scope->getScope();
+    } else {
+      VisitedScope.clear();
+      return false;
+    }
+  }
+  return false;
+}
+
+bool DroppedVariableStats::isInlinedAtChildOfOrEqualTo(
+    const DILocation *InlinedAt, const DILocation *DbgValInlinedAt) {
+  if (DbgValInlinedAt == InlinedAt)
+    return true;
+  if (!DbgValInlinedAt)
+    return false;
+  if (!InlinedAt)
+    return false;
+  auto *IA = InlinedAt;
+  while (IA) {
+    if (IA == DbgValInlinedAt)
+      return true;
+    IA = IA->getInlinedAt();
+  }
+  return false;
+}
+
 void StandardInstrumentations::registerCallbacks(
     PassInstrumentationCallbacks &PIC, ModuleAnalysisManager *MAM) {
   PrintIR.registerCallbacks(PIC);
@@ -2538,7 +2712,7 @@ void StandardInstrumentations::registerCallbacks(
   WebsiteChangeReporter.registerCallbacks(PIC);
   ChangeTester.registerCallbacks(PIC);
   PrintCrashIR.registerCallbacks(PIC);
-  DroppedStatsIR.registerCallbacks(PIC);
+  DroppedStats.registerCallbacks(PIC);
   if (MAM)
     PreservedCFGChecker.registerCallbacks(PIC, *MAM);
 

diff  --git a/llvm/unittests/CodeGen/CMakeLists.txt b/llvm/unittests/CodeGen/CMakeLists.txt
index 807fd1a9b7b568..963cdcc0275e16 100644
--- a/llvm/unittests/CodeGen/CMakeLists.txt
+++ b/llvm/unittests/CodeGen/CMakeLists.txt
@@ -27,7 +27,6 @@ add_llvm_unittest(CodeGenTests
   CCStateTest.cpp
   DIEHashTest.cpp
   DIETest.cpp
-  DroppedVariableStatsIRTest.cpp
   DwarfStringPoolEntryRefTest.cpp
   InstrRefLDVTest.cpp
   LowLevelTypeTest.cpp

diff  --git a/llvm/unittests/IR/CMakeLists.txt b/llvm/unittests/IR/CMakeLists.txt
index e5c8630f3eed77..ed93ee547d2231 100644
--- a/llvm/unittests/IR/CMakeLists.txt
+++ b/llvm/unittests/IR/CMakeLists.txt
@@ -43,6 +43,7 @@ add_llvm_unittest(IRTests
   ShuffleVectorInstTest.cpp
   StructuralHashTest.cpp
   TimePassesTest.cpp
+  DroppedVariableStatsTest.cpp
   TypesTest.cpp
   UseTest.cpp
   UserTest.cpp

diff  --git a/llvm/unittests/CodeGen/DroppedVariableStatsIRTest.cpp b/llvm/unittests/IR/DroppedVariableStatsTest.cpp
similarity index 91%
rename from llvm/unittests/CodeGen/DroppedVariableStatsIRTest.cpp
rename to llvm/unittests/IR/DroppedVariableStatsTest.cpp
index 094ec7b6576344..61f3a87bb355e0 100644
--- a/llvm/unittests/CodeGen/DroppedVariableStatsIRTest.cpp
+++ b/llvm/unittests/IR/DroppedVariableStatsTest.cpp
@@ -1,4 +1,5 @@
-//===- unittests/IR/DroppedVariableStatsIRTest.cpp ------------------------===//
+//===- unittests/IR/DroppedVariableStatsTest.cpp - TimePassesHandler tests
+//----------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,7 +8,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/AsmParser/Parser.h"
-#include "llvm/CodeGen/DroppedVariableStats.h"
 #include "llvm/IR/Function.h"
 #include "llvm/IR/InstIterator.h"
 #include "llvm/IR/LegacyPassManager.h"
@@ -44,7 +44,7 @@ namespace {
 // This test ensures that if a #dbg_value and an instruction that exists in the
 // same scope as that #dbg_value are both deleted as a result of an optimization
 // pass, debug information is considered not dropped.
-TEST(DroppedVariableStatsIR, BothDeleted) {
+TEST(DroppedVariableStats, BothDeleted) {
   PassInstrumentationCallbacks PIC;
   PassInstrumentation PI(&PIC);
 
@@ -79,8 +79,9 @@ TEST(DroppedVariableStatsIR, BothDeleted) {
   std::unique_ptr<llvm::Module> M = parseIR(C, IR);
   ASSERT_TRUE(M);
 
-  DroppedVariableStatsIR Stats(true);
-  Stats.runBeforePass(llvm::Any(const_cast<const llvm::Module *>(M.get())));
+  DroppedVariableStats Stats(true);
+  Stats.runBeforePass("Test",
+                      llvm::Any(const_cast<const llvm::Module *>(M.get())));
 
   // This loop simulates an IR pass that drops debug information.
   for (auto &F : *M) {
@@ -91,15 +92,16 @@ TEST(DroppedVariableStatsIR, BothDeleted) {
     }
     break;
   }
+  PreservedAnalyses PA;
   Stats.runAfterPass("Test",
-                     llvm::Any(const_cast<const llvm::Module *>(M.get())));
+                     llvm::Any(const_cast<const llvm::Module *>(M.get())), PA);
   ASSERT_EQ(Stats.getPassDroppedVariables(), false);
 }
 
 // This test ensures that if a #dbg_value is dropped after an optimization pass,
 // but an instruction that shares the same scope as the #dbg_value still exists,
 // debug information is conisdered dropped.
-TEST(DroppedVariableStatsIR, DbgValLost) {
+TEST(DroppedVariableStats, DbgValLost) {
   PassInstrumentationCallbacks PIC;
   PassInstrumentation PI(&PIC);
 
@@ -134,8 +136,9 @@ TEST(DroppedVariableStatsIR, DbgValLost) {
   std::unique_ptr<llvm::Module> M = parseIR(C, IR);
   ASSERT_TRUE(M);
 
-  DroppedVariableStatsIR Stats(true);
-  Stats.runBeforePass(llvm::Any(const_cast<const llvm::Module *>(M.get())));
+  DroppedVariableStats Stats(true);
+  Stats.runBeforePass("Test",
+                      llvm::Any(const_cast<const llvm::Module *>(M.get())));
 
   // This loop simulates an IR pass that drops debug information.
   for (auto &F : *M) {
@@ -145,15 +148,16 @@ TEST(DroppedVariableStatsIR, DbgValLost) {
     }
     break;
   }
+  PreservedAnalyses PA;
   Stats.runAfterPass("Test",
-                     llvm::Any(const_cast<const llvm::Module *>(M.get())));
+                     llvm::Any(const_cast<const llvm::Module *>(M.get())), PA);
   ASSERT_EQ(Stats.getPassDroppedVariables(), true);
 }
 
 // This test ensures that if a #dbg_value is dropped after an optimization pass,
 // but an instruction that has an unrelated scope as the #dbg_value still
 // exists, debug information is conisdered not dropped.
-TEST(DroppedVariableStatsIR, UnrelatedScopes) {
+TEST(DroppedVariableStats, UnrelatedScopes) {
   PassInstrumentationCallbacks PIC;
   PassInstrumentation PI(&PIC);
 
@@ -189,8 +193,9 @@ TEST(DroppedVariableStatsIR, UnrelatedScopes) {
   std::unique_ptr<llvm::Module> M = parseIR(C, IR);
   ASSERT_TRUE(M);
 
-  DroppedVariableStatsIR Stats(true);
-  Stats.runBeforePass(llvm::Any(const_cast<const llvm::Module *>(M.get())));
+  DroppedVariableStats Stats(true);
+  Stats.runBeforePass("Test",
+                      llvm::Any(const_cast<const llvm::Module *>(M.get())));
 
   // This loop simulates an IR pass that drops debug information.
   for (auto &F : *M) {
@@ -200,15 +205,16 @@ TEST(DroppedVariableStatsIR, UnrelatedScopes) {
     }
     break;
   }
+  PreservedAnalyses PA;
   Stats.runAfterPass("Test",
-                     llvm::Any(const_cast<const llvm::Module *>(M.get())));
+                     llvm::Any(const_cast<const llvm::Module *>(M.get())), PA);
   ASSERT_EQ(Stats.getPassDroppedVariables(), false);
 }
 
 // This test ensures that if a #dbg_value is dropped after an optimization pass,
 // but an instruction that has a scope which is a child of the #dbg_value scope
 // still exists, debug information is conisdered dropped.
-TEST(DroppedVariableStatsIR, ChildScopes) {
+TEST(DroppedVariableStats, ChildScopes) {
   PassInstrumentationCallbacks PIC;
   PassInstrumentation PI(&PIC);
 
@@ -244,8 +250,9 @@ TEST(DroppedVariableStatsIR, ChildScopes) {
   std::unique_ptr<llvm::Module> M = parseIR(C, IR);
   ASSERT_TRUE(M);
 
-  DroppedVariableStatsIR Stats(true);
-  Stats.runBeforePass(llvm::Any(const_cast<const llvm::Module *>(M.get())));
+  DroppedVariableStats Stats(true);
+  Stats.runBeforePass("Test",
+                      llvm::Any(const_cast<const llvm::Module *>(M.get())));
 
   // This loop simulates an IR pass that drops debug information.
   for (auto &F : *M) {
@@ -255,8 +262,9 @@ TEST(DroppedVariableStatsIR, ChildScopes) {
     }
     break;
   }
+  PreservedAnalyses PA;
   Stats.runAfterPass("Test",
-                     llvm::Any(const_cast<const llvm::Module *>(M.get())));
+                     llvm::Any(const_cast<const llvm::Module *>(M.get())), PA);
   ASSERT_EQ(Stats.getPassDroppedVariables(), true);
 }
 
@@ -264,7 +272,7 @@ TEST(DroppedVariableStatsIR, ChildScopes) {
 // but an instruction that has a scope which is a child of the #dbg_value scope
 // still exists, and the #dbg_value is inlined at another location, debug
 // information is conisdered not dropped.
-TEST(DroppedVariableStatsIR, InlinedAt) {
+TEST(DroppedVariableStats, InlinedAt) {
   PassInstrumentationCallbacks PIC;
   PassInstrumentation PI(&PIC);
 
@@ -300,8 +308,9 @@ TEST(DroppedVariableStatsIR, InlinedAt) {
   std::unique_ptr<llvm::Module> M = parseIR(C, IR);
   ASSERT_TRUE(M);
 
-  DroppedVariableStatsIR Stats(true);
-  Stats.runBeforePass(llvm::Any(const_cast<const llvm::Module *>(M.get())));
+  DroppedVariableStats Stats(true);
+  Stats.runBeforePass("Test",
+                      llvm::Any(const_cast<const llvm::Module *>(M.get())));
 
   // This loop simulates an IR pass that drops debug information.
   for (auto &F : *M) {
@@ -311,8 +320,9 @@ TEST(DroppedVariableStatsIR, InlinedAt) {
     }
     break;
   }
+  PreservedAnalyses PA;
   Stats.runAfterPass("Test",
-                     llvm::Any(const_cast<const llvm::Module *>(M.get())));
+                     llvm::Any(const_cast<const llvm::Module *>(M.get())), PA);
   ASSERT_EQ(Stats.getPassDroppedVariables(), false);
 }
 
@@ -320,7 +330,7 @@ TEST(DroppedVariableStatsIR, InlinedAt) {
 // but an instruction that has a scope which is a child of the #dbg_value scope
 // still exists, and the #dbg_value and the instruction are inlined at another
 // location, debug information is conisdered dropped.
-TEST(DroppedVariableStatsIR, InlinedAtShared) {
+TEST(DroppedVariableStats, InlinedAtShared) {
   PassInstrumentationCallbacks PIC;
   PassInstrumentation PI(&PIC);
 
@@ -356,8 +366,9 @@ TEST(DroppedVariableStatsIR, InlinedAtShared) {
   std::unique_ptr<llvm::Module> M = parseIR(C, IR);
   ASSERT_TRUE(M);
 
-  DroppedVariableStatsIR Stats(true);
-  Stats.runBeforePass(llvm::Any(const_cast<const llvm::Module *>(M.get())));
+  DroppedVariableStats Stats(true);
+  Stats.runBeforePass("Test",
+                      llvm::Any(const_cast<const llvm::Module *>(M.get())));
 
   // This loop simulates an IR pass that drops debug information.
   for (auto &F : *M) {
@@ -367,8 +378,9 @@ TEST(DroppedVariableStatsIR, InlinedAtShared) {
     }
     break;
   }
+  PreservedAnalyses PA;
   Stats.runAfterPass("Test",
-                     llvm::Any(const_cast<const llvm::Module *>(M.get())));
+                     llvm::Any(const_cast<const llvm::Module *>(M.get())), PA);
   ASSERT_EQ(Stats.getPassDroppedVariables(), true);
 }
 
@@ -376,7 +388,7 @@ TEST(DroppedVariableStatsIR, InlinedAtShared) {
 // but an instruction that has a scope which is a child of the #dbg_value scope
 // still exists, and the instruction is inlined at a location that is the
 // #dbg_value's inlined at location, debug information is conisdered dropped.
-TEST(DroppedVariableStatsIR, InlinedAtChild) {
+TEST(DroppedVariableStats, InlinedAtChild) {
   PassInstrumentationCallbacks PIC;
   PassInstrumentation PI(&PIC);
 
@@ -413,8 +425,9 @@ TEST(DroppedVariableStatsIR, InlinedAtChild) {
   std::unique_ptr<llvm::Module> M = parseIR(C, IR);
   ASSERT_TRUE(M);
 
-  DroppedVariableStatsIR Stats(true);
-  Stats.runBeforePass(llvm::Any(const_cast<const llvm::Module *>(M.get())));
+  DroppedVariableStats Stats(true);
+  Stats.runBeforePass("Test",
+                      llvm::Any(const_cast<const llvm::Module *>(M.get())));
 
   // This loop simulates an IR pass that drops debug information.
   for (auto &F : *M) {
@@ -424,8 +437,9 @@ TEST(DroppedVariableStatsIR, InlinedAtChild) {
     }
     break;
   }
+  PreservedAnalyses PA;
   Stats.runAfterPass("Test",
-                     llvm::Any(const_cast<const llvm::Module *>(M.get())));
+                     llvm::Any(const_cast<const llvm::Module *>(M.get())), PA);
   ASSERT_EQ(Stats.getPassDroppedVariables(), true);
 }
 


        


More information about the llvm-commits mailing list