[llvm] d8b5af4 - Revert "Reland "Add a pass to collect dropped var stats for MIR" (#117044)"

Shubham Sandeep Rastogi via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 3 12:52:12 PST 2024


Author: Shubham Sandeep Rastogi
Date: 2024-12-03T12:50:13-08:00
New Revision: d8b5af45040431c44c1766aa505a6edb786ef81b

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

LOG: Revert "Reland "Add a pass to collect dropped var stats for MIR" (#117044)"

This reverts commit 249755cedb17ffa707253edcef1a388f807caa35.

Broke https://lab.llvm.org/buildbot/#/builders/160/builds/9420

Note: This is test shard 99 of 154.
[==========] Running 2 tests from 2 test suites.
[----------] Global test environment set-up.
[----------] 1 test from DroppedVariableStatsMIR
[ RUN      ] DroppedVariableStatsMIR.InlinedAt

--
exit: -11

Added: 
    

Modified: 
    llvm/include/llvm/CodeGen/DroppedVariableStats.h
    llvm/include/llvm/CodeGen/MachineFunctionPass.h
    llvm/lib/CodeGen/DroppedVariableStats.cpp
    llvm/lib/CodeGen/MachineFunctionPass.cpp
    llvm/unittests/CodeGen/CMakeLists.txt

Removed: 
    llvm/unittests/CodeGen/DroppedVariableStatsMIRTest.cpp


################################################################################
diff  --git a/llvm/include/llvm/CodeGen/DroppedVariableStats.h b/llvm/include/llvm/CodeGen/DroppedVariableStats.h
index f6050c68c91aaf..371d775b02e876 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_values or DBG_VALUEs that get dropped due to an optimization pass.
+/// of #dbg_value that get dropped due to an optimization pass.
 ///
 ///===---------------------------------------------------------------------===//
 
@@ -221,52 +221,6 @@ class DroppedVariableStatsIR : public DroppedVariableStats {
   }
 };
 
-/// 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 d82b593497ffc3..caaf22c2139e31 100644
--- a/llvm/include/llvm/CodeGen/MachineFunctionPass.h
+++ b/llvm/include/llvm/CodeGen/MachineFunctionPass.h
@@ -18,7 +18,6 @@
 #ifndef LLVM_CODEGEN_MACHINEFUNCTIONPASS_H
 #define LLVM_CODEGEN_MACHINEFUNCTIONPASS_H
 
-#include "llvm/CodeGen/DroppedVariableStats.h"
 #include "llvm/CodeGen/MachineFunction.h"
 #include "llvm/Pass.h"
 
@@ -68,7 +67,6 @@ class MachineFunctionPass : public FunctionPass {
   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 71f91292160f58..122fcad1293f1e 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_values or DBG_VALUEs that get dropped due to an optimization pass.
+/// of #dbg_value that get dropped due to an optimization pass.
 ///
 ///===---------------------------------------------------------------------===//
 
@@ -192,64 +192,3 @@ 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 e803811643f874..62ac3e32d24d9d 100644
--- a/llvm/lib/CodeGen/MachineFunctionPass.cpp
+++ b/llvm/lib/CodeGen/MachineFunctionPass.cpp
@@ -32,11 +32,6 @@
 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);
@@ -96,15 +91,7 @@ bool MachineFunctionPass::runOnFunction(Function &F) {
 
   MFProps.reset(ClearedProperties);
 
-  bool RV;
-  if (DroppedVarStatsMIR) {
-    auto PassName = getPassName();
-    DroppedVarStatsMF.runBeforePass(PassName, &MF);
-    RV = runOnMachineFunction(MF);
-    DroppedVarStatsMF.runAfterPass(PassName, &MF);
-  } else {
-    RV = runOnMachineFunction(MF);
-  }
+  bool 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 50ef1bb5b7af26..807fd1a9b7b568 100644
--- a/llvm/unittests/CodeGen/CMakeLists.txt
+++ b/llvm/unittests/CodeGen/CMakeLists.txt
@@ -28,7 +28,6 @@ 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
deleted file mode 100644
index b26a89c7adcbad..00000000000000
--- a/llvm/unittests/CodeGen/DroppedVariableStatsMIRTest.cpp
+++ /dev/null
@@ -1,1067 +0,0 @@
-//===- 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


        


More information about the llvm-commits mailing list