Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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);
  }
}