// File: /workspace/github_c_makefile_star2_O0/Mithreindeir[P]ewcc/src/live.c
// Function: bb_creg
void bb_creg(struct bb *bb)
{
	if (!bb) return;
	if (bb->visited) return;
	bb->visited = 1;
	color_graph(bb->graph, bb->nvert, 4);
	struct ir_stmt *stmt = bb->blk;
	int ln = 0;
	while (stmt && ln < bb->len) {
		struct ir_operand *op[3] = { stmt->result, stmt->arg1, stmt->arg2 };
		for (int i = 0; i < 3; i++) {
			if (op[i] && op[i]->type == oper_reg) {
				/*Find it in the graph*/
				int idx = bb_get_treg(bb, op[i]->val.virt_reg);
				op[i]->val.virt_reg = bb->graph[idx]->color;
			}
		}
		/*Remove useless move statements*/
		if (stmt->type == stmt_move && stmt->result && stmt->arg1) {
			int v1 = stmt->result->val.virt_reg;
			int v2 = stmt->arg1->val.virt_reg;
			if (v1 == v2) {
				stmt->prev->next = stmt->next;
				stmt->next->prev = stmt->prev;
				struct ir_stmt *sv = stmt->prev;
				ir_stmt_free(stmt);
				stmt = sv;
			}
		}
		stmt = stmt->next;
		ln++;
	}
	for (int i = 0; i < bb->nsucc; i++) {
		bb_creg(bb->succ[i]);
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
cmpq $0x0, -0x8(%rbp)
jne 0x3c78
jmp 0x3e55
movq -0x8(%rbp), %rax
cmpl $0x0, 0x9c(%rax)
je 0x3c8a
jmp 0x3e55
movq -0x8(%rbp), %rax
movl $0x1, 0x9c(%rax)
movq -0x8(%rbp), %rax
movq 0x70(%rax), %rdi
movq -0x8(%rbp), %rax
movl 0x78(%rax), %esi
movl $0x4, %edx
callq 0x5640
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x10(%rbp)
movl $0x0, -0x14(%rbp)
xorl %eax, %eax
cmpq $0x0, -0x10(%rbp)
movb %al, -0x4d(%rbp)
je 0x3cdf
movl -0x14(%rbp), %eax
movq -0x8(%rbp), %rcx
cmpl 0x10(%rcx), %eax
setl %al
movb %al, -0x4d(%rbp)
movb -0x4d(%rbp), %al
testb $0x1, %al
jne 0x3ceb
jmp 0x3e22
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x28(%rbp)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x20(%rbp)
movl $0x0, -0x34(%rbp)
cmpl $0x3, -0x34(%rbp)
jge 0x3d7a
movslq -0x34(%rbp), %rax
cmpq $0x0, -0x30(%rbp,%rax,8)
je 0x3d6d
movslq -0x34(%rbp), %rax
movq -0x30(%rbp,%rax,8), %rax
cmpl $0x0, (%rax)
jne 0x3d6d
movq -0x8(%rbp), %rdi
movslq -0x34(%rbp), %rax
movq -0x30(%rbp,%rax,8), %rax
movl 0x8(%rax), %esi
callq 0x38e0
movl %eax, -0x38(%rbp)
movq -0x8(%rbp), %rax
movq 0x70(%rax), %rax
movslq -0x38(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movl 0x4(%rax), %ecx
movslq -0x34(%rbp), %rax
movq -0x30(%rbp,%rax,8), %rax
movl %ecx, 0x8(%rax)
jmp 0x3d6f
movl -0x34(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x34(%rbp)
jmp 0x3d16
movq -0x10(%rbp), %rax
cmpl $0x6, (%rax)
jne 0x3e08
movq -0x10(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0x3e08
movq -0x10(%rbp), %rax
cmpq $0x0, 0x10(%rax)
je 0x3e08
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movl 0x8(%rax), %eax
movl %eax, -0x3c(%rbp)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movl 0x8(%rax), %eax
movl %eax, -0x40(%rbp)
movl -0x3c(%rbp), %eax
cmpl -0x40(%rbp), %eax
jne 0x3e06
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rcx
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movq %rcx, 0x28(%rax)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rcx
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq %rcx, 0x20(%rax)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x48(%rbp)
movq -0x10(%rbp), %rdi
callq 0x7180
movq -0x48(%rbp), %rax
movq %rax, -0x10(%rbp)
jmp 0x3e08
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq %rax, -0x10(%rbp)
movl -0x14(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x14(%rbp)
jmp 0x3cc3
movl $0x0, -0x4c(%rbp)
movl -0x4c(%rbp), %eax
movq -0x8(%rbp), %rcx
cmpl 0x38(%rcx), %eax
jge 0x3e55
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movslq -0x4c(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
callq 0x3c60
movl -0x4c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x4c(%rbp)
jmp 0x3e29
addq $0x50, %rsp
popq %rbp
retq
nopl (%rax,%rax)