// File: luooofan[P]hblzbd_compiler/src/Pass/reach_define.cpp
// Function: ReachDefine::Run()
void ReachDefine::Run() {
  auto m = dynamic_cast<IRModule *>(*m_);

  MyAssert(nullptr != m);

  for (auto func : m->func_list_) {
    for (auto bb : func->bb_list_) {
      for (auto ir : bb->ir_list_) {
        if (ir->res_.type_ == ir::Opn::Type::Var && ir->res_.scope_id_ != 0) {
          std::string var_name = ir->res_.name_ + "_#" + std::to_string(ir->res_.scope_id_);
          if (0 == func->def_pre_var_.count(var_name)) {
            std::unordered_set<ir::IR *> temp_set;
            temp_set.insert(ir);
            func->def_pre_var_.emplace(var_name, temp_set);
          } else {
            func->def_pre_var_[var_name].insert(ir);
          }
        }
      }
      // print_map(func->def_pre_var_);
    }
  }

  for (auto func : m->func_list_) {
    // std::cout << "analysis func:" << func->name_ << std::endl;
    Run4Func(func);
  }

  // 计算每个程序点处的使用-定值链
  GetUseDefChain(m);

#ifdef PRINT_USE_DEF_CHAIN
  print_use_def_chain(m);
#endif

#ifdef PRINT_SET
  print_set(m);
#endif
}

// Assembly:
subq $0x1c8, %rsp            # imm = 0x1C8
movq %rdi, 0x1c0(%rsp)
movq 0x1c0(%rsp), %rax
movq %rax, 0x50(%rsp)
movq 0x8(%rax), %rax
movq (%rax), %rax
movq %rax, 0x58(%rsp)
cmpq $0x0, %rax
je 0xefa91
movq 0x58(%rsp), %rdi
leaq 0x5ab5e(%rip), %rsi     # 0x14a5d8
leaq 0x5b5b7(%rip), %rdx     # 0x14b038
xorl %eax, %eax
movl %eax, %ecx
callq 0x8410
movq %rax, 0x48(%rsp)
jmp 0xefa9a
xorl %eax, %eax
movq %rax, 0x48(%rsp)
jmp 0xefa9a
movq 0x48(%rsp), %rax
movq %rax, 0x1b8(%rsp)
xorl %eax, %eax
cmpq 0x1b8(%rsp), %rax
jne 0xefb0a
movq 0x5c52e(%rip), %rdi     # 0x14bfe8
leaq 0xa637(%rip), %rsi      # 0xfa0f8
callq 0x8330
movq %rax, %rdi
leaq 0xe0c4(%rip), %rsi      # 0xfdb94
callq 0x8330
movq %rax, %rdi
leaq 0xb90b(%rip), %rsi      # 0xfb3ea
callq 0x8330
movq %rax, %rdi
movl $0x41, %esi
callq 0x8650
movq %rax, %rdi
movq 0x5c485(%rip), %rsi     # 0x14bf80
callq 0x8380
movl $0xff, %edi
callq 0x8460
movq 0x1b8(%rsp), %rax
addq $0x28, %rax
movq %rax, 0x1b0(%rsp)
movq 0x1b0(%rsp), %rdi
callq 0x1d3c0
movq %rax, 0x1a8(%rsp)
movq 0x1b0(%rsp), %rdi
callq 0x1d240
movq %rax, 0x1a0(%rsp)
leaq 0x1a8(%rsp), %rdi
leaq 0x1a0(%rsp), %rsi
callq 0x49210
testb $0x1, %al
jne 0xefb66
jmp 0xeff0d
leaq 0x1a8(%rsp), %rdi
callq 0x49250
movq (%rax), %rax
movq %rax, 0x198(%rsp)
movq 0x198(%rsp), %rax
addq $0x30, %rax
movq %rax, 0x190(%rsp)
movq 0x190(%rsp), %rdi
callq 0x1cc40
movq %rax, 0x188(%rsp)
movq 0x190(%rsp), %rdi
callq 0x1cac0
movq %rax, 0x180(%rsp)
leaq 0x188(%rsp), %rdi
leaq 0x180(%rsp), %rsi
callq 0x492e0
testb $0x1, %al
jne 0xefbda
jmp 0xefef9
leaq 0x188(%rsp), %rdi
callq 0x49320
movq (%rax), %rax
movq %rax, 0x178(%rsp)
movq 0x178(%rsp), %rax
addq $0x8, %rax
movq %rax, 0x170(%rsp)
movq 0x170(%rsp), %rdi
callq 0x1b070
movq %rax, 0x168(%rsp)
movq 0x170(%rsp), %rdi
callq 0x1aeb0
movq %rax, 0x160(%rsp)
leaq 0x168(%rsp), %rdi
leaq 0x160(%rsp), %rsi
callq 0x493c0
testb $0x1, %al
jne 0xefc4e
jmp 0xefee5
leaq 0x168(%rsp), %rdi
callq 0x1b4d0
movq (%rax), %rax
movq %rax, 0x158(%rsp)
movq 0x158(%rsp), %rax
cmpl $0x0, 0x88(%rax)
jne 0xefed1
movq 0x158(%rsp), %rax
cmpl $0x0, 0xb0(%rax)
je 0xefed1
movq 0x158(%rsp), %rsi
addq $0x90, %rsi
leaq 0xde3c(%rip), %rdx      # 0xfdae2
leaq 0x118(%rsp), %rdi
callq 0xc720
movq 0x158(%rsp), %rax
movl 0xb0(%rax), %esi
leaq 0xf8(%rsp), %rdi
callq 0xc7b0
jmp 0xefcd0
leaq 0x138(%rsp), %rdi
leaq 0x118(%rsp), %rsi
leaq 0xf8(%rsp), %rdx
callq 0xc630
jmp 0xefcef
leaq 0xf8(%rsp), %rdi
callq 0x8728
leaq 0x118(%rsp), %rdi
callq 0x8728
movq 0x198(%rsp), %rdi
addq $0x60, %rdi
leaq 0x138(%rsp), %rsi
callq 0xf26e0
movq %rax, 0x40(%rsp)
jmp 0xefd29
movq 0x40(%rsp), %rcx
xorl %eax, %eax
cmpq %rcx, %rax
jne 0xefe5b
leaq 0xb0(%rsp), %rdi
movq %rdi, 0x28(%rsp)
callq 0x18d90
movq 0x28(%rsp), %rdi
leaq 0x158(%rsp), %rsi
callq 0xf2710
movb %dl, 0x37(%rsp)
movq %rax, 0x38(%rsp)
jmp 0xefd68
movb 0x37(%rsp), %al
movq 0x38(%rsp), %rcx
movq %rcx, 0xa0(%rsp)
movb %al, 0xa8(%rsp)
movq 0x198(%rsp), %rdi
addq $0x60, %rdi
leaq 0x138(%rsp), %rsi
leaq 0xb0(%rsp), %rdx
callq 0xf2760
movb %dl, 0x1f(%rsp)
movq %rax, 0x20(%rsp)
jmp 0xefdac
movb 0x1f(%rsp), %al
movq 0x20(%rsp), %rcx
movq %rcx, 0x90(%rsp)
movb %al, 0x98(%rsp)
leaq 0xb0(%rsp), %rdi
callq 0x494f0
jmp 0xefeb0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf0(%rsp)
movl %eax, 0xec(%rsp)
jmp 0xefe0d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf0(%rsp)
movl %eax, 0xec(%rsp)
leaq 0xf8(%rsp), %rdi
callq 0x8728
leaq 0x118(%rsp), %rdi
callq 0x8728
jmp 0xeff98
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf0(%rsp)
movl %eax, 0xec(%rsp)
jmp 0xefebf
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf0(%rsp)
movl %eax, 0xec(%rsp)
leaq 0xb0(%rsp), %rdi
callq 0x494f0
jmp 0xefebf
movq 0x198(%rsp), %rdi
addq $0x60, %rdi
leaq 0x138(%rsp), %rsi
callq 0xf27b0
movq %rax, 0x10(%rsp)
jmp 0xefe7b
movq 0x10(%rsp), %rdi
leaq 0x158(%rsp), %rsi
callq 0xf2710
movb %dl, 0x7(%rsp)
movq %rax, 0x8(%rsp)
jmp 0xefe98
movb 0x7(%rsp), %al
movq 0x8(%rsp), %rcx
movq %rcx, 0x80(%rsp)
movb %al, 0x88(%rsp)
leaq 0x138(%rsp), %rdi
callq 0x8728
jmp 0xefed1
leaq 0x138(%rsp), %rdi
callq 0x8728
jmp 0xeff98
jmp 0xefed3
leaq 0x168(%rsp), %rdi
callq 0x49460
jmp 0xefc30
jmp 0xefee7
leaq 0x188(%rsp), %rdi
callq 0x49330
jmp 0xefbbc
jmp 0xefefb
leaq 0x1a8(%rsp), %rdi
callq 0x49260
jmp 0xefb48
movq 0x1b8(%rsp), %rax
addq $0x28, %rax
movq %rax, 0x78(%rsp)
movq 0x78(%rsp), %rdi
callq 0x1d3c0
movq %rax, 0x70(%rsp)
movq 0x78(%rsp), %rdi
callq 0x1d240
movq %rax, 0x68(%rsp)
leaq 0x70(%rsp), %rdi
leaq 0x68(%rsp), %rsi
callq 0x49210
testb $0x1, %al
jne 0xeff51
jmp 0xeff7e
leaq 0x70(%rsp), %rdi
callq 0x49250
movq 0x50(%rsp), %rdi
movq (%rax), %rax
movq %rax, 0x60(%rsp)
movq 0x60(%rsp), %rsi
callq 0xeffb0
leaq 0x70(%rsp), %rdi
callq 0x49260
jmp 0xeff3c
movq 0x50(%rsp), %rdi
movq 0x1b8(%rsp), %rsi
callq 0xf0830
addq $0x1c8, %rsp            # imm = 0x1C8
retq
movq 0xf0(%rsp), %rdi
callq 0x8670
nopw %cs:(%rax,%rax)