Allow i64ptr to create both MIR ref type and MIR ptr type

Signed-off-by: linxin <linxinyq@foxmail.com>
Change-Id: Ie25fc51d3dd11444fc510555b141d5a5eecdb0a9
This commit is contained in:
linxin 2024-04-17 09:24:10 +08:00
parent 6f2d77f581
commit c64f94abde
9 changed files with 113 additions and 59 deletions

View File

@ -226,6 +226,7 @@ private:
LoopDesc *GetOrCreateLoopDesc(BB &headBB);
void SetLoopParent4BB(const BB &bb, LoopDesc &loopDesc);
void SetExitBBs(LoopDesc &loop) const;
void GenerateLoop(BB *bb);
void ProcessBB(BB &bb);
};

View File

@ -725,6 +725,7 @@ public:
Type *strType;
Type *i64PtrType;
Type *i64RefType;
Type *i64RefRefType;
private:
Stmt &CreateSwitchInternal(Type *type, Expr cond, BB &defaultBB, std::vector<std::pair<int64_t, BB *>> &cases);

View File

@ -788,12 +788,18 @@ void CGCFG::UnreachCodeAnalysis() const
void CGCFG::FindWillExitBBs(BB *bb, std::set<BB *, BBIdCmp> *visitedBBs)
{
if (visitedBBs->count(bb) != 0) {
return;
}
visitedBBs->insert(bb);
for (BB *predbb : bb->GetPreds()) {
FindWillExitBBs(predbb, visitedBBs);
std::queue<BB *> allBBs;
allBBs.push(bb);
while (!allBBs.empty()) {
BB *curBB = allBBs.front();
allBBs.pop();
if (visitedBBs->count(curBB) != 0) {
continue;
}
visitedBBs->insert(curBB);
for (auto *predBB : curBB->GetPreds()) {
allBBs.push(predBB);
}
}
}

View File

@ -225,18 +225,29 @@ void DomAnalysis::ComputeIterDomFrontiers()
uint32 DomAnalysis::ComputeDtPreorder(const BB &bb, uint32 &num)
{
DEBUG_ASSERT(num < dtPreOrder.size(), "index out of range in Dominance::ComputeDtPreorder");
dtPreOrder[num] = bb.GetId();
dtDfn[bb.GetId()] = num;
uint32 maxDtDfnOut = num;
++num;
// {BB, parent/self BB id}
using Node = std::pair<const BB *, uint32>;
std::stack<Node> allNodes;
allNodes.emplace(Node{&bb, bb.GetId()});
for (uint32 k : domChildren[bb.GetId()]) {
maxDtDfnOut = ComputeDtPreorder(*bbVec[k], num);
while (!allNodes.empty()) {
DEBUG_ASSERT(num < dtPreOrder.size(), "index out of range in Dominance::ComputeDtPreorder");
Node curNode = allNodes.top();
allNodes.pop();
auto curBBId = curNode.first->GetId();
dtPreOrder[num] = curBBId;
dtDfn[curBBId] = num;
++num;
dtDfnOut[curNode.second] = num;
if (domChildren[curBBId].empty()) {
dtDfnOut[curBBId] = num;
continue;
}
for (size_t idx = domChildren[curBBId].size(); idx > 0; --idx) {
allNodes.emplace(Node{bbVec[domChildren[curBBId][idx - 1]], curBBId});
}
}
dtDfnOut[bb.GetId()] = maxDtDfnOut;
return maxDtDfnOut;
return num;
}
// true if b1 dominates b2

View File

@ -2131,14 +2131,20 @@ void CGFunc::GenerateCfiPrologEpilog()
void CGFunc::TraverseAndClearCatchMark(BB &bb)
{
/* has bb been visited */
if (bb.GetInternalFlag3()) {
return;
}
bb.SetIsCatch(false);
bb.SetInternalFlag3(1);
for (auto succBB : bb.GetSuccs()) {
TraverseAndClearCatchMark(*succBB);
std::queue<BB *> allBBs;
allBBs.emplace(&bb);
while (!allBBs.empty()) {
BB *curBB = allBBs.front();
allBBs.pop();
/* has bb been visited */
if (curBB->GetInternalFlag3()) {
continue;
}
curBB->SetIsCatch(false);
curBB->SetInternalFlag3(1);
for (auto *succBB : curBB->GetSuccs()) {
allBBs.emplace(succBB);
}
}
}

View File

@ -89,18 +89,13 @@ void LoopAnalysis::SetExitBBs(LoopDesc &loop) const
}
}
void LoopAnalysis::ProcessBB(BB &bb)
void LoopAnalysis::GenerateLoop(BB *bb)
{
if (&bb == cgFunc.GetCommonExitBB()) {
return;
}
// generate loop based on the dom information
for (auto *pred : bb.GetPreds()) {
if (!dom.Dominate(bb, *pred)) {
for (auto *pred : bb->GetPreds()) {
if (!dom.Dominate(*bb, *pred)) {
continue;
}
auto *loop = GetOrCreateLoopDesc(bb);
auto *loop = GetOrCreateLoopDesc(*bb);
loop->InsertBackEdges(*pred);
std::list<BB*> bodyList;
bodyList.push_back(pred);
@ -108,7 +103,7 @@ void LoopAnalysis::ProcessBB(BB &bb)
auto *curBB = bodyList.front();
bodyList.pop_front();
// skip bb or if it has already been dealt with
if (curBB == &bb || loop->Has(*curBB)) {
if (curBB == bb || loop->Has(*curBB)) {
continue;
}
SetLoopParent4BB(*curBB, *loop);
@ -116,13 +111,28 @@ void LoopAnalysis::ProcessBB(BB &bb)
bodyList.push_back(curPred);
}
}
SetLoopParent4BB(bb, *loop);
SetLoopParent4BB(*bb, *loop);
SetExitBBs(*loop);
}
}
// process dom tree
for (auto domChildBBId : dom.GetDomChildren(bb.GetId())) {
ProcessBB(*cgFunc.GetBBFromID(domChildBBId));
void LoopAnalysis::ProcessBB(BB &entryBB)
{
std::queue<BB *> allBBs;
allBBs.emplace(&entryBB);
while (!allBBs.empty()) {
BB *bb = allBBs.front();
allBBs.pop();
if (bb == cgFunc.GetCommonExitBB()) {
continue;
}
// generate loop based on the dom information
GenerateLoop(bb);
// process dom tree
for (auto domChildBBId : dom.GetDomChildren(bb->GetId())) {
allBBs.emplace(cgFunc.GetBBFromID(domChildBBId));
}
}
}

View File

@ -76,6 +76,7 @@ LMIRBuilder::LMIRBuilder(Module &module_) : mirBuilder(*module_.GetMIRBuilder())
strType = CreatePtrType(u8Type); // u8PtrType
i64PtrType = CreatePtrType(i64Type);
i64RefType = CreateRefType(i64Type);
i64RefRefType = CreateRefType(i64RefType);
}
void LMIRBuilder::DumpIRToFile(const std::string fileName)

View File

@ -231,15 +231,23 @@ public:
size_t UnionFind(size_t idx)
{
std::stack<size_t> allIdxs;
allIdxs.emplace(idx);
size_t pIdx = parentIdx_[idx];
if (pIdx == idx) {
return idx;
while (pIdx != allIdxs.top()) {
allIdxs.emplace(pIdx);
pIdx = parentIdx_[pIdx];
}
size_t unionFindSetRoot = UnionFind(pIdx);
if (semiDom_[minIdx_[idx]] > semiDom_[minIdx_[pIdx]]) {
minIdx_[idx] = minIdx_[pIdx];
size_t unionFindSetRoot = pIdx;
while (!allIdxs.empty()) {
if (semiDom_[minIdx_[allIdxs.top()]] > semiDom_[minIdx_[pIdx]]) {
minIdx_[allIdxs.top()] = minIdx_[pIdx];
}
parentIdx_[allIdxs.top()] = unionFindSetRoot;
pIdx = allIdxs.top();
allIdxs.pop();
}
return parentIdx_[idx] = unionFindSetRoot;
return unionFindSetRoot;
}
void Merge(size_t fatherIdx, size_t sonIdx)

View File

@ -20,6 +20,27 @@
#include "ecmascript/compiler/verifier.h"
namespace panda::ecmascript::kungfu {
size_t UnionFind(std::vector<size_t> &semiDom, std::vector<size_t> &parent, std::vector<size_t> &minIdx, size_t idx)
{
std::stack<size_t> allIdxs;
allIdxs.emplace(idx);
size_t pIdx = parent[idx];
while (pIdx != allIdxs.top()) {
allIdxs.emplace(pIdx);
pIdx = parent[pIdx];
}
size_t unionFindSetRoot = pIdx;
while (!allIdxs.empty()) {
if (semiDom[minIdx[allIdxs.top()]] > semiDom[minIdx[pIdx]]) {
minIdx[allIdxs.top()] = minIdx[pIdx];
}
parent[allIdxs.top()] = unionFindSetRoot;
pIdx = allIdxs.top();
allIdxs.pop();
}
return unionFindSetRoot;
}
void Scheduler::CalculateDominatorTree(const Circuit *circuit,
std::vector<GateRef>& bbGatesList,
std::unordered_map<GateRef, size_t> &bbGatesAddrToIdx,
@ -63,20 +84,9 @@ void Scheduler::CalculateDominatorTree(const Circuit *circuit,
std::vector<size_t> parent(bbGatesList.size());
std::iota(parent.begin(), parent.end(), 0);
std::vector<size_t> minIdx(bbGatesList.size());
std::function<size_t(size_t)> unionFind = [&] (size_t idx) -> size_t {
size_t pIdx = parent[idx];
if (pIdx == idx) {
return idx;
}
size_t unionFindSetRoot = unionFind(pIdx);
if (semiDom[minIdx[idx]] > semiDom[minIdx[pIdx]]) {
minIdx[idx] = minIdx[pIdx];
}
return parent[idx] = unionFindSetRoot;
};
auto merge = [&] (size_t fatherIdx, size_t sonIdx) -> void {
size_t parentFatherIdx = unionFind(fatherIdx);
size_t parentSonIdx = unionFind(sonIdx);
size_t parentFatherIdx = UnionFind(semiDom, parent, minIdx, fatherIdx);
size_t parentSonIdx = UnionFind(semiDom, parent, minIdx, sonIdx);
parent[parentSonIdx] = parentFatherIdx;
};
std::iota(semiDom.begin(), semiDom.end(), 0);
@ -90,13 +100,13 @@ void Scheduler::CalculateDominatorTree(const Circuit *circuit,
if (preGateIdx < idx) {
semiDom[idx] = std::min(semiDom[idx], preGateIdx);
} else {
unionFind(preGateIdx);
UnionFind(semiDom, parent, minIdx, preGateIdx);
semiDom[idx] = std::min(semiDom[idx], semiDom[minIdx[preGateIdx]]);
}
}
}
for (const auto &succDomIdx : semiDomTree[idx]) {
unionFind(succDomIdx);
UnionFind(semiDom, parent, minIdx, succDomIdx);
if (idx == semiDom[minIdx[succDomIdx]]) {
immDom[succDomIdx] = idx;
} else {