int main() { #define SIZE (10*1024*1024) char *buffer = (char*)malloc(SIZE); Relooper::SetOutputBuffer(buffer, SIZE); Block *b0 = new Block("print('entry'); var label; var state; var decisions = [3, 3, 4, 1, 2, 1, 2, 4, 4, 4, 2, 3, 3, 1, 2]; var index = 0; function check() { if (index == decisions.length) throw 'HALT'; return decisions[index++] }"); Block *b1 = new Block("print(1); state = check();"); Block *b2 = new Block("print(2); state = check();"); Block *b3 = new Block("print(3); state = check();"); Block *b4 = new Block("print(4); state = check();"); b0->AddBranchTo(b1, NULL); b1->AddBranchTo(b3, NULL); b2->AddBranchTo(b1, NULL); b3->AddBranchTo(b4, NULL); b4->AddBranchTo(b4, NULL); Relooper r; r.AddBlock(b0); r.AddBlock(b1); r.AddBlock(b2); r.AddBlock(b3); r.AddBlock(b4); r.Calculate(b0); printf("\n\n"); r.Render(); puts(buffer); return 1; }
int main() { Debugging::On = 0; char *buffer = (char*)malloc(10*1024*1024); Relooper::SetOutputBuffer(buffer); Block *b0 = new Block("print('entry'); var label; var state; var decisions = [133, 98, 134, 143, 162, 187, 130, 87, 91, 49, 102, 47, 9, 132, 179, 176, 157, 25, 64, 161, 57, 107, 16, 167, 185, 45, 191, 180, 23, 131]; var index = 0; function check() { if (index == decisions.length) throw 'HALT'; return decisions[index++] }"); Block *b1 = new Block("print(1); state = check();"); Block *b2 = new Block("print(2); state = check();"); Block *b3 = new Block("print(3); state = check();"); Block *b4 = new Block("print(4); state = check();"); Block *b5 = new Block("print(5); state = check();"); Block *b6 = new Block("print(6); state = check();"); Block *b7 = new Block("print(7); state = check();"); Block *b8 = new Block("print(8); state = check();"); Block *b9 = new Block("print(9); state = check();"); b0->AddBranchTo(b7, NULL); b1->AddBranchTo(b4, "state % 2 == 0"); b1->AddBranchTo(b6, NULL); b2->AddBranchTo(b1, NULL); b3->AddBranchTo(b3, NULL); b4->AddBranchTo(b2, NULL); b5->AddBranchTo(b1, NULL); b6->AddBranchTo(b7, "state % 2 == 0"); b6->AddBranchTo(b6, NULL); b7->AddBranchTo(b8, "state % 3 == 0"); b7->AddBranchTo(b2, "state % 3 == 1"); b7->AddBranchTo(b3, NULL); b8->AddBranchTo(b4, "state % 2 == 0"); b8->AddBranchTo(b6, NULL); b9->AddBranchTo(b7, "state % 2 == 0"); b9->AddBranchTo(b8, NULL); Relooper r; r.AddBlock(b0); r.AddBlock(b1); r.AddBlock(b2); r.AddBlock(b3); r.AddBlock(b4); r.AddBlock(b5); r.AddBlock(b6); r.AddBlock(b7); r.AddBlock(b8); r.AddBlock(b9); r.Calculate(b0); printf("\n\n"); r.Render(); puts(buffer); return 1; }
int main() { #define SIZE (10*1024*1024) char *buffer = (char*)malloc(SIZE); Relooper::SetOutputBuffer(buffer, SIZE); Block *b0 = new Block("print('entry'); var label; var state; var decisions = [4, 1, 7, 2, 6, 6, 8]; var index = 0; function check() { if (index == decisions.length) throw 'HALT'; return decisions[index++] }", "the_var"); Block *b1 = new Block("print(1); state = check();", "the_var"); Block *b2 = new Block("print(2); state = check();", "the_var"); Block *b3 = new Block("print(3); state = check();", "the_var"); Block *b4 = new Block("print(4); state = check();", "the_var"); Block *b5 = new Block("print(5); state = check();", "the_var"); Block *b6 = new Block("print(6); state = check();", "the_var"); Block *b7 = new Block("print(7); state = check();", "the_var"); Block *b8 = new Block("print(8); state = check();", "the_var"); b0->AddBranchTo(b5, NULL); b1->AddBranchTo(b3, NULL); b2->AddBranchTo(b1, NULL); b3->AddBranchTo(b8, "state == 8"); b3->AddBranchTo(b1, NULL); b4->AddBranchTo(b3, "state == 3"); b4->AddBranchTo(b1, NULL); b5->AddBranchTo(b6, NULL); b6->AddBranchTo(b7, "state == 7"); b6->AddBranchTo(b1, NULL); b7->AddBranchTo(b2, NULL); b8->AddBranchTo(b4, "state == 4"); b8->AddBranchTo(b2, NULL); Relooper r; r.AddBlock(b0); r.AddBlock(b1); r.AddBlock(b2); r.AddBlock(b3); r.AddBlock(b4); r.AddBlock(b5); r.AddBlock(b6); r.AddBlock(b7); r.AddBlock(b8); r.Calculate(b0); printf("\n\n"); r.Render(); puts(buffer); return 1; }
int main() { char buffer[10000]; if (1) { Relooper::SetOutputBuffer(buffer, sizeof(buffer)); printf("\n\n-- If pattern --\n\n", "the_var"); Block *b_a = new Block("// block A\n", "the_var"); Block *b_b = new Block("// block B\n", "the_var"); Block *b_c = new Block("// block C\n", "the_var"); b_a->AddBranchTo(b_b, "check == 10", "atob();"); b_a->AddBranchTo(b_c, NULL, "atoc();"); b_b->AddBranchTo(b_c, NULL, "btoc();"); Relooper r; r.AddBlock(b_a); r.AddBlock(b_b); r.AddBlock(b_c); r.Calculate(b_a); printf("\n\n", "the_var"); r.Render(); puts(buffer); } if (1) { Relooper::SetOutputBuffer(buffer, sizeof(buffer)); printf("\n\n-- If-else pattern --\n\n", "the_var"); Block *b_a = new Block("// block A\n", "the_var"); Block *b_b = new Block("// block B\n", "the_var"); Block *b_c = new Block("// block C\n", "the_var"); Block *b_d = new Block("// block D\n", "the_var"); b_a->AddBranchTo(b_b, "check == 15"); b_a->AddBranchTo(b_c, NULL); b_b->AddBranchTo(b_d, NULL); b_c->AddBranchTo(b_d, NULL); Relooper r; r.AddBlock(b_a); r.AddBlock(b_b); r.AddBlock(b_c); r.AddBlock(b_d); r.Calculate(b_a); printf("\n\n", "the_var"); r.Render(); puts(buffer); } if (1) { Relooper::SetOutputBuffer(buffer, sizeof(buffer)); printf("\n\n-- Loop + tail pattern --\n\n", "the_var"); Block *b_a = new Block("// block A\nvar check = maybe();\n", "the_var"); Block *b_b = new Block("// block B\n", "the_var"); Block *b_c = new Block("// block C\n", "the_var"); b_a->AddBranchTo(b_b, NULL); b_b->AddBranchTo(b_a, "check == 41"); b_b->AddBranchTo(b_c, NULL); Relooper r; r.AddBlock(b_a); r.AddBlock(b_b); r.AddBlock(b_c); r.Calculate(b_a); printf("\n\n", "the_var"); r.Render(); puts(buffer); } if (1) { Relooper::SetOutputBuffer(buffer, sizeof(buffer)); printf("\n\n-- Loop with phi to head \n\n", "the_var"); void *block_map[10000]; void *rl = rl_new_relooper(); void *b1 = rl_new_block("// code 1", "the_var"); block_map[1] = b1; rl_relooper_add_block(rl, block_map[1]); void *b2 = rl_new_block("// code 2", "the_var"); block_map[2] = b2; rl_relooper_add_block(rl, block_map[2]); void *b3 = rl_new_block("// code 3", "the_var"); block_map[3] = b3; rl_relooper_add_block(rl, block_map[3]); void *b4 = rl_new_block("// code 4", "the_var"); block_map[4] = b4; rl_relooper_add_block(rl, block_map[4]); void *b5 = rl_new_block("// code 5", "the_var"); block_map[5] = b5; rl_relooper_add_block(rl, block_map[5]); void *b6 = rl_new_block("// code 6", "the_var"); block_map[6] = b6; rl_relooper_add_block(rl, block_map[6]); void *b7 = rl_new_block("// code 7", "the_var"); block_map[7] = b7; rl_relooper_add_block(rl, block_map[7]); rl_block_add_branch_to(block_map[1], block_map[2], NULL, "var $i_0 = 0;var $x_0 = 5; "); rl_block_add_branch_to(block_map[2], block_map[3], "$2", NULL); rl_block_add_branch_to(block_map[2], block_map[7], NULL, "var $x_1 = $x_0; "); rl_block_add_branch_to(block_map[3], block_map[4], "$6", NULL); rl_block_add_branch_to(block_map[3], block_map[2], NULL, "var $i_0 = $7;var $x_0 = $5; "); rl_block_add_branch_to(block_map[4], block_map[5], "$10", NULL); rl_block_add_branch_to(block_map[4], block_map[6], NULL, NULL); rl_block_add_branch_to(block_map[5], block_map[6], NULL, NULL); rl_block_add_branch_to(block_map[6], block_map[7], NULL, "var $x_1 = $13; "); rl_relooper_calculate(rl, block_map[1]); rl_relooper_render(rl); rl_delete_relooper(rl); puts(buffer); } if (1) { Relooper::SetOutputBuffer(buffer, sizeof(buffer)); printf("\n\n-- phi on split dead ends --\n\n", "the_var"); Block *b_a = new Block("// block A...................................................................................................\n", "the_var"); Block *b_b = new Block("// block B...................................................................................................\n", "the_var"); Block *b_c = new Block("// block C...................................................................................................\n", "the_var"); Block *b_d = new Block("// block D\n", "the_var"); // small and splittable! Block *b_e = new Block("// block E\n", "the_var"); b_a->AddBranchTo(b_b, "chak()", "atob();"); b_a->AddBranchTo(b_c, NULL, "atoc();"); b_b->AddBranchTo(b_d, NULL, "btod();"); b_c->AddBranchTo(b_d, NULL, "ctod2();"); Relooper r; r.AddBlock(b_a); r.AddBlock(b_b); r.AddBlock(b_c); r.AddBlock(b_d); r.AddBlock(b_e); r.Calculate(b_a); printf("\n\n", "the_var"); r.Render(); puts(buffer); } if (1) { Relooper::SetOutputBuffer(buffer, sizeof(buffer)); printf("\n\n-- Unbalanced with a dead end --\n\n", "the_var"); Block *b_a = new Block("// block A\n", "the_var"); Block *b_b = new Block("// block B\n", "the_var"); Block *b_c = new Block("return C;\n", "the_var"); Block *b_d = new Block("// block D\n", "the_var"); b_a->AddBranchTo(b_b, "check == 10"); b_a->AddBranchTo(b_c, NULL); // c is a dead end b_b->AddBranchTo(b_d, NULL); b_d->AddBranchTo(b_b, NULL); Relooper r; r.AddBlock(b_a); r.AddBlock(b_b); r.AddBlock(b_c); r.AddBlock(b_d); r.Calculate(b_a); printf("\n\n", "the_var"); r.Render(); puts(buffer); } if (1) { Relooper::SetOutputBuffer(buffer, sizeof(buffer)); printf("\n\n-- if (expensive || expensive2) X else Y; Z --\n\n", "the_var"); Block *b_a = new Block("// block A\n", "the_var"); Block *b_b = new Block("// block B\n", "the_var"); Block *b_c = new Block("// block C;\n", "the_var"); Block *b_d = new Block("// block D\n", "the_var"); Block *b_e = new Block("// block E\n", "the_var"); Block *b_f = new Block("// block F\n", "the_var"); b_a->AddBranchTo(b_c, "expensive()"); b_a->AddBranchTo(b_b, NULL); b_b->AddBranchTo(b_c, "expensive2()"); b_b->AddBranchTo(b_d, NULL); b_c->AddBranchTo(b_e, NULL); b_d->AddBranchTo(b_e, NULL); b_e->AddBranchTo(b_f, NULL); b_f->AddBranchTo(b_e, NULL); Relooper r; r.AddBlock(b_a); r.AddBlock(b_b); r.AddBlock(b_c); r.AddBlock(b_d); r.AddBlock(b_e); r.AddBlock(b_f); r.Calculate(b_a); printf("\n\n", "the_var"); r.Render(); puts(buffer); } if (1) { Relooper::SetOutputBuffer(buffer, sizeof(buffer)); printf("\n\n-- conditional loop --\n\n", "the_var"); Block *b_a = new Block("// block A\n", "the_var"); Block *b_b = new Block("// block B\n", "the_var"); Block *b_c = new Block("// block C\n", "the_var"); b_a->AddBranchTo(b_b, "shouldLoop()"); b_a->AddBranchTo(b_c, NULL); b_b->AddBranchTo(b_b, "moarLoop()"); b_b->AddBranchTo(b_c, NULL); Relooper r; r.AddBlock(b_a); r.AddBlock(b_b); r.AddBlock(b_c); r.Calculate(b_a); printf("\n\n", "the_var"); r.Render(); puts(buffer); } if (1) { Relooper::SetOutputBuffer(buffer, sizeof(buffer)); printf("\n\n-- If pattern, emulated --\n\n", "the_var"); Block *b_a = new Block("// block A\n", NULL); Block *b_b = new Block("// block B\n", "b_check()"); Block *b_c = new Block("// block C\n", NULL); b_a->AddBranchTo(b_b, "check == 10", "atob();"); b_a->AddBranchTo(b_c, NULL, "atoc();"); b_b->AddBranchTo(b_c, "case 17:", "btoc();"); b_b->AddBranchTo(b_a, NULL, NULL); Relooper r; r.SetEmulate(true); r.AddBlock(b_a); r.AddBlock(b_b); r.AddBlock(b_c); r.Calculate(b_a); printf("\n\n", "the_var"); r.Render(); puts(buffer); } }