-
WEi authored3e45aa1b
#ifndef DOMFRONTIERPASS_H
#define DOMFRONTIERPASS_H
#include"ir.h"
#include"domPass.h"
#include<set>
#include<map>
class DomFrontierPass
{
public:
std::map<irBlock*, std::set<irBlock*>*>* domFrontier = new std::map<irBlock*, std::set<irBlock*>*>;
DomFrontierPass(Meth* meth, DomPass* dom)
{
for (irBlock* block : *(meth->blocks))
domFrontier->insert(std::make_pair(block, new std::set<irBlock*>()));
for (irBlock* block : *(meth->blocks))
{
if (block->incoming->size() < 2) continue;
irBlock* topIdom = dom->getIdom(block);
for (irBlock* predecessor : *(block->incoming))
{
irBlock* runner = predecessor;
while (runner != topIdom)
{
domFrontier->find(runner)->second->insert(block);
runner = dom->getIdom(runner);
}
}
}
}
std::set<irBlock*>* getDomFrontier(irBlock* block)
{
if (domFrontier->find(block) == domFrontier->end()) return nullptr;
else return (domFrontier->find(block)->second);
}
};
#endif