diff options
Diffstat (limited to 'src/relooper/test.cpp')
-rw-r--r-- | src/relooper/test.cpp | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/src/relooper/test.cpp b/src/relooper/test.cpp new file mode 100644 index 00000000..0d029216 --- /dev/null +++ b/src/relooper/test.cpp @@ -0,0 +1,195 @@ + +#include "Relooper.h" + +int main() { + char buffer[10000]; + + if (1) { + Relooper::SetOutputBuffer(buffer, sizeof(buffer)); + + printf("\n\n-- If pattern --\n\n"); + + Block *b_a = new Block("// block A\n"); + Block *b_b = new Block("// block B\n"); + Block *b_c = new Block("// block C\n"); + + 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"); + r.Render(); + + puts(buffer); + } + + if (1) { + Relooper::SetOutputBuffer(buffer, sizeof(buffer)); + + printf("\n\n-- If-else pattern --\n\n"); + + Block *b_a = new Block("// block A\n"); + Block *b_b = new Block("// block B\n"); + Block *b_c = new Block("// block C\n"); + Block *b_d = new Block("// block D\n"); + + 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"); + r.Render(); + + puts(buffer); + } + + if (1) { + Relooper::SetOutputBuffer(buffer, sizeof(buffer)); + + printf("\n\n-- Loop + tail pattern --\n\n"); + + Block *b_a = new Block("// block A\nvar check = maybe();\n"); + Block *b_b = new Block("// block B\n"); + Block *b_c = new Block("// block C\n"); + + 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"); + r.Render(); + + puts(buffer); + } + + if (1) { + Relooper::SetOutputBuffer(buffer, sizeof(buffer)); + + printf("\n\n-- Loop with phi to head \n\n"); + + void *block_map[10000]; + void *rl = rl_new_relooper(); + void *b1 = rl_new_block("// code 1"); + block_map[1] = b1; + rl_relooper_add_block(rl, block_map[1]); + void *b2 = rl_new_block("// code 2"); + block_map[2] = b2; + rl_relooper_add_block(rl, block_map[2]); + void *b3 = rl_new_block("// code 3"); + block_map[3] = b3; + rl_relooper_add_block(rl, block_map[3]); + void *b4 = rl_new_block("// code 4"); + block_map[4] = b4; + rl_relooper_add_block(rl, block_map[4]); + void *b5 = rl_new_block("// code 5"); + block_map[5] = b5; + rl_relooper_add_block(rl, block_map[5]); + void *b6 = rl_new_block("// code 6"); + block_map[6] = b6; + rl_relooper_add_block(rl, block_map[6]); + void *b7 = rl_new_block("// code 7"); + 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"); + + Block *b_a = new Block("// block A...................................................................................................\n"); + Block *b_b = new Block("// block B...................................................................................................\n"); + Block *b_c = new Block("// block C...................................................................................................\n"); + Block *b_d = new Block("// block D\n"); // small and splittable! + Block *b_e = new Block("// block E\n"); + + 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"); + r.Render(); + + puts(buffer); + } +/* + if (1) { + Relooper::SetOutputBuffer(buffer, sizeof(buffer)); + + printf("\n\n-- Unbalanced with a dead end --\n\n"); + + Block *b_a = new Block("// block A\n"); + Block *b_b = new Block("// block B\n"); + Block *b_c = new Block("// block C\n"); + Block *b_d = new Block("// block D\n"); + + b_a->AddBranchTo(b_b, "check == 10"); + b_a->AddBranchTo(b_c, NULL); + + 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"); + r.Render(); + + puts(buffer); + } +*/ +} + |