import MaoLoops; class LoopTesterApp { static function buildDiamond(cfg:MaoCFG,start:Int) { var bb0 = start; new BasicBlockEdge(cfg, bb0, bb0 + 1); new BasicBlockEdge(cfg, bb0, bb0 + 2); new BasicBlockEdge(cfg, bb0 + 1, bb0 + 3); new BasicBlockEdge(cfg, bb0 + 2, bb0 + 3); return bb0 + 3; } inline static function buildConnect(cfg:MaoCFG, start:Int, end:Int) { new BasicBlockEdge(cfg, start, end); } static function buildStraight(cfg, start, n) { for(i in 0...n) buildConnect(cfg, start + i, start + i + 1); return start + n; } static function buildBaseLoop(cfg,from) { var header = buildStraight(cfg, from, 1); var diamond1 = buildDiamond(cfg, header); var d11 = buildStraight(cfg, diamond1, 1); var diamond2 = buildDiamond(cfg, d11); var footer = buildStraight(cfg, diamond2, 1); buildConnect(cfg, diamond2, d11); buildConnect(cfg, diamond1, header); buildConnect(cfg, footer, from); footer = buildStraight(cfg, footer, 1); return footer; } static function print(inStr:String) { #if neko neko.Lib.print(inStr); #else cpp.Lib.print(inStr); #end } public static function main() { print( "Welcome to LoopTesterApp, hx edition\n"); print( "Constructing App...\n"); var cfg = new MaoCFG(); var lsg = new LoopStructureGraph(); print("Constructing Simple CFG...\n"); cfg.CreateNode(0); // top buildBaseLoop(cfg, 0); cfg.CreateNode(1); // bottom new BasicBlockEdge(cfg, 0, 2); print("15000 dummy loops\n"); for(dummyloops in 0...15000) { var lsglocal = new LoopStructureGraph(); new MaoLoops(cfg, lsglocal).run(); } print("Constructing CFG...\n"); var n = 2; for(parlooptrees in 0...10) { cfg.CreateNode(n + 1); buildConnect(cfg, 2, n + 1); n = n + 1; for(i in 0...100) { var top = n; n = buildStraight(cfg, n, 1); for(j in 0...25) { n = buildBaseLoop(cfg, n); } var bottom = buildStraight(cfg, n, 1); buildConnect(cfg, n, top); n = bottom; } buildConnect(cfg, n, 1); } print("Performing Loop Recognition\n1 Iteration\n"); var num_loops = new MaoLoops(cfg, lsg).run(); print("Another 50 iterations...\n"); var sum = 0; for(i in 0...50) { var lsg = new LoopStructureGraph(); print("."); sum += new MaoLoops(cfg, lsg).run(); } print( "\nFound " + num_loops +" loops (including artificial root node) (" + sum + ")\n"); lsg.Dump(); } }