// File: /workspace/github_c_makefile_star2_O0/oridb[P]mc/mi/cfg.c
// Function: mkcfg
Cfg *
mkcfg(Node *fn, Node **nl, size_t nn)
{
	Cfg *cfg;
	Bb *pre, *post;
	Bb *bb, *targ;
	Node *a, *b;
	static int nextret;
	char buf[32];
	size_t i;

	cfg = zalloc(sizeof(Cfg));
	cfg->fn = fn;
	cfg->lblmap = mkht(strhash, streq);
	pre = mkbb(cfg);
	bb = mkbb(cfg);
	for (i = 0; i < nn; i++) {
		switch (nl[i]->type) {
		case Nexpr:
			if (islabel(nl[i]))
				bb = addlabel(cfg, bb, nl, i, nl[i]->loc);
			else if (addnode(cfg, bb, nl[i]))
				bb = mkbb(cfg);
			break;
			break;
		case Ndecl:
			break;
		default:
			die("Invalid node type %s in mkcfg", nodestr[nl[i]->type]);
		}
	}
	post = mkbb(cfg);
	bprintf(buf, sizeof buf, ".Lret%d", nextret++);
	label(cfg, mklbl(fn->loc, buf), post);

	cfg->start = pre;
	cfg->end = post;
	bsput(pre->succ, cfg->bb[1]->id);
	bsput(cfg->bb[1]->pred, pre->id);
	bsput(cfg->bb[cfg->nbb - 2]->succ, post->id);
	bsput(post->pred, cfg->bb[cfg->nbb - 2]->id);

	for (i = 0; i < cfg->nfixjmp; i++) {
		bb = cfg->fixblk[i];
		switch (exprop(cfg->fixjmp[i])) {
		case Ojmp:
			a = cfg->fixjmp[i]->expr.args[0];
			b = NULL;
			break;
		case Ocjmp:
			a = cfg->fixjmp[i]->expr.args[1];
			b = cfg->fixjmp[i]->expr.args[2];
			break;
		case Oret:
			a = mklbl(cfg->fixjmp[i]->loc, cfg->end->lbls[0]);
			b = NULL;
			break;
		default:
			die("Bad jump fix thingy");
			break;
		}
		if (a) {
			targ = htget(cfg->lblmap, lblstr(a));
			if (!targ)
				die("No bb with label \"%s\"", lblstr(a));
			bsput(bb->succ, targ->id);
			bsput(targ->pred, bb->id);
		}
		if (b) {
			targ = htget(cfg->lblmap, lblstr(b));
			if (!targ)
				die("No bb with label \"%s\"", lblstr(b));
			bsput(bb->succ, targ->id);
			bsput(targ->pred, bb->id);
		}
	}
        if (debugopt['C'])
            dumpcfg(cfg, stdout);
	trim(cfg);
	return cfg;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xa0, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movl $0x58, %edi
callq 0x48160
movq %rax, -0x20(%rbp)
movq -0x8(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, (%rax)
leaq 0x93c9(%rip), %rdi      # 0x497e0
leaq 0x9592(%rip), %rsi      # 0x499b0
callq 0x48fe0
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x30(%rax)
movq -0x20(%rbp), %rdi
callq 0x40890
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rdi
callq 0x40890
movq %rax, -0x38(%rbp)
movq $0x0, -0x78(%rbp)
movq -0x78(%rbp), %rax
cmpq -0x18(%rbp), %rax
jae 0x4052f
movq -0x10(%rbp), %rax
movq -0x78(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movl 0x8(%rax), %eax
movl %eax, -0x7c(%rbp)
subl $0x8, %eax
je 0x40481
jmp 0x40477
movl -0x7c(%rbp), %eax
subl $0xb, %eax
je 0x404f0
jmp 0x404f2
movq -0x10(%rbp), %rax
movq -0x78(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
callq 0x40910
cmpl $0x0, %eax
je 0x404c1
movq -0x20(%rbp), %rdi
movq -0x38(%rbp), %rsi
movq -0x10(%rbp), %rdx
movq -0x78(%rbp), %rcx
movq -0x10(%rbp), %rax
movq -0x78(%rbp), %r8
movq (%rax,%r8,8), %rax
movq (%rax), %r8
callq 0x40990
movq %rax, -0x38(%rbp)
jmp 0x404ee
movq -0x20(%rbp), %rdi
movq -0x38(%rbp), %rsi
movq -0x10(%rbp), %rax
movq -0x78(%rbp), %rcx
movq (%rax,%rcx,8), %rdx
callq 0x40aa0
cmpl $0x0, %eax
je 0x404ec
movq -0x20(%rbp), %rdi
callq 0x40890
movq %rax, -0x38(%rbp)
jmp 0x404ee
jmp 0x4051c
jmp 0x4051c
movq -0x10(%rbp), %rax
movq -0x78(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movl 0x8(%rax), %eax
movl %eax, %ecx
leaq 0x3c2b6(%rip), %rax     # 0x7c7c0
movq (%rax,%rcx,8), %rsi
leaq 0x141af(%rip), %rdi     # 0x546c4
movb $0x0, %al
callq 0x1df20
jmp 0x4051e
movq -0x78(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x78(%rbp)
jmp 0x40450
movq -0x20(%rbp), %rdi
callq 0x40890
movq %rax, -0x30(%rbp)
leaq -0x70(%rbp), %rdi
movl 0x3d83a(%rip), %ecx     # 0x7dd80
movl %ecx, %eax
addl $0x1, %eax
movl %eax, 0x3d82f(%rip)     # 0x7dd80
movl $0x20, %esi
leaq 0x14185(%rip), %rdx     # 0x546e2
movb $0x0, %al
callq 0x4a230
movq -0x20(%rbp), %rax
movq %rax, -0x88(%rbp)
movq -0x8(%rbp), %rax
leaq -0x70(%rbp), %rsi
movq (%rax), %rdi
callq 0x2fbe0
movq -0x88(%rbp), %rdi
movq %rax, %rsi
movq -0x30(%rbp), %rdx
callq 0x40bb0
movq -0x28(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x30(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x28(%rbp), %rax
movq 0x30(%rax), %rdi
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
movslq (%rax), %rsi
callq 0x48a50
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
movq 0x28(%rax), %rdi
movq -0x28(%rbp), %rax
movslq (%rax), %rsi
callq 0x48a50
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x20(%rbp), %rcx
movq 0x20(%rcx), %rcx
subq $0x2, %rcx
movq (%rax,%rcx,8), %rax
movq 0x30(%rax), %rdi
movq -0x30(%rbp), %rax
movslq (%rax), %rsi
callq 0x48a50
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rdi
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x20(%rbp), %rcx
movq 0x20(%rcx), %rcx
subq $0x2, %rcx
movq (%rax,%rcx,8), %rax
movslq (%rax), %rsi
callq 0x48a50
movq $0x0, -0x78(%rbp)
movq -0x78(%rbp), %rax
movq -0x20(%rbp), %rcx
cmpq 0x40(%rcx), %rax
jae 0x4084c
movq -0x20(%rbp), %rax
movq 0x48(%rax), %rax
movq -0x78(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0x38(%rbp)
movq -0x20(%rbp), %rax
movq 0x38(%rax), %rax
movq -0x78(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
callq 0x2f210
movl %eax, %ecx
movl %ecx, -0x8c(%rbp)
subl $0x2f, %eax
je 0x40700
jmp 0x40684
movl -0x8c(%rbp), %eax
subl $0x30, %eax
je 0x406a1
jmp 0x40691
movl -0x8c(%rbp), %eax
subl $0x3e, %eax
je 0x406c6
jmp 0x40735
movq -0x20(%rbp), %rax
movq 0x38(%rax), %rax
movq -0x78(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq 0x50(%rax), %rax
movq (%rax), %rax
movq %rax, -0x48(%rbp)
movq $0x0, -0x50(%rbp)
jmp 0x40743
movq -0x20(%rbp), %rax
movq 0x38(%rax), %rax
movq -0x78(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq 0x50(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x48(%rbp)
movq -0x20(%rbp), %rax
movq 0x38(%rax), %rax
movq -0x78(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq 0x50(%rax), %rax
movq 0x10(%rax), %rax
movq %rax, -0x50(%rbp)
jmp 0x40743
movq -0x20(%rbp), %rax
movq 0x38(%rax), %rax
movq -0x78(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq -0x20(%rbp), %rcx
movq 0x18(%rcx), %rcx
movq 0x8(%rcx), %rcx
movq (%rcx), %rsi
movq (%rax), %rdi
callq 0x2fbe0
movq %rax, -0x48(%rbp)
movq $0x0, -0x50(%rbp)
jmp 0x40743
leaq 0x13fae(%rip), %rdi     # 0x546ea
movb $0x0, %al
callq 0x1df20
cmpq $0x0, -0x48(%rbp)
je 0x407be
movq -0x20(%rbp), %rax
movq 0x30(%rax), %rax
movq %rax, -0x98(%rbp)
movq -0x48(%rbp), %rdi
callq 0x30710
movq -0x98(%rbp), %rdi
movq %rax, %rsi
callq 0x49490
movq %rax, -0x40(%rbp)
cmpq $0x0, -0x40(%rbp)
jne 0x40796
movq -0x48(%rbp), %rdi
callq 0x30710
movq %rax, %rsi
leaq 0x13f6f(%rip), %rdi     # 0x546fe
movb $0x0, %al
callq 0x1df20
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rdi
movq -0x40(%rbp), %rax
movslq (%rax), %rsi
callq 0x48a50
movq -0x40(%rbp), %rax
movq 0x28(%rax), %rdi
movq -0x38(%rbp), %rax
movslq (%rax), %rsi
callq 0x48a50
cmpq $0x0, -0x50(%rbp)
je 0x40839
movq -0x20(%rbp), %rax
movq 0x30(%rax), %rax
movq %rax, -0xa0(%rbp)
movq -0x50(%rbp), %rdi
callq 0x30710
movq -0xa0(%rbp), %rdi
movq %rax, %rsi
callq 0x49490
movq %rax, -0x40(%rbp)
cmpq $0x0, -0x40(%rbp)
jne 0x40811
movq -0x50(%rbp), %rdi
callq 0x30710
movq %rax, %rsi
leaq 0x13ef4(%rip), %rdi     # 0x546fe
movb $0x0, %al
callq 0x1df20
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rdi
movq -0x40(%rbp), %rax
movslq (%rax), %rsi
callq 0x48a50
movq -0x40(%rbp), %rax
movq 0x28(%rax), %rdi
movq -0x38(%rbp), %rax
movslq (%rax), %rsi
callq 0x48a50
jmp 0x4083b
movq -0x78(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x78(%rbp)
jmp 0x4063a
leaq 0x3c4ad(%rip), %rax     # 0x7cd00
cmpb $0x0, 0x43(%rax)
je 0x4086c
movq -0x20(%rbp), %rdi
movq 0x1e76c(%rip), %rax     # 0x5efd0
movq (%rax), %rsi
callq 0x40bf0
movq -0x20(%rbp), %rdi
callq 0x40310
movq -0x20(%rbp), %rax
addq $0xa0, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)