@@ -1,5 +1,6 @@
# include "SideEffectAnalysis.h"
# include "AliasAnalysis.h"
# include "CallGraphAnalysis.h"
# include "SysYIRPrinter.h"
# include <iostream>
@@ -110,78 +111,71 @@ const SideEffectInfo* SideEffectAnalysisResult::getKnownFunctionSideEffect(const
// SysYSideEffectAnalysisPass 类的实现
// ======================================================================
bool SysYSideEffectAnalysisPass : : runOnFunction ( Function * F , AnalysisManager & AM ) {
bool SysYSideEffectAnalysisPass : : runOnModule ( Module * M , AnalysisManager & AM ) {
if ( DEBUG ) {
std : : cout < < " Running SideEffect analysis on function: " < < F - > getName ( ) < < std : : endl ;
std : : cout < < " Running SideEffect analysis on module " < < std : : endl ;
}
// 创建分析结果( 构造函数中已经调用了initializeKnownFunctions)
result = std : : make_unique < SideEffectAnalysisResult > ( ) ;
// 获取别名 分析结果,在整个函数分析过程中重复使用
alias Analysis = AM . getAnalysisResult < Alias AnalysisResult, SysYAlias AnalysisPass> ( F ) ;
// 获取调用图 分析结果
c allGraph Analysis = AM . getAnalysisResult < CallGraph AnalysisResult, CallGraph AnalysisPass> ( ) ;
if ( ! callGraphAnalysis ) {
std : : cerr < < " Warning: CallGraphAnalysis not available, falling back to conservative analysis " < < std : : endl ;
}
// TODO: 重构为Module级别的分析, 利用独立的 调用图 分析
//
// 建议的架构:
// 1. SysYCallGraphAnalysisPass - 独立的调用图分析( Module级别)
// - 构建完整的函数调用关系
// - 提供拓扑排序和强连通分量
// - 识别递归调用模式
//
// 2. SysYSideEffectAnalysisPass - 重构为Module级别
// - 依赖调用图分析结果
// - 按拓扑序分析函数,确保依赖函数先分析
// - 使用不动点算法处理递归函数群
//
// 优势:
// - 调用图可被多个Pass复用( 内联、DCE等)
// - 准确的函数间副作用传播
// - 正确处理递归调用
// - 避免保守的"未分析函数"假设
// 分析函数中的每条指令
SideEffectInfo functionSide Effect;
for ( auto & BB : F - > getBasicBlocks ( ) ) {
for ( auto & I : BB - > getInstructions_Range ( ) ) {
Instruction * inst = I . get ( ) ;
SideEffectInfo instEffect = analyzeInstruction ( inst , AM ) ;
// 记录指令的副作用信息
result - > setInstructionSideEffect ( inst , instEffect ) ;
// 合并到函数级别的副作用信息中
functionSideEffect = functionSideEffect . merge ( instEffect ) ;
// 按拓扑序分析函数,确保被调用函数先于 调用者 分析
if ( callGraphAnalysis ) {
// 使用调用图的拓扑排序结果
const auto & topOrder = callGraphAnalysis - > getTopologicalOrder ( ) ;
// 处理强连通分量(递归函数群)
const auto & sccs = callGraphAnalysis - > getStronglyConnectedComponents ( ) ;
for ( const auto & scc : sccs ) {
if ( scc . size ( ) > 1 ) {
// 多个函数的强连通分量,使用不动点算法
analyzeStronglyConnectedComponent ( scc , AM ) ;
} else {
// 单个函数,检查是否自递归
Function * func = scc [ 0 ] ;
if ( callGraphAnalysis - > isSelfRecursive ( func ) ) {
// 自递归函数也需要不动点算法
analyzeStronglyConnectedComponent ( scc , AM ) ;
} else {
// 非递归函数,直接分析
SideEffectInfo funcEffect = analyzeFunction ( func , AM ) ;
result - > setFunctionSideEffect ( func , func Effect ) ;
}
}
}
} else {
// 没有调用图,保守地分析每个函数
for ( auto & pair : M - > getFunctions ( ) ) {
Function * func = pair . second . get ( ) ;
SideEffectInfo funcEffect = analyzeFunction ( func , AM ) ;
result - > setFunctionSideEffect ( func , funcEffect ) ;
}
}
// 记录函数级别的副作用信息
result - > setFunctionSideEffect ( F , functionSideEffect ) ;
if ( DEBUG ) {
std : : cout < < " ---- Side Effect Analysis Results for Function: " < < F - > getName ( ) < < " ---- \n " ;
for ( auto & BB : F - > getBasicBlocks ( ) ) {
for ( auto & I : BB - > getInstructions_Range ( ) ) {
Instruction * inst = I . get ( ) ;
const auto & info = result - > getInstructionSideEffect ( inst ) ;
SysYPrinter : : printInst ( inst ) ;
std : : cout < < " -> Side Effect: " ;
switch ( info . type ) {
case SideEffectType : : N O_SIDE_EFFECT : std : : cout < < " N one " ; break ;
case SideEffectType : : MEMORY_WRITE : std : : cout < < " Memory Write " ; break ;
case SideEffectType : : FUNCTION_CALL : std : : cout < < " Function Call " ; break ;
case SideEffectType : : IO_OPERATION : std : : cout < < " I/O Operation " ; break ;
case SideEffectType : : UNKNOWN : std : : cout < < " Unknown " ; break ;
}
std : : cout < < " (Modifies Global: " < < ( info . mayModifyGlobal ? " Yes " : " No " )
< < " , Modifies Memory: " < < ( info . mayModifyMemory ? " Yes " : " No " )
< < " , Is Pure: " < < ( info . isPure ? " Yes " : " No " ) < < " ) \n " ;
std : : cout < < " ---- Side Effect Analysis Results for Module ---- \n " ;
for ( auto & pair : M - > getFunctions ( ) ) {
Function * func = pair . second . get ( ) ;
const auto & funcInfo = result - > getFunctionSideEffect ( func ) ;
std : : cout < < " Function " < < func - > getName ( ) < < " : " ;
switch ( funcInfo . type ) {
case SideEffectType : : NO_SIDE_EFFECT : std : : cout < < " No Side Effect " ; break ;
case SideEffectType : : MEMORY_WRITE : std : : cout < < " Memory Write " ; break ;
case SideEffectType : : FUNCTION_CALL : std : : cout < < " Function Call " ; break ;
case SideEffectType : : I O_OPERATION : std : : cout < < " I/O Operati on" ; break ;
case SideEffectType : : UNKNOWN : std : : cout < < " Unknown " ; break ;
}
std : : cout < < " (Pure: " < < ( funcInfo . isPure ? " Yes " : " No " )
< < " , Modifies Global: " < < ( funcInfo . mayModifyGlobal ? " Yes " : " No " ) < < " ) \n " ;
}
std : : cout < < " ------------------------------------------------------------------ \n " ;
std : : cout < < " -------------------------------------------------- \n " ;
}
return false ; // Analysis passes return false since they don't modify the IR
@@ -191,16 +185,100 @@ std::unique_ptr<AnalysisResultBase> SysYSideEffectAnalysisPass::getResult() {
return std : : move ( result ) ;
}
SideEffectInfo SysYSideEffectAnalysisPass : : analyzeInstru ction ( Instru ction* inst , AnalysisManager & AM ) {
SideEffectInfo SysYSideEffectAnalysisPass : : analyzeFun ction ( Fun ction* func , AnalysisManager & AM ) {
SideEffectInfo functionSideEffect ;
// 为每个指令分析副作用
for ( auto & BB : func - > getBasicBlocks ( ) ) {
for ( auto & I : BB - > getInstructions_Range ( ) ) {
Instruction * inst = I . get ( ) ;
SideEffectInfo instEffect = analyzeInstruction ( inst , func , AM ) ;
// 记录指令的副作用信息
result - > setInstructionSideEffect ( inst , instEffect ) ;
// 合并到函数级别的副作用信息中
functionSideEffect = functionSideEffect . merge ( instEffect ) ;
}
}
return functionSideEffect ;
}
void SysYSideEffectAnalysisPass : : analyzeStronglyConnectedComponent ( const std : : vector < Function * > & scc , AnalysisManager & AM ) {
// 使用不动点算法处理递归函数群
std : : unordered_map < Function * , SideEffectInfo > currentEffects ;
std : : unordered_map < Function * , SideEffectInfo > previousEffects ;
// 初始化:所有函数都假设为纯函数
for ( Function * func : scc ) {
SideEffectInfo initialEffect ;
initialEffect . isPure = true ;
currentEffects [ func ] = initialEffect ;
result - > setFunctionSideEffect ( func , initialEffect ) ;
}
bool converged = false ;
int iterations = 0 ;
const int maxIterations = 10 ; // 防止无限循环
while ( ! converged & & iterations < maxIterations ) {
previousEffects = currentEffects ;
// 重新分析每个函数
for ( Function * func : scc ) {
SideEffectInfo newEffect = analyzeFunction ( func , AM ) ;
currentEffects [ func ] = newEffect ;
result - > setFunctionSideEffect ( func , newEffect ) ;
}
// 检查是否收敛
converged = hasConverged ( previousEffects , currentEffects ) ;
iterations + + ;
}
if ( iterations > = maxIterations ) {
std : : cerr < < " Warning: SideEffect analysis did not converge for SCC after "
< < maxIterations < < " iterations " < < std : : endl ;
}
}
bool SysYSideEffectAnalysisPass : : hasConverged ( const std : : unordered_map < Function * , SideEffectInfo > & oldEffects ,
const std : : unordered_map < Function * , SideEffectInfo > & newEffects ) const {
for ( const auto & pair : oldEffects ) {
Function * func = pair . first ;
const SideEffectInfo & oldEffect = pair . second ;
auto it = newEffects . find ( func ) ;
if ( it = = newEffects . end ( ) ) {
return false ; // 函数不存在于新结果中
}
const SideEffectInfo & newEffect = it - > second ;
// 比较关键属性是否相同
if ( oldEffect . type ! = newEffect . type | |
oldEffect . mayModifyGlobal ! = newEffect . mayModifyGlobal | |
oldEffect . mayModifyMemory ! = newEffect . mayModifyMemory | |
oldEffect . mayCallFunction ! = newEffect . mayCallFunction | |
oldEffect . isPure ! = newEffect . isPure ) {
return false ;
}
}
return true ;
}
SideEffectInfo SysYSideEffectAnalysisPass : : analyzeInstruction ( Instruction * inst , Function * currentFunc , AnalysisManager & AM ) {
SideEffectInfo info ;
// 根据指令类型进行分析
if ( inst - > isCall ( ) ) {
return analyzeCallInstruction ( static_cast < CallInst * > ( inst ) , AM ) ;
return analyzeCallInstruction ( static_cast < CallInst * > ( inst ) , currentFunc , AM ) ;
} else if ( inst - > isStore ( ) ) {
return analyzeStoreInstruction ( static_cast < StoreInst * > ( inst ) , AM ) ;
return analyzeStoreInstruction ( static_cast < StoreInst * > ( inst ) , currentFunc , AM ) ;
} else if ( inst - > isMemset ( ) ) {
return analyzeMemsetInstruction ( static_cast < MemsetInst * > ( inst ) , AM ) ;
return analyzeMemsetInstruction ( static_cast < MemsetInst * > ( inst ) , currentFunc , AM ) ;
} else if ( inst - > isBranch ( ) | | inst - > isReturn ( ) ) {
// 控制流指令无副作用,但必须保留
info . type = SideEffectType : : NO_SIDE_EFFECT ;
@@ -214,7 +292,7 @@ SideEffectInfo SysYSideEffectAnalysisPass::analyzeInstruction(Instruction* inst,
return info ;
}
SideEffectInfo SysYSideEffectAnalysisPass : : analyzeCallInstruction ( CallInst * call , AnalysisManager & AM ) {
SideEffectInfo SysYSideEffectAnalysisPass : : analyzeCallInstruction ( CallInst * call , Function * currentFunc , AnalysisManager & AM ) {
SideEffectInfo info ;
// 获取被调用的函数
@@ -237,10 +315,24 @@ SideEffectInfo SysYSideEffectAnalysisPass::analyzeCallInstruction(CallInst* call
return * knownInfo ;
}
// 对于用户定义的函数,检查是否已经分析过
const SideEffectInfo & funcEffect = result - > getFunctionSideEffect ( calledFunc ) ;
if ( funcEffect . type ! = SideEffectType : : NO_SIDE_EFFECT | | ! funcEffect . isPure ) {
return funcEffect ;
// 利用调用图分析结果进行精确分析
if ( callGraphAnalysis ) {
// 检查被调用函数是否已分析过
const SideEffectInfo & funcEffect = result - > getFunctionSideEffect ( calledFunc ) ;
if ( funcEffect . type ! = SideEffectType : : NO_SIDE_EFFECT | | ! funcEffect . isPure ) {
return funcEffect ;
}
// 检查递归调用
if ( callGraphAnalysis - > isRecursive ( calledFunc ) ) {
// 递归函数保守处理(在不动点算法中会精确分析)
info . type = SideEffectType : : FUNCTION_CALL ;
info . mayModifyGlobal = true ;
info . mayModifyMemory = true ;
info . mayCallFunction = true ;
info . isPure = false ;
return info ;
}
}
// 对于未分析的用户函数,保守处理
@@ -253,13 +345,14 @@ SideEffectInfo SysYSideEffectAnalysisPass::analyzeCallInstruction(CallInst* call
return info ;
}
SideEffectInfo SysYSideEffectAnalysisPass : : analyzeStoreInstruction ( StoreInst * store , AnalysisManager & AM ) {
SideEffectInfo SysYSideEffectAnalysisPass : : analyzeStoreInstruction ( StoreInst * store , Function * currentFunc , AnalysisManager & AM ) {
SideEffectInfo info ;
info . type = SideEffectType : : MEMORY_WRITE ;
info . mayModifyMemory = true ;
info . isPure = false ;
// 使用缓存 的别名分析结果
// 获取函数 的别名分析结果
AliasAnalysisResult * aliasAnalysis = AM . getAnalysisResult < AliasAnalysisResult , SysYAliasAnalysisPass > ( currentFunc ) ;
if ( aliasAnalysis ) {
Value * storePtr = store - > getPointer ( ) ;
@@ -275,13 +368,14 @@ SideEffectInfo SysYSideEffectAnalysisPass::analyzeStoreInstruction(StoreInst* st
return info ;
}
SideEffectInfo SysYSideEffectAnalysisPass : : analyzeMemsetInstruction ( MemsetInst * memset , AnalysisManager & AM ) {
SideEffectInfo SysYSideEffectAnalysisPass : : analyzeMemsetInstruction ( MemsetInst * memset , Function * currentFunc , AnalysisManager & AM ) {
SideEffectInfo info ;
info . type = SideEffectType : : MEMORY_WRITE ;
info . mayModifyMemory = true ;
info . isPure = false ;
// 使用缓存 的别名分析结果
// 获取函数 的别名分析结果
AliasAnalysisResult * aliasAnalysis = AM . getAnalysisResult < AliasAnalysisResult , SysYAliasAnalysisPass > ( currentFunc ) ;
if ( aliasAnalysis ) {
Value * memsetPtr = memset - > getPointer ( ) ;