[midend]通过编译,TODO:验证正确性
This commit is contained in:
@@ -19,8 +19,7 @@ class Instruction;
|
||||
// 它将包含 LiveIn 和 LiveOut 集合
|
||||
class LivenessAnalysisResult : public AnalysisResultBase {
|
||||
public:
|
||||
LivenessAnalysisResult(Function *F); // 构造函数,需要一个函数来关联结果
|
||||
LivenessAnalysisResult::LivenessAnalysisResult(Function *F) : AssociatedFunction(F) {}
|
||||
LivenessAnalysisResult(Function *F) : AssociatedFunction(F) {}
|
||||
|
||||
// 获取给定基本块的 LiveIn 集合
|
||||
const std::set<Value *> *getLiveIn(BasicBlock *BB) const;
|
||||
|
||||
@@ -7,9 +7,14 @@
|
||||
#include <string>
|
||||
#include <typeindex> // For std::type_index (although void* ID is more common in LLVM)
|
||||
#include <vector>
|
||||
#include "IR.h"
|
||||
|
||||
namespace sysy {
|
||||
|
||||
//前向声明
|
||||
class PassManager;
|
||||
class AnalysisManager;
|
||||
|
||||
// 抽象基类:分析结果
|
||||
class AnalysisResultBase {
|
||||
public:
|
||||
@@ -144,7 +149,7 @@ public:
|
||||
|
||||
// 确保分析遍的粒度与请求的上下文匹配
|
||||
if (analysisPass->getGranularity() == Pass::Granularity::Function) {
|
||||
analysisPass->runOnFunction(F); // 运行分析遍
|
||||
analysisPass->runOnFunction(F, *this); // 运行分析遍
|
||||
// 获取结果并缓存
|
||||
std::unique_ptr<AnalysisResultBase> result = analysisPass->getResult();
|
||||
T *specificResult = static_cast<T *>(result.get());
|
||||
@@ -166,13 +171,14 @@ public:
|
||||
cachedResults.erase({F, analysisID});
|
||||
} else {
|
||||
// 使所有函数的特定分析结果失效
|
||||
std::map<std::pair<Function *, void *>, std::unique_ptr<AnalysisResultBase>> newCachedResults;
|
||||
for (auto &pair : cachedResults) {
|
||||
if (pair.first.second != analysisID) {
|
||||
newCachedResults.insert(std::move(pair));
|
||||
// 遍历并删除匹配的元素,避免拷贝 unique_ptr
|
||||
for (auto it = cachedResults.begin(); it != cachedResults.end(); ) {
|
||||
if (it->first.second == analysisID) {
|
||||
it = cachedResults.erase(it); // erase 返回下一个元素的迭代器
|
||||
} else {
|
||||
++it;
|
||||
}
|
||||
}
|
||||
cachedResults = std::move(newCachedResults);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -190,9 +196,7 @@ public:
|
||||
PassManager() = default;
|
||||
~PassManager() = default;
|
||||
|
||||
PassManager(Module *module) : pmodule(module) {
|
||||
analysisManager = AnalysisManager(); // 初始化分析管理器
|
||||
}
|
||||
PassManager(Module *module) : pmodule(module) , analysisManager() {}
|
||||
|
||||
// 运行所有注册的遍
|
||||
bool run();
|
||||
|
||||
Reference in New Issue
Block a user