From c4c91412d150af4a5a75b692cec8219d689990dd Mon Sep 17 00:00:00 2001 From: rain2133 <1370973498@qq.com> Date: Fri, 8 Aug 2025 15:31:35 +0800 Subject: [PATCH] =?UTF-8?q?[midend]=E4=BF=AE=E6=94=B9=E4=B8=80=E7=82=B9?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E5=92=8C=E6=B3=A8=E9=87=8A=EF=BC=8C=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=97=A0=E7=94=A8=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/midend/Pass/Analysis/AliasAnalysis.cpp | 29 ++++++++++++------- .../Pass/Analysis/AliasAnalysis_new.cpp | 0 .../Pass/Analysis/SideEffectAnalysis.cpp | 19 ++++++++++++ 3 files changed, 37 insertions(+), 11 deletions(-) delete mode 100644 src/midend/Pass/Analysis/AliasAnalysis_new.cpp diff --git a/src/midend/Pass/Analysis/AliasAnalysis.cpp b/src/midend/Pass/Analysis/AliasAnalysis.cpp index 9dae2a1..6716d7c 100644 --- a/src/midend/Pass/Analysis/AliasAnalysis.cpp +++ b/src/midend/Pass/Analysis/AliasAnalysis.cpp @@ -383,8 +383,24 @@ AliasType SysYAliasAnalysisPass::compareParameters(MemoryLocation* loc1, MemoryL } AliasType SysYAliasAnalysisPass::compareWithGlobal(MemoryLocation* loc1, MemoryLocation* loc2) { - // 涉及全局数组的访问,采用保守策略 - // SysY中全局数组和其他内存位置的别名关系较复杂,保守处理 + // 涉及全局数组的访问分析 + // 这里处理所有涉及全局数组的情况 + + // SysY特化:局部数组与全局数组不别名 + if ((loc1->isLocalArray && loc2->isGlobalArray) || + (loc1->isGlobalArray && loc2->isLocalArray)) { + // 局部数组在栈上,全局数组在全局区,确定不别名 + return AliasType::NO_ALIAS; + } + + // SysY特化:数组参数与全局数组可能别名(保守处理) + if ((loc1->isFunctionParameter && loc2->isGlobalArray) || + (loc1->isGlobalArray && loc2->isFunctionParameter)) { + // 数组参数可能指向全局数组,需要保守处理 + return AliasType::POSSIBLE_ALIAS; + } + + // 其他涉及全局数组的情况,采用保守策略 return AliasType::POSSIBLE_ALIAS; } @@ -409,15 +425,6 @@ AliasType SysYAliasAnalysisPass::compareMixedTypes(MemoryLocation* loc1, MemoryL // 因为局部数组是栈上分配,而数组参数是传入的外部数组 return AliasType::NO_ALIAS; } - // 如果是局部数组与全局数组或参数的混合访问,通常也不别名 - if ((loc1->isLocalArray && loc2->isGlobalArray) || - (loc1->isGlobalArray && loc2->isLocalArray) || - (loc1->isFunctionParameter && loc2->isGlobalArray) || - (loc1->isGlobalArray && loc2->isFunctionParameter)) { - // 局部数组与全局数组或参数:通常不别名 - // 因为局部数组是栈上分配,而全局数组或参数是传入的外部数组 - return AliasType::NO_ALIAS; - } // 对于其他混合情况,保守估计 return AliasType::UNKNOWN_ALIAS; diff --git a/src/midend/Pass/Analysis/AliasAnalysis_new.cpp b/src/midend/Pass/Analysis/AliasAnalysis_new.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/src/midend/Pass/Analysis/SideEffectAnalysis.cpp b/src/midend/Pass/Analysis/SideEffectAnalysis.cpp index 288fa0f..34a6034 100644 --- a/src/midend/Pass/Analysis/SideEffectAnalysis.cpp +++ b/src/midend/Pass/Analysis/SideEffectAnalysis.cpp @@ -121,6 +121,25 @@ bool SysYSideEffectAnalysisPass::runOnFunction(Function* F, AnalysisManager& AM) // 获取别名分析结果,在整个函数分析过程中重复使用 aliasAnalysis = AM.getAnalysisResult(F); + // TODO: 重构为Module级别的分析,利用独立的调用图分析 + // + // 建议的架构: + // 1. SysYCallGraphAnalysisPass - 独立的调用图分析(Module级别) + // - 构建完整的函数调用关系 + // - 提供拓扑排序和强连通分量 + // - 识别递归调用模式 + // + // 2. SysYSideEffectAnalysisPass - 重构为Module级别 + // - 依赖调用图分析结果 + // - 按拓扑序分析函数,确保依赖函数先分析 + // - 使用不动点算法处理递归函数群 + // + // 优势: + // - 调用图可被多个Pass复用(内联、DCE等) + // - 准确的函数间副作用传播 + // - 正确处理递归调用 + // - 避免保守的"未分析函数"假设 + // 分析函数中的每条指令 SideEffectInfo functionSideEffect;