LLVM: lib/CodeGen/MachineFunctionPass.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

32

33using namespace llvm;

34using namespace ore;

35

37 "dropped-variable-stats-mir", cl::Hidden,

38 cl::desc("Dump dropped debug variables stats for MIR passes"),

40

41Pass *MachineFunctionPass::createPrinterPass(raw_ostream &O,

42 const std::string &Banner) const {

44}

45

46bool MachineFunctionPass::runOnFunction(Function &F) {

47

48

49 if (F.hasAvailableExternallyLinkage())

50 return false;

51

54

55 MachineFunctionProperties &MFProps = MF.getProperties();

56

57#ifndef NDEBUG

59 errs() << "MachineFunctionProperties required by " << getPassName()

60 << " pass are not met by function " << F.getName() << ".\n"

61 << "Required properties: ";

62 RequiredProperties.print(errs());

63 errs() << "\nCurrent properties: ";

65 errs() << "\n";

67 }

68#endif

69

70 unsigned CountBefore, CountAfter;

71

72

73 bool ShouldEmitSizeRemarks =

74 F.getParent()->shouldEmitInstrCountChangedRemark();

75

76

77

78 if (ShouldEmitSizeRemarks)

80

81

82

83 SmallString<0> BeforeStr, AfterStr;

84 StringRef PassID;

87 PassID = PI->getPassArgument();

88 }

91 IsInterestingPass &&

93 if (ShouldPrintChanged) {

94 raw_svector_ostream OS(BeforeStr);

96 }

97

98 MFProps.reset(ClearedProperties);

99

100 bool RV;

102 DroppedVariableStatsMIR DroppedVarStatsMF;

107 } else {

109 }

110

111 if (ShouldEmitSizeRemarks) {

112

113

115 if (CountBefore != CountAfter) {

116 MachineOptimizationRemarkEmitter MORE(MF, nullptr);

117 MORE.emit([&]() {

118 int64_t Delta = static_cast<int64_t>(CountAfter) -

119 static_cast<int64_t>(CountBefore);

120 MachineOptimizationRemarkAnalysis R("size-info", "FunctionMISizeChange",

124 << ": Function: " << NV("Function", F.getName()) << ": "

125 << "MI Instruction count changed from "

126 << NV("MIInstrsBefore", CountBefore) << " to "

127 << NV("MIInstrsAfter", CountAfter)

128 << "; Delta: " << NV("Delta", Delta);

129 return R;

130 });

131 }

132 }

133

134 MFProps.set(SetProperties);

135

136

137

138 if (ShouldPrintChanged || !IsInterestingPass) {

139 if (ShouldPrintChanged) {

140 raw_svector_ostream OS(AfterStr);

142 }

143 if (IsInterestingPass && BeforeStr != AfterStr) {

144 errs() << ("*** IR Dump After " + getPassName() + " (" + PassID +

145 ") on " + MF.getName() + " ***\n");

153 errs() << AfterStr;

154 break;

162 StringRef Removed = Color ? "\033[31m-%l\033[0m\n" : "-%l\n";

163 StringRef Added = Color ? "\033[32m+%l\033[0m\n" : "+%l\n";

164 StringRef NoChange = " %l\n";

165 errs() << doSystemDiff(BeforeStr, AfterStr, Removed, Added, NoChange);

166 break;

167 }

168 }

173 const char *Reason =

174 IsInterestingPass ? " omitted because no change" : " filtered out";

176 if (!PassID.empty())

177 errs() << " (" << PassID << ")";

178 errs() << " on " << MF.getName() + Reason + " ***\n";

179 }

180 }

181 return RV;

182}

183

187

188

189

190

191

192

203

205}

This is the interface for LLVM's primary stateless and local alias analysis.

===- DroppedVariableStatsMIR.h - Opt Diagnostics -*- C++ -*----------—===//

This is the interface for a simple mod/ref and alias analysis over globals.

Module.h This file contains the declarations for the Module class.

static cl::opt< bool > DroppedVarStatsMIR("dropped-variable-stats-mir", cl::Hidden, cl::desc("Dump dropped debug variables stats for MIR passes"), cl::init(false))

This is the interface for a SCEV-based alias analysis.

static const char PassName[]

A wrapper pass to provide the legacy pass manager access to a suitably prepared AAResults object.

Represent the analysis usage information of a pass.

AnalysisUsage & addRequired()

AnalysisUsage & addPreserved()

Add the specified Pass class to the set of analyses preserved by this pass.

Legacy wrapper pass to provide the BasicAAResult object.

Legacy analysis pass which computes a DominatorTree.

void runBeforePass(StringRef PassID, MachineFunction *MF)

void runAfterPass(StringRef PassID, MachineFunction *MF)

DISubprogram * getSubprogram() const

Get the attached subprogram.

Legacy wrapper pass to provide the GlobalsAAResult object.

The legacy pass manager's analysis pass to compute loop information.

void getAnalysisUsage(AnalysisUsage &AU) const override

getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.

Definition MachineFunctionPass.cpp:184

virtual bool runOnMachineFunction(MachineFunction &MF)=0

runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...

LLVM_ABI void print(raw_ostream &OS) const

Print the MachineFunctionProperties in human-readable form.

bool verifyRequiredProperties(const MachineFunctionProperties &V) const

MachineFunctionProperties & set(Property P)

MachineFunctionProperties & reset(Property P)

unsigned getInstructionCount() const

Return the number of MachineInstrs in this MachineFunction.

StringRef getName() const

getName - Return the name of the corresponding LLVM function.

Function & getFunction()

Return the LLVM function that this machine code represents.

const MachineFunctionProperties & getProperties() const

Get the function properties.

const MachineBasicBlock & front() const

void print(raw_ostream &OS, const SlotIndexes *=nullptr) const

print - Print out the MachineFunction in a format suitable for debugging to the specified stream.

LLVM_ABI MachineFunction & getOrCreateMachineFunction(Function &F)

Returns the MachineFunction constructed for the IR function F.

A wrapper analysis pass for the legacy pass manager that exposes a MemoryDepnedenceResults instance.

Pass interface - Implemented by all 'passes'.

AnalysisType & getAnalysis() const

getAnalysis() - This function is used by subclasses to get to the analysis information ...

AnalysisID getPassID() const

getPassID - Return the PassID number that corresponds to this pass.

virtual void getAnalysisUsage(AnalysisUsage &) const

getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...

static const PassInfo * lookupPassInfo(const void *TI)

virtual StringRef getPassName() const

getPassName - Return a nice clean name for a pass.

Legacy wrapper pass to provide the SCEVAAResult object.

This class implements an extremely fast bulk output stream that can only output to a stream.

#define llvm_unreachable(msg)

Marks that the current location is not supposed to be reachable.

initializer< Ty > init(const Ty &Val)

Add a small namespace to avoid name clashes with the classes used in the streaming interface.

DiagnosticInfoOptimizationBase::Argument NV

This is an optimization pass for GlobalISel generic memory operations.

cl::opt< ChangePrinter > PrintChanged

bool isFunctionInPrintList(StringRef FunctionName)

bool isPassInPrintList(StringRef PassName)

LLVM_ABI MachineFunctionPass * createMachineFunctionPrinterPass(raw_ostream &OS, const std::string &Banner="")

MachineFunctionPrinter pass - This pass prints out the machine function to the given stream as a debu...

LLVM_ABI raw_fd_ostream & errs()

This returns a reference to a raw_ostream for standard error.

std::string doSystemDiff(StringRef Before, StringRef After, StringRef OldLineFormat, StringRef NewLineFormat, StringRef UnchangedLineFormat)

bool is_contained(R &&Range, const E &Element)

Returns true if Element is found in Range.