// File: /workspace/github_c_makefile_star2_O0/cogbee[P]vmir-latest/src/vmir_transform.c
// Function: bb_change_branch
static void
bb_change_branch(ir_bb_t *from, ir_bb_t *to, ir_bb_t *nb, ir_function_t *f)
{
  ir_instr_t *ii;

  ii = TAILQ_LAST(&from->ib_instrs, ir_instr_queue);
  switch(ii->ii_class) {
  case IR_IC_BR:
    {
      ir_instr_br_t *b = (ir_instr_br_t *)ii;
      if(b->true_branch == to->ib_id)
        b->true_branch = nb->ib_id;

      if(b->condition.value != -1) {
        if(b->false_branch == to->ib_id)
          b->false_branch = nb->ib_id;
      }
    }
    break;
  case IR_IC_CMP_BRANCH:
    {
      ir_instr_cmp_branch_t *icb = (ir_instr_cmp_branch_t *)ii;
      if(icb->true_branch == to->ib_id)
        icb->true_branch = nb->ib_id;

      if(icb->false_branch == to->ib_id)
        icb->false_branch = nb->ib_id;
    }
    break;
  case IR_IC_SWITCH:
    {
      ir_instr_switch_t *s = (ir_instr_switch_t *)ii;
      if(s->defblock == to->ib_id)
        s->defblock = nb->ib_id;

      for(int i = 0; i < s->num_paths; i++)
        if(s->paths[i].block == to->ib_id)
          s->paths[i].block = nb->ib_id;
    }
    break;
  case IR_IC_INVOKE:
    {
      ir_instr_invoke_t *s = (ir_instr_invoke_t *)ii;
      if(s->normal_dest == to->ib_id)
        s->normal_dest = nb->ib_id;

      if(s->unwind_dest == to->ib_id)
        s->unwind_dest = nb->ib_id;
    }
    break;
  case IR_IC_RET:
    break;
  default:
    printf("Unable to transform branch for instruction class %d\n",
           ii->ii_class);
    abort();
  }

  if(ii->ii_succ != NULL) {
    free(ii->ii_succ);
    liveness_set_succ(f, ii);
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movl 0x28(%rax), %eax
decl %eax
movl %eax, %ecx
movq %rcx, -0x58(%rbp)
subl $0x18, %eax
ja 0x26e31
movq -0x58(%rbp), %rax
leaq 0x16a3a(%rip), %rcx     # 0x3d6f8
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x28(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
movl 0x60(%rax), %eax
movq -0x10(%rbp), %rcx
cmpl 0x28(%rcx), %eax
jne 0x26ced
movq -0x18(%rbp), %rax
movl 0x28(%rax), %ecx
movq -0x30(%rbp), %rax
movl %ecx, 0x60(%rax)
movq -0x30(%rbp), %rax
cmpl $-0x1, 0x58(%rax)
je 0x26d17
movq -0x30(%rbp), %rax
movl 0x64(%rax), %eax
movq -0x10(%rbp), %rcx
cmpl 0x28(%rcx), %eax
jne 0x26d15
movq -0x18(%rbp), %rax
movl 0x28(%rax), %ecx
movq -0x30(%rbp), %rax
movl %ecx, 0x64(%rax)
jmp 0x26d17
jmp 0x26e4b
movq -0x28(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rax
movl 0x6c(%rax), %eax
movq -0x10(%rbp), %rcx
cmpl 0x28(%rcx), %eax
jne 0x26d42
movq -0x18(%rbp), %rax
movl 0x28(%rax), %ecx
movq -0x38(%rbp), %rax
movl %ecx, 0x6c(%rax)
movq -0x38(%rbp), %rax
movl 0x70(%rax), %eax
movq -0x10(%rbp), %rcx
cmpl 0x28(%rcx), %eax
jne 0x26d60
movq -0x18(%rbp), %rax
movl 0x28(%rax), %ecx
movq -0x38(%rbp), %rax
movl %ecx, 0x70(%rax)
jmp 0x26e4b
movq -0x28(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rax
movl 0x60(%rax), %eax
movq -0x10(%rbp), %rcx
cmpl 0x28(%rcx), %eax
jne 0x26d8b
movq -0x18(%rbp), %rax
movl 0x28(%rax), %ecx
movq -0x40(%rbp), %rax
movl %ecx, 0x60(%rax)
movl $0x0, -0x44(%rbp)
movl -0x44(%rbp), %eax
movq -0x40(%rbp), %rcx
cmpl 0x64(%rcx), %eax
jge 0x26de7
movq -0x40(%rbp), %rax
addq $0x68, %rax
movslq -0x44(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movq -0x10(%rbp), %rcx
cmpl 0x28(%rcx), %eax
jne 0x26dda
movq -0x18(%rbp), %rax
movl 0x28(%rax), %ecx
movq -0x40(%rbp), %rax
addq $0x68, %rax
movslq -0x44(%rbp), %rdx
shlq $0x4, %rdx
addq %rdx, %rax
movl %ecx, 0x8(%rax)
jmp 0x26ddc
movl -0x44(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x44(%rbp)
jmp 0x26d92
jmp 0x26e4b
movq -0x28(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rax
movl 0x64(%rax), %eax
movq -0x10(%rbp), %rcx
cmpl 0x28(%rcx), %eax
jne 0x26e0f
movq -0x18(%rbp), %rax
movl 0x28(%rax), %ecx
movq -0x50(%rbp), %rax
movl %ecx, 0x64(%rax)
movq -0x50(%rbp), %rax
movl 0x68(%rax), %eax
movq -0x10(%rbp), %rcx
cmpl 0x28(%rcx), %eax
jne 0x26e2d
movq -0x18(%rbp), %rax
movl 0x28(%rax), %ecx
movq -0x50(%rbp), %rax
movl %ecx, 0x68(%rax)
jmp 0x26e4b
jmp 0x26e4b
movq -0x28(%rbp), %rax
movl 0x28(%rax), %esi
leaq 0x1882e(%rip), %rdi     # 0x3f66d
movb $0x0, %al
callq 0x3170
callq 0x3050
movq -0x28(%rbp), %rax
cmpq $0x0, 0x40(%rax)
je 0x26e70
movq -0x28(%rbp), %rax
movq 0x40(%rax), %rdi
callq 0x3030
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x26e80
addq $0x60, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)