diff --git a/src/include/midend/Pass/Analysis/LoopCharacteristics.h b/src/include/midend/Pass/Analysis/LoopCharacteristics.h index f74f086..aa0e751 100644 --- a/src/include/midend/Pass/Analysis/LoopCharacteristics.h +++ b/src/include/midend/Pass/Analysis/LoopCharacteristics.h @@ -271,11 +271,15 @@ public: std::unique_ptr getResult() override { return std::move(CurrentResult); } private: - std::unique_ptr CurrentResult; + std::unique_ptr CurrentResult; + + // ========== 缓存的分析结果 ========== + LoopAnalysisResult* loopAnalysis; // 循环结构分析结果 + AliasAnalysisResult* aliasAnalysis; // 别名分析结果 + SideEffectAnalysisResult* sideEffectAnalysis; // 副作用分析结果 // ========== 核心分析方法 ========== - void analyzeLoop(Loop* loop, LoopCharacteristics* characteristics, AnalysisManager &AM, - AliasAnalysisResult* aliasAnalysis, SideEffectAnalysisResult* sideEffectAnalysis); + void analyzeLoop(Loop* loop, LoopCharacteristics* characteristics); // 基础循环形式分析 void analyzeLoopForm(Loop* loop, LoopCharacteristics* characteristics); @@ -284,8 +288,7 @@ private: void computePerformanceMetrics(Loop* loop, LoopCharacteristics* characteristics); // 基础纯度和副作用分析 - void analyzePurityAndSideEffects(Loop* loop, LoopCharacteristics* characteristics, - SideEffectAnalysisResult* sideEffectAnalysis); + void analyzePurityAndSideEffects(Loop* loop, LoopCharacteristics* characteristics); // 基础归纳变量识别 void identifyBasicInductionVariables(Loop* loop, LoopCharacteristics* characteristics); @@ -297,8 +300,7 @@ private: void analyzeBasicLoopBounds(Loop* loop, LoopCharacteristics* characteristics); // 基础内存访问模式分析 - void analyzeBasicMemoryAccessPatterns(Loop* loop, LoopCharacteristics* characteristics, - AliasAnalysisResult* aliasAnalysis); + void analyzeBasicMemoryAccessPatterns(Loop* loop, LoopCharacteristics* characteristics); // 基础优化评估 void evaluateBasicOptimizationOpportunities(Loop* loop, LoopCharacteristics* characteristics); diff --git a/src/midend/Pass/Analysis/LoopCharacteristics.cpp b/src/midend/Pass/Analysis/LoopCharacteristics.cpp index 9bfd19e..84f0dca 100644 --- a/src/midend/Pass/Analysis/LoopCharacteristics.cpp +++ b/src/midend/Pass/Analysis/LoopCharacteristics.cpp @@ -105,23 +105,23 @@ bool LoopCharacteristicsPass::runOnFunction(Function *F, AnalysisManager &AM) { if (DEBUG) std::cout << "Running LoopCharacteristicsPass on function: " << F->getName() << std::endl; - // 获取循环分析结果 - auto* loopAnalysisResult = AM.getAnalysisResult(F); - if (!loopAnalysisResult) { + // 获取并缓存所有需要的分析结果 + loopAnalysis = AM.getAnalysisResult(F); + if (!loopAnalysis) { std::cerr << "Error: LoopAnalysisResult not available for function " << F->getName() << std::endl; CurrentResult = std::make_unique(F); return false; } // 如果没有循环,直接返回 - if (!loopAnalysisResult->hasLoops()) { + if (!loopAnalysis->hasLoops()) { CurrentResult = std::make_unique(F); return false; } - // 获取别名分析和副作用分析结果 - auto* aliasAnalysis = AM.getAnalysisResult(F); - auto* sideEffectAnalysis = AM.getAnalysisResult(); + // 获取别名分析和副作用分析结果并缓存 + aliasAnalysis = AM.getAnalysisResult(F); + sideEffectAnalysis = AM.getAnalysisResult(); if (DEBUG) { 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(F); - // 分析每个循环的特征 - for (const auto& loop_ptr : loopAnalysisResult->getAllLoops()) { + // 分析每个循环的特征 - 现在不需要传递分析结果参数 + for (const auto& loop_ptr : loopAnalysis->getAllLoops()) { Loop* loop = loop_ptr.get(); auto characteristics = std::make_unique(loop); - // 执行各种特征分析,传递分析结果 - analyzeLoop(loop, characteristics.get(), AM, aliasAnalysis, sideEffectAnalysis); + // 执行各种特征分析,使用缓存的分析结果 + analyzeLoop(loop, characteristics.get()); // 添加到结果中 CurrentResult->addLoopCharacteristics(std::move(characteristics)); @@ -153,20 +153,18 @@ bool LoopCharacteristicsPass::runOnFunction(Function *F, AnalysisManager &AM) { return false; // 特征分析不修改IR } -void LoopCharacteristicsPass::analyzeLoop(Loop* loop, LoopCharacteristics* characteristics, - AnalysisManager &AM, AliasAnalysisResult* aliasAnalysis, - SideEffectAnalysisResult* sideEffectAnalysis) { +void LoopCharacteristicsPass::analyzeLoop(Loop* loop, LoopCharacteristics* characteristics) { if (DEBUG) std::cout << " Analyzing basic characteristics of loop: " << loop->getName() << std::endl; - // 按顺序执行基础分析 + // 按顺序执行基础分析 - 现在使用缓存的分析结果 computePerformanceMetrics(loop, characteristics); analyzeLoopForm(loop, characteristics); - analyzePurityAndSideEffects(loop, characteristics, sideEffectAnalysis); + analyzePurityAndSideEffects(loop, characteristics); identifyBasicInductionVariables(loop, characteristics); identifyBasicLoopInvariants(loop, characteristics); analyzeBasicLoopBounds(loop, characteristics); - analyzeBasicMemoryAccessPatterns(loop, characteristics, aliasAnalysis); + analyzeBasicMemoryAccessPatterns(loop, characteristics); evaluateBasicOptimizationOpportunities(loop, characteristics); } @@ -221,8 +219,7 @@ void LoopCharacteristicsPass::analyzeLoopForm(Loop* loop, LoopCharacteristics* c characteristics->isCountingLoop = isSimple && loop->isInnermost() && exitingBlocks.size() == 1; } -void LoopCharacteristicsPass::analyzePurityAndSideEffects(Loop* loop, LoopCharacteristics* characteristics, - SideEffectAnalysisResult* sideEffectAnalysis) { +void LoopCharacteristicsPass::analyzePurityAndSideEffects(Loop* loop, LoopCharacteristics* characteristics) { if (!sideEffectAnalysis) { // 没有副作用分析结果,保守处理 characteristics->isPure = false; @@ -237,8 +234,7 @@ void LoopCharacteristicsPass::analyzePurityAndSideEffects(Loop* loop, LoopCharac } } -void LoopCharacteristicsPass::analyzeBasicMemoryAccessPatterns(Loop* loop, LoopCharacteristics* characteristics, - AliasAnalysisResult* aliasAnalysis) { +void LoopCharacteristicsPass::analyzeBasicMemoryAccessPatterns(Loop* loop, LoopCharacteristics* characteristics) { if (!aliasAnalysis) { // 没有别名分析结果,保守处理 characteristics->accessesOnlyLocalMemory = false;