2025-05-27 02:25:39 +03:00
|
|
|
#pragma once
|
|
|
|
|
|
2025-05-30 13:00:40 +03:00
|
|
|
#include <vector>
|
|
|
|
|
#include <map>
|
|
|
|
|
#include <unordered_set>
|
|
|
|
|
#include <string>
|
2025-05-27 02:25:39 +03:00
|
|
|
|
2025-06-04 13:08:38 +03:00
|
|
|
#include "graph_loops.h"
|
2025-05-27 02:25:39 +03:00
|
|
|
#include "../CFGraph/CFGraph.h"
|
|
|
|
|
|
|
|
|
|
class Region : public SAPFOR::BasicBlock {
|
|
|
|
|
public:
|
|
|
|
|
Region() { header = nullptr; }
|
|
|
|
|
|
|
|
|
|
Region(SAPFOR::BasicBlock block) : SAPFOR::BasicBlock::BasicBlock(block) { header = nullptr; }
|
|
|
|
|
|
|
|
|
|
Region(LoopGraph* loop, const std::vector<SAPFOR::BasicBlock*>& Blocks);
|
|
|
|
|
|
|
|
|
|
Region* getHeader() { return header; }
|
|
|
|
|
|
|
|
|
|
void setHeader(Region* region) { header = region; }
|
|
|
|
|
|
|
|
|
|
std::unordered_set<Region*>& getBasickBlocks() { return basickBlocks; }
|
|
|
|
|
|
|
|
|
|
void addBasickBlocks(Region* region) { basickBlocks.insert(region); }
|
|
|
|
|
|
|
|
|
|
const std::unordered_set<Region*>& getPrevRegions() { return prevRegions; }
|
|
|
|
|
|
|
|
|
|
std::unordered_set<Region*> getNextRegions() { return nextRegions; }
|
|
|
|
|
|
|
|
|
|
void addPrevRegion(Region* region) { prevRegions.insert(region); }
|
|
|
|
|
|
|
|
|
|
void addNextRegion(Region* region) { nextRegions.insert(region); }
|
|
|
|
|
|
|
|
|
|
void replaceInPrevRegions(Region* source, Region* destination)
|
|
|
|
|
{
|
|
|
|
|
prevRegions.erase(destination);
|
|
|
|
|
prevRegions.insert(source);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void replaceInNextRegions(Region* source, Region* destination)
|
|
|
|
|
{
|
|
|
|
|
nextRegions.erase(destination);
|
|
|
|
|
nextRegions.insert(source);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::unordered_set<Region*> getSubRegions() { return subRegions; }
|
|
|
|
|
|
|
|
|
|
void addSubRegions(Region* region) { subRegions.insert(region); }
|
|
|
|
|
|
|
|
|
|
ArrayAccessingIndexes array_def, array_use, array_out, array_in, array_priv;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
std::unordered_set<Region*> subRegions, basickBlocks;
|
|
|
|
|
/*next Region which is BB for current BB Region*/
|
|
|
|
|
std::unordered_set<Region*> nextRegions;
|
|
|
|
|
/*prev Regions which is BBs for current BB Region*/
|
|
|
|
|
std::unordered_set<Region*> prevRegions;
|
|
|
|
|
Region* header;
|
|
|
|
|
};
|