'Run the following passes over Numba IR:
- canonicalize the CFG
- emit explicit `del` instructions for variables
- compute lifetime of variables
- compute generator info (if function is a generator function)'

def run(self):

    self.func_ir.blocks = transforms.canonicalize_cfg(self.func_ir.blocks)
    vlt = VariableLifetime(self.func_ir.blocks)
    self.func_ir.variable_lifetime = vlt
    self._insert_var_dels()
    bev = analysis.compute_live_variables(vlt.cfg, self.func_ir.blocks, vlt.usedefs.defmap, vlt.deadmaps.combined)
    for (offset, ir_block) in self.func_ir.blocks.items():
        self.func_ir.block_entry_vars[ir_block] = bev[offset]
    if self.func_ir.is_generator:
        self.func_ir.generator_info = GeneratorInfo()
        self._compute_generator_info()
    else:
        self.func_ir.generator_info = None
