// File: /workspace/github_c_makefile_star2_O0/c-zhou[P]oatk/graph.c
// Function: asmg_cleanup
static void asmg_cleanup(asmg_t *g) 
{
    uint64_t i, j, n, *v_idx;
    asmg_arc_t *a;

    // delete vtx
    n = g->n_vtx;
    MYMALLOC(v_idx, n);
    MYBONE(v_idx, n);
    for (i = 0; i < n; ++i)
        if (g->vtx[i].del)
            asmg_vtx_destroy(&g->vtx[i]);
    for (i = j = 0; i < n; ++i) {
        if (g->vtx[i].del) {
            // update vtx number
            --g->n_vtx;
            continue;
        }
        if (j < i)
            // copy vtx_i to vtx_j position
            g->vtx[j] = g->vtx[i];
        // recode new vtx index
        v_idx[i] = j++;
    }
    MYREALLOC(g->vtx, g->n_vtx);
    g->m_vtx = g->n_vtx;

    // delete arc
    n = g->n_arc;
    for (i = j = 0; i < n; ++i) {
        a = &g->arc[i];
        if (g->arc[i].del ||
                v_idx[a->v>>1] == UINT64_MAX ||
                v_idx[a->w>>1] == UINT64_MAX) {
            // update arc number
            --g->n_arc;
            continue;
        }
        if (j < i)
            // copy arc_i to arc_j position
            g->arc[j] = g->arc[i];
        ++j;
    }
    MYREALLOC(g->arc, g->n_arc);
    g->m_arc = g->n_arc;

    // update arc vtx
    n = g->n_arc;
    for (i = 0; i < n; ++i) {
        a = &g->arc[i];
        a->v = v_idx[a->v>>1] << 1 | (a->v&1);
        a->w = v_idx[a->w>>1] << 1 | (a->w&1);
    }

    free(v_idx);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rdi
shlq $0x3, %rdi
callq 0x2320
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rdi
movq -0x20(%rbp), %rdx
shlq $0x3, %rdx
movl $0xff, %esi
callq 0x21f0
movq $0x0, -0x10(%rbp)
movq -0x10(%rbp), %rax
cmpq -0x20(%rbp), %rax
jae 0x20263
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0x28, -0x10(%rbp), %rcx
addq %rcx, %rax
movl 0x20(%rax), %eax
shrl $0x1e, %eax
andl $0x1, %eax
cmpl $0x0, %eax
je 0x20253
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdi
imulq $0x28, -0x10(%rbp), %rax
addq %rax, %rdi
callq 0x1fa60
jmp 0x20255
movq -0x10(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x10(%rbp)
jmp 0x20216
movq $0x0, -0x18(%rbp)
movq $0x0, -0x10(%rbp)
movq -0x10(%rbp), %rax
cmpq -0x20(%rbp), %rax
jae 0x2030f
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0x28, -0x10(%rbp), %rcx
addq %rcx, %rax
movl 0x20(%rax), %eax
shrl $0x1e, %eax
andl $0x1, %eax
cmpl $0x0, %eax
je 0x202af
movq -0x8(%rbp), %rax
movq (%rax), %rcx
addq $-0x1, %rcx
movq %rcx, (%rax)
jmp 0x202fe
movq -0x18(%rbp), %rax
cmpq -0x10(%rbp), %rax
jae 0x202e3
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdi
imulq $0x28, -0x18(%rbp), %rax
addq %rax, %rdi
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rsi
imulq $0x28, -0x10(%rbp), %rax
addq %rax, %rsi
movl $0x28, %edx
callq 0x22c0
movq -0x18(%rbp), %rdx
movq %rdx, %rax
addq $0x1, %rax
movq %rax, -0x18(%rbp)
movq -0x28(%rbp), %rax
movq -0x10(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movq -0x10(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x10(%rbp)
jmp 0x20273
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x8(%rbp), %rax
imulq $0x28, (%rax), %rsi
callq 0x2360
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x8(%rbp), %rax
movq (%rax), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x20(%rbp)
movq $0x0, -0x18(%rbp)
movq $0x0, -0x10(%rbp)
movq -0x10(%rbp), %rax
cmpq -0x20(%rbp), %rax
jae 0x20428
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
imulq $0x30, -0x10(%rbp), %rcx
addq %rcx, %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
imulq $0x30, -0x10(%rbp), %rcx
addq %rcx, %rax
movl 0x20(%rax), %eax
shrl $0x1e, %eax
andl $0x1, %eax
cmpl $0x0, %eax
jne 0x203c5
movq -0x28(%rbp), %rax
movq -0x30(%rbp), %rcx
movq (%rcx), %rcx
shrq %rcx
cmpq $-0x1, (%rax,%rcx,8)
je 0x203c5
movq -0x28(%rbp), %rax
movq -0x30(%rbp), %rcx
movq 0x8(%rcx), %rcx
shrq %rcx
cmpq $-0x1, (%rax,%rcx,8)
jne 0x203d7
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x18(%rax)
jmp 0x20417
movq -0x18(%rbp), %rax
cmpq -0x10(%rbp), %rax
jae 0x2040b
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rdi
imulq $0x30, -0x18(%rbp), %rax
addq %rax, %rdi
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rsi
imulq $0x30, -0x10(%rbp), %rax
addq %rax, %rsi
movl $0x30, %edx
callq 0x22c0
movq -0x18(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x18(%rbp)
movq -0x10(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x10(%rbp)
jmp 0x2035a
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rdi
movq -0x8(%rbp), %rax
imulq $0x30, 0x18(%rax), %rsi
callq 0x2360
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x20(%rbp)
movq $0x0, -0x10(%rbp)
movq -0x10(%rbp), %rax
cmpq -0x20(%rbp), %rax
jae 0x204f3
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
imulq $0x30, -0x10(%rbp), %rcx
addq %rcx, %rax
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rax
movq -0x30(%rbp), %rcx
movq (%rcx), %rcx
shrq %rcx
movq (%rax,%rcx,8), %rcx
shlq %rcx
movq -0x30(%rbp), %rax
movq (%rax), %rax
andq $0x1, %rax
orq %rax, %rcx
movq -0x30(%rbp), %rax
movq %rcx, (%rax)
movq -0x28(%rbp), %rax
movq -0x30(%rbp), %rcx
movq 0x8(%rcx), %rcx
shrq %rcx
movq (%rax,%rcx,8), %rcx
shlq %rcx
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rax
andq $0x1, %rax
orq %rax, %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x10(%rbp)
jmp 0x2046d
movq -0x28(%rbp), %rdi
callq 0x2060
addq $0x30, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)