From be9ac8958400e71f230fbd65c1f9d2d53f2acd68 Mon Sep 17 00:00:00 2001 From: rain2133 <1370973498@qq.com> Date: Sat, 9 Aug 2025 16:42:31 +0800 Subject: [PATCH] =?UTF-8?q?[midend-LoopAnalysis]=E5=B0=86=E5=89=8D?= =?UTF-8?q?=E7=BD=AE=E5=88=86=E6=9E=90=E7=BB=93=E6=9E=9C=E6=8C=87=E9=92=88?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E5=88=B0=E5=BE=AA=E7=8E=AF=E7=89=B9=E5=BE=81?= =?UTF-8?q?=E5=88=86=E6=9E=90=E7=B1=BB=E4=B8=AD=E6=B6=88=E9=99=A4=E5=86=97?= =?UTF-8?q?=E4=BD=99=E7=9A=84=E5=88=86=E6=9E=90=E6=8C=87=E9=92=88=E4=BC=A0?= =?UTF-8?q?=E9=80=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pass/Analysis/LoopCharacteristics.h | 16 ++++---- .../Pass/Analysis/LoopCharacteristics.cpp | 38 +++++++++---------- 2 files changed, 26 insertions(+), 28 deletions(-) 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;