DFGPrePostNumbering.h [plain text]
#ifndef DFGPrePostNumbering_h
#define DFGPrePostNumbering_h
#if ENABLE(DFG_JIT)
#include "DFGBasicBlock.h"
#include "DFGBlockMap.h"
#include <wtf/FastMalloc.h>
#include <wtf/Noncopyable.h>
namespace JSC { namespace DFG {
enum EdgeKind {
ForwardEdge,
CrossEdge,
BackEdge
};
class PrePostNumbering {
WTF_MAKE_NONCOPYABLE(PrePostNumbering);
WTF_MAKE_FAST_ALLOCATED;
public:
PrePostNumbering(Graph&);
~PrePostNumbering();
unsigned preNumber(BasicBlock* block) const { return m_map[block].m_preNumber; }
unsigned postNumber(BasicBlock* block) const { return m_map[block].m_postNumber; }
bool isStrictAncestorOf(BasicBlock* from, BasicBlock* to) const
{
return preNumber(from) < preNumber(to)
&& postNumber(from) > postNumber(to);
}
bool isAncestorOf(BasicBlock* from, BasicBlock* to) const
{
return from == to || isStrictAncestorOf(from, to);
}
bool isStrictDescendantOf(BasicBlock* from, BasicBlock* to) const
{
return isStrictAncestorOf(to, from);
}
bool isDescendantOf(BasicBlock* from, BasicBlock* to) const
{
return isAncestorOf(to, from);
}
EdgeKind edgeKind(BasicBlock* from, BasicBlock* to) const
{
if (isStrictDescendantOf(to, from))
return ForwardEdge;
if (isAncestorOf(to, from))
return BackEdge;
return CrossEdge;
}
private:
struct Numbering {
unsigned m_preNumber;
unsigned m_postNumber;
};
BlockMap<Numbering> m_map;
};
} }
namespace WTF {
void printInternal(PrintStream&, JSC::DFG::EdgeKind);
}
#endif // ENABLE(DFG_JIT)
#endif // DFGPrePostNumbering_h