mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
5908f3a456
LazyBlockFrequenceInfoPass, LazyBranchProbabilityInfoPass and LoopAccessLegacyAnalysis all cache pointers to their nestled required analysis passes. One need to use addRequiredTransitive to describe that the nestled passes can't be freed until those analysis passes no longer are used themselves. There is still a bit of a mess considering the getLazyBPIAnalysisUsage and getLazyBFIAnalysisUsage functions. Those functions are used from both Transform, CodeGen and Analysis passes. I figure it is OK to use addRequiredTransitive also when being used from Transform and CodeGen passes. On the other hand, I figure we must do it when used from other Analysis passes. So using addRequiredTransitive should be more correct here. An alternative solution would be to add a bool option in those functions to let the user tell if it is a analysis pass or not. Since those lazy passes will be obsolete when new PM has conquered the world I figure we can leave it like this right now. Intention with the patch is to fix PR49950. It at least solves the problem for the reproducer in PR49950. However, that reproducer need five passes in a specific order, so there are lots of various "solutions" that could avoid the crash without actually fixing the root cause. This is a reapply of commit 3655f0757f2b4b, that was reverted in 33ff3c20498ef5c2057 due to problems with assertions in the polly lit tests. That problem is supposed to be solved by also adjusting ScopPass to explicitly preserve LazyBlockFrequencyInfo and LazyBranchProbabilityInfo (it already preserved OptimizationRemarkEmitter which depends on those lazy passes). Differential Revision: https://reviews.llvm.org/D100958
73 lines
2.9 KiB
C++
73 lines
2.9 KiB
C++
//===- LazyBlockFrequencyInfo.cpp - Lazy Block Frequency Analysis ---------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This is an alternative analysis pass to BlockFrequencyInfoWrapperPass. The
|
|
// difference is that with this pass the block frequencies are not computed when
|
|
// the analysis pass is executed but rather when the BFI result is explicitly
|
|
// requested by the analysis client.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Analysis/LazyBlockFrequencyInfo.h"
|
|
#include "llvm/Analysis/LazyBranchProbabilityInfo.h"
|
|
#include "llvm/Analysis/LoopInfo.h"
|
|
#include "llvm/IR/Dominators.h"
|
|
#include "llvm/InitializePasses.h"
|
|
|
|
using namespace llvm;
|
|
|
|
#define DEBUG_TYPE "lazy-block-freq"
|
|
|
|
INITIALIZE_PASS_BEGIN(LazyBlockFrequencyInfoPass, DEBUG_TYPE,
|
|
"Lazy Block Frequency Analysis", true, true)
|
|
INITIALIZE_PASS_DEPENDENCY(LazyBPIPass)
|
|
INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
|
|
INITIALIZE_PASS_END(LazyBlockFrequencyInfoPass, DEBUG_TYPE,
|
|
"Lazy Block Frequency Analysis", true, true)
|
|
|
|
char LazyBlockFrequencyInfoPass::ID = 0;
|
|
|
|
LazyBlockFrequencyInfoPass::LazyBlockFrequencyInfoPass() : FunctionPass(ID) {
|
|
initializeLazyBlockFrequencyInfoPassPass(*PassRegistry::getPassRegistry());
|
|
}
|
|
|
|
void LazyBlockFrequencyInfoPass::print(raw_ostream &OS, const Module *) const {
|
|
LBFI.getCalculated().print(OS);
|
|
}
|
|
|
|
void LazyBlockFrequencyInfoPass::getAnalysisUsage(AnalysisUsage &AU) const {
|
|
LazyBranchProbabilityInfoPass::getLazyBPIAnalysisUsage(AU);
|
|
// We require DT so it's available when LI is available. The LI updating code
|
|
// asserts that DT is also present so if we don't make sure that we have DT
|
|
// here, that assert will trigger.
|
|
AU.addRequiredTransitive<DominatorTreeWrapperPass>();
|
|
AU.addRequiredTransitive<LoopInfoWrapperPass>();
|
|
AU.setPreservesAll();
|
|
}
|
|
|
|
void LazyBlockFrequencyInfoPass::releaseMemory() { LBFI.releaseMemory(); }
|
|
|
|
bool LazyBlockFrequencyInfoPass::runOnFunction(Function &F) {
|
|
auto &BPIPass = getAnalysis<LazyBranchProbabilityInfoPass>();
|
|
LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
|
|
LBFI.setAnalysis(&F, &BPIPass, &LI);
|
|
return false;
|
|
}
|
|
|
|
void LazyBlockFrequencyInfoPass::getLazyBFIAnalysisUsage(AnalysisUsage &AU) {
|
|
LazyBranchProbabilityInfoPass::getLazyBPIAnalysisUsage(AU);
|
|
AU.addRequiredTransitive<LazyBlockFrequencyInfoPass>();
|
|
AU.addRequiredTransitive<LoopInfoWrapperPass>();
|
|
}
|
|
|
|
void llvm::initializeLazyBFIPassPass(PassRegistry &Registry) {
|
|
initializeLazyBPIPassPass(Registry);
|
|
INITIALIZE_PASS_DEPENDENCY(LazyBlockFrequencyInfoPass);
|
|
INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass);
|
|
}
|