forked from OSchip/llvm-project
[XRay] Lazily compute MachineLoopInfo instead of requiring it.
Summary: Currently X-Ray Instrumentation pass has a dependency on MachineLoopInfo (and thus on MachineDominatorTree as well) and we have to compute them even if X-Ray is not used. This patch changes it to a lazy computation to save compile time by avoiding these redundant computations. Reviewers: dberris, kubamracek Subscribers: llvm-commits, hiraditya Differential Revision: https://reviews.llvm.org/D44666 llvm-svn: 327999
This commit is contained in:
parent
54b161e47f
commit
fb3f509e01
|
@ -52,7 +52,6 @@ struct XRayInstrumentation : public MachineFunctionPass {
|
||||||
|
|
||||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
AU.addRequired<MachineLoopInfo>();
|
|
||||||
AU.addPreserved<MachineLoopInfo>();
|
AU.addPreserved<MachineLoopInfo>();
|
||||||
AU.addPreserved<MachineDominatorTree>();
|
AU.addPreserved<MachineDominatorTree>();
|
||||||
MachineFunctionPass::getAnalysisUsage(AU);
|
MachineFunctionPass::getAnalysisUsage(AU);
|
||||||
|
@ -160,11 +159,26 @@ bool XRayInstrumentation::runOnMachineFunction(MachineFunction &MF) {
|
||||||
for (const auto &MBB : MF)
|
for (const auto &MBB : MF)
|
||||||
MICount += MBB.size();
|
MICount += MBB.size();
|
||||||
|
|
||||||
|
// Get MachineDominatorTree or compute it on the fly if it's unavailable
|
||||||
|
auto *MDT = getAnalysisIfAvailable<MachineDominatorTree>();
|
||||||
|
MachineDominatorTree ComputedMDT;
|
||||||
|
if (!MDT) {
|
||||||
|
ComputedMDT.getBase().recalculate(MF);
|
||||||
|
MDT = &ComputedMDT;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get MachineLoopInfo or compute it on the fly if it's unavailable
|
||||||
|
auto *MLI = getAnalysisIfAvailable<MachineLoopInfo>();
|
||||||
|
MachineLoopInfo ComputedMLI;
|
||||||
|
if (!MLI) {
|
||||||
|
ComputedMLI.getBase().analyze(MDT->getBase());
|
||||||
|
MLI = &ComputedMLI;
|
||||||
|
}
|
||||||
|
|
||||||
// Check if we have a loop.
|
// Check if we have a loop.
|
||||||
// FIXME: Maybe make this smarter, and see whether the loops are dependent
|
// FIXME: Maybe make this smarter, and see whether the loops are dependent
|
||||||
// on inputs or side-effects?
|
// on inputs or side-effects?
|
||||||
MachineLoopInfo &MLI = getAnalysis<MachineLoopInfo>();
|
if (MLI->empty() && MICount < XRayThreshold)
|
||||||
if (MLI.empty() && MICount < XRayThreshold)
|
|
||||||
return false; // Function is too small and has no loops.
|
return false; // Function is too small and has no loops.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,8 +55,6 @@
|
||||||
; CHECK-NEXT: StackMap Liveness Analysis
|
; CHECK-NEXT: StackMap Liveness Analysis
|
||||||
; CHECK-NEXT: Live DEBUG_VALUE analysis
|
; CHECK-NEXT: Live DEBUG_VALUE analysis
|
||||||
; CHECK-NEXT: Insert fentry calls
|
; CHECK-NEXT: Insert fentry calls
|
||||||
; CHECK-NEXT: MachineDominator Tree Construction
|
|
||||||
; CHECK-NEXT: Machine Natural Loop Construction
|
|
||||||
; CHECK-NEXT: Insert XRay ops
|
; CHECK-NEXT: Insert XRay ops
|
||||||
; CHECK-NEXT: Implement the 'patchable-function' attribute
|
; CHECK-NEXT: Implement the 'patchable-function' attribute
|
||||||
; CHECK-NEXT: X86 Retpoline Thunks
|
; CHECK-NEXT: X86 Retpoline Thunks
|
||||||
|
|
Loading…
Reference in New Issue