def METHOD_NAME(self, node):
    false_name = dict(self.last_name)
    test = self.visit(node.test)
    self.cond_stack.append(test)
    result = flatten([self.visit(s) for s in node.body])
    true_name = dict(self.last_name)
    if node.orelse:
        self.last_name = false_name
        self.cond_stack[-1] = ast.UnaryOp(ast.Invert(),
                                          self.cond_stack[-1])
        result += flatten([self.visit(s) for s in node.orelse])
        false_name = dict(self.last_name)
    self.cond_stack.pop()
    self.last_name = {**true_name, **false_name}
    for var in self.last_name.keys():
        if var in true_name and var in false_name and \
                true_name[var] != false_name[var]:
            phi_args = [
                ast.Name(false_name[var], ast.Load()),
                ast.Name(true_name[var], ast.Load())
            ]
            self.write_name(var)
            result.append(ast.Assign(
                [ast.Name(self.last_name[var], ast.Store())],
                ast.Call(ast.Name(self.phi_name, ast.Load()), [
                    ast.List(phi_args, ast.Load()),
                    test
                ], [])))
    return result