Add a pass to collect dropped var stats for MIR (#120780)

This patch uses the DroppedVariableStats class to add dropped variable
statistics for MIR passes.

Reland 1c082c9cd12efaa67a32c5da89a328c458ed51c5
This commit is contained in:
Shubham Sandeep Rastogi
2024-12-20 10:08:54 -08:00
committed by GitHub
parent 5e22597aa0
commit 3bf91ad2a9
7 changed files with 1245 additions and 1 deletions

View File

@@ -0,0 +1,70 @@
///===- DroppedVariableStatsMIR.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_VALUEs that get dropped due to an optimization pass.
///
///===---------------------------------------------------------------------===//
#ifndef LLVM_CODEGEN_DROPPEDVARIABLESTATSMIR_H
#define LLVM_CODEGEN_DROPPEDVARIABLESTATSMIR_H
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/Passes/DroppedVariableStats.h"
namespace llvm {
/// 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

View File

@@ -18,6 +18,7 @@
#ifndef LLVM_CODEGEN_MACHINEFUNCTIONPASS_H
#define LLVM_CODEGEN_MACHINEFUNCTIONPASS_H
#include "llvm/CodeGen/DroppedVariableStatsMIR.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,

View File

@@ -50,6 +50,7 @@ add_llvm_component_library(LLVMCodeGen
DeadMachineInstructionElim.cpp
DetectDeadLanes.cpp
DFAPacketizer.cpp
DroppedVariableStatsMIR.cpp
DwarfEHPrepare.cpp
EarlyIfConversion.cpp
EdgeBundles.cpp

View File

@@ -0,0 +1,77 @@
///===- DroppedVariableStatsMIR.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_VALUEs that get dropped due to an optimization pass.
///
///===---------------------------------------------------------------------===//
#include "llvm/CodeGen/DroppedVariableStatsMIR.h"
using namespace llvm;
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);
}
}
}
}

View File

@@ -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

View File

@@ -27,6 +27,7 @@ add_llvm_unittest(CodeGenTests
CCStateTest.cpp
DIEHashTest.cpp
DIETest.cpp
DroppedVariableStatsMIRTest.cpp
DwarfStringPoolEntryRefTest.cpp
InstrRefLDVTest.cpp
LowLevelTypeTest.cpp

File diff suppressed because it is too large Load Diff