[midend-LoopAnalysis]将前置分析结果指针保存到循环特征分析类中消除冗余的分析指针传递
This commit is contained in:
@@ -271,11 +271,15 @@ public:
|
|||||||
std::unique_ptr<AnalysisResultBase> getResult() override { return std::move(CurrentResult); }
|
std::unique_ptr<AnalysisResultBase> getResult() override { return std::move(CurrentResult); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<LoopCharacteristicsResult> CurrentResult;
|
std::unique_ptr<LoopCharacteristicsResult> CurrentResult;
|
||||||
|
|
||||||
|
// ========== 缓存的分析结果 ==========
|
||||||
|
LoopAnalysisResult* loopAnalysis; // 循环结构分析结果
|
||||||
|
AliasAnalysisResult* aliasAnalysis; // 别名分析结果
|
||||||
|
SideEffectAnalysisResult* sideEffectAnalysis; // 副作用分析结果
|
||||||
|
|
||||||
// ========== 核心分析方法 ==========
|
// ========== 核心分析方法 ==========
|
||||||
void analyzeLoop(Loop* loop, LoopCharacteristics* characteristics, AnalysisManager &AM,
|
void analyzeLoop(Loop* loop, LoopCharacteristics* characteristics);
|
||||||
AliasAnalysisResult* aliasAnalysis, SideEffectAnalysisResult* sideEffectAnalysis);
|
|
||||||
|
|
||||||
// 基础循环形式分析
|
// 基础循环形式分析
|
||||||
void analyzeLoopForm(Loop* loop, LoopCharacteristics* characteristics);
|
void analyzeLoopForm(Loop* loop, LoopCharacteristics* characteristics);
|
||||||
@@ -284,8 +288,7 @@ private:
|
|||||||
void computePerformanceMetrics(Loop* loop, LoopCharacteristics* characteristics);
|
void computePerformanceMetrics(Loop* loop, LoopCharacteristics* characteristics);
|
||||||
|
|
||||||
// 基础纯度和副作用分析
|
// 基础纯度和副作用分析
|
||||||
void analyzePurityAndSideEffects(Loop* loop, LoopCharacteristics* characteristics,
|
void analyzePurityAndSideEffects(Loop* loop, LoopCharacteristics* characteristics);
|
||||||
SideEffectAnalysisResult* sideEffectAnalysis);
|
|
||||||
|
|
||||||
// 基础归纳变量识别
|
// 基础归纳变量识别
|
||||||
void identifyBasicInductionVariables(Loop* loop, LoopCharacteristics* characteristics);
|
void identifyBasicInductionVariables(Loop* loop, LoopCharacteristics* characteristics);
|
||||||
@@ -297,8 +300,7 @@ private:
|
|||||||
void analyzeBasicLoopBounds(Loop* loop, LoopCharacteristics* characteristics);
|
void analyzeBasicLoopBounds(Loop* loop, LoopCharacteristics* characteristics);
|
||||||
|
|
||||||
// 基础内存访问模式分析
|
// 基础内存访问模式分析
|
||||||
void analyzeBasicMemoryAccessPatterns(Loop* loop, LoopCharacteristics* characteristics,
|
void analyzeBasicMemoryAccessPatterns(Loop* loop, LoopCharacteristics* characteristics);
|
||||||
AliasAnalysisResult* aliasAnalysis);
|
|
||||||
|
|
||||||
// 基础优化评估
|
// 基础优化评估
|
||||||
void evaluateBasicOptimizationOpportunities(Loop* loop, LoopCharacteristics* characteristics);
|
void evaluateBasicOptimizationOpportunities(Loop* loop, LoopCharacteristics* characteristics);
|
||||||
|
|||||||
@@ -105,23 +105,23 @@ bool LoopCharacteristicsPass::runOnFunction(Function *F, AnalysisManager &AM) {
|
|||||||
if (DEBUG)
|
if (DEBUG)
|
||||||
std::cout << "Running LoopCharacteristicsPass on function: " << F->getName() << std::endl;
|
std::cout << "Running LoopCharacteristicsPass on function: " << F->getName() << std::endl;
|
||||||
|
|
||||||
// 获取循环分析结果
|
// 获取并缓存所有需要的分析结果
|
||||||
auto* loopAnalysisResult = AM.getAnalysisResult<LoopAnalysisResult, LoopAnalysisPass>(F);
|
loopAnalysis = AM.getAnalysisResult<LoopAnalysisResult, LoopAnalysisPass>(F);
|
||||||
if (!loopAnalysisResult) {
|
if (!loopAnalysis) {
|
||||||
std::cerr << "Error: LoopAnalysisResult not available for function " << F->getName() << std::endl;
|
std::cerr << "Error: LoopAnalysisResult not available for function " << F->getName() << std::endl;
|
||||||
CurrentResult = std::make_unique<LoopCharacteristicsResult>(F);
|
CurrentResult = std::make_unique<LoopCharacteristicsResult>(F);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果没有循环,直接返回
|
// 如果没有循环,直接返回
|
||||||
if (!loopAnalysisResult->hasLoops()) {
|
if (!loopAnalysis->hasLoops()) {
|
||||||
CurrentResult = std::make_unique<LoopCharacteristicsResult>(F);
|
CurrentResult = std::make_unique<LoopCharacteristicsResult>(F);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取别名分析和副作用分析结果
|
// 获取别名分析和副作用分析结果并缓存
|
||||||
auto* aliasAnalysis = AM.getAnalysisResult<AliasAnalysisResult, SysYAliasAnalysisPass>(F);
|
aliasAnalysis = AM.getAnalysisResult<AliasAnalysisResult, SysYAliasAnalysisPass>(F);
|
||||||
auto* sideEffectAnalysis = AM.getAnalysisResult<SideEffectAnalysisResult, SysYSideEffectAnalysisPass>();
|
sideEffectAnalysis = AM.getAnalysisResult<SideEffectAnalysisResult, SysYSideEffectAnalysisPass>();
|
||||||
|
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
if (aliasAnalysis) std::cout << "LoopCharacteristics: Using alias analysis results" << std::endl;
|
if (aliasAnalysis) std::cout << "LoopCharacteristics: Using alias analysis results" << std::endl;
|
||||||
@@ -130,13 +130,13 @@ bool LoopCharacteristicsPass::runOnFunction(Function *F, AnalysisManager &AM) {
|
|||||||
|
|
||||||
CurrentResult = std::make_unique<LoopCharacteristicsResult>(F);
|
CurrentResult = std::make_unique<LoopCharacteristicsResult>(F);
|
||||||
|
|
||||||
// 分析每个循环的特征
|
// 分析每个循环的特征 - 现在不需要传递分析结果参数
|
||||||
for (const auto& loop_ptr : loopAnalysisResult->getAllLoops()) {
|
for (const auto& loop_ptr : loopAnalysis->getAllLoops()) {
|
||||||
Loop* loop = loop_ptr.get();
|
Loop* loop = loop_ptr.get();
|
||||||
auto characteristics = std::make_unique<LoopCharacteristics>(loop);
|
auto characteristics = std::make_unique<LoopCharacteristics>(loop);
|
||||||
|
|
||||||
// 执行各种特征分析,传递分析结果
|
// 执行各种特征分析,使用缓存的分析结果
|
||||||
analyzeLoop(loop, characteristics.get(), AM, aliasAnalysis, sideEffectAnalysis);
|
analyzeLoop(loop, characteristics.get());
|
||||||
|
|
||||||
// 添加到结果中
|
// 添加到结果中
|
||||||
CurrentResult->addLoopCharacteristics(std::move(characteristics));
|
CurrentResult->addLoopCharacteristics(std::move(characteristics));
|
||||||
@@ -153,20 +153,18 @@ bool LoopCharacteristicsPass::runOnFunction(Function *F, AnalysisManager &AM) {
|
|||||||
return false; // 特征分析不修改IR
|
return false; // 特征分析不修改IR
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoopCharacteristicsPass::analyzeLoop(Loop* loop, LoopCharacteristics* characteristics,
|
void LoopCharacteristicsPass::analyzeLoop(Loop* loop, LoopCharacteristics* characteristics) {
|
||||||
AnalysisManager &AM, AliasAnalysisResult* aliasAnalysis,
|
|
||||||
SideEffectAnalysisResult* sideEffectAnalysis) {
|
|
||||||
if (DEBUG)
|
if (DEBUG)
|
||||||
std::cout << " Analyzing basic characteristics of loop: " << loop->getName() << std::endl;
|
std::cout << " Analyzing basic characteristics of loop: " << loop->getName() << std::endl;
|
||||||
|
|
||||||
// 按顺序执行基础分析
|
// 按顺序执行基础分析 - 现在使用缓存的分析结果
|
||||||
computePerformanceMetrics(loop, characteristics);
|
computePerformanceMetrics(loop, characteristics);
|
||||||
analyzeLoopForm(loop, characteristics);
|
analyzeLoopForm(loop, characteristics);
|
||||||
analyzePurityAndSideEffects(loop, characteristics, sideEffectAnalysis);
|
analyzePurityAndSideEffects(loop, characteristics);
|
||||||
identifyBasicInductionVariables(loop, characteristics);
|
identifyBasicInductionVariables(loop, characteristics);
|
||||||
identifyBasicLoopInvariants(loop, characteristics);
|
identifyBasicLoopInvariants(loop, characteristics);
|
||||||
analyzeBasicLoopBounds(loop, characteristics);
|
analyzeBasicLoopBounds(loop, characteristics);
|
||||||
analyzeBasicMemoryAccessPatterns(loop, characteristics, aliasAnalysis);
|
analyzeBasicMemoryAccessPatterns(loop, characteristics);
|
||||||
evaluateBasicOptimizationOpportunities(loop, characteristics);
|
evaluateBasicOptimizationOpportunities(loop, characteristics);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,8 +219,7 @@ void LoopCharacteristicsPass::analyzeLoopForm(Loop* loop, LoopCharacteristics* c
|
|||||||
characteristics->isCountingLoop = isSimple && loop->isInnermost() && exitingBlocks.size() == 1;
|
characteristics->isCountingLoop = isSimple && loop->isInnermost() && exitingBlocks.size() == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoopCharacteristicsPass::analyzePurityAndSideEffects(Loop* loop, LoopCharacteristics* characteristics,
|
void LoopCharacteristicsPass::analyzePurityAndSideEffects(Loop* loop, LoopCharacteristics* characteristics) {
|
||||||
SideEffectAnalysisResult* sideEffectAnalysis) {
|
|
||||||
if (!sideEffectAnalysis) {
|
if (!sideEffectAnalysis) {
|
||||||
// 没有副作用分析结果,保守处理
|
// 没有副作用分析结果,保守处理
|
||||||
characteristics->isPure = false;
|
characteristics->isPure = false;
|
||||||
@@ -237,8 +234,7 @@ void LoopCharacteristicsPass::analyzePurityAndSideEffects(Loop* loop, LoopCharac
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoopCharacteristicsPass::analyzeBasicMemoryAccessPatterns(Loop* loop, LoopCharacteristics* characteristics,
|
void LoopCharacteristicsPass::analyzeBasicMemoryAccessPatterns(Loop* loop, LoopCharacteristics* characteristics) {
|
||||||
AliasAnalysisResult* aliasAnalysis) {
|
|
||||||
if (!aliasAnalysis) {
|
if (!aliasAnalysis) {
|
||||||
// 没有别名分析结果,保守处理
|
// 没有别名分析结果,保守处理
|
||||||
characteristics->accessesOnlyLocalMemory = false;
|
characteristics->accessesOnlyLocalMemory = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user