forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 333
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add a pass to collect dropped var stats for MIR (llvm#120780)
This patch uses the DroppedVariableStats class to add dropped variable statistics for MIR passes. Reland 1c082c9 (cherry picked from commit 3bf91ad)
- Loading branch information
1 parent
4023ae9
commit 34a4297
Showing
7 changed files
with
1,217 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.