def default(self, n, live):
     n.live = live
     if isinstance(n, ArithInstr):
         return live | free_vars(n.lhs) \
                  | reduce(lambda a,b: a | b,
                           [free_vars(r) for r in n.rhs],
                           set([]))
     else:
         return Visitor.default(self, n, live)
 def visitIndirectCallX86(self, n, live):
     n.live = live | free_vars(n.funptr)
     return n.live
 def visitReturn(self, n, live):
     n.live = free_vars(n.value)
     return n.live
 def visitSetIfNotEqInstr(self, n, live):
     n.live = live
     return live - free_vars(n.lhs)
 def visitIntMoveZeroExtendInstr(self, n, live):
     n.live = live
     return (live - free_vars(n.lhs)) | free_vars(n.rhs[0])
 def visitIntNotInstr(self, n, live):
     n.live = live
     return live | free_vars(n.lhs)
 def visitWhile(self, n, live):
     n.live = live
     test_free = free_vars(n.test)
     body_live = self.dispatch(n.body, live | test_free)
     body_live = self.dispatch(n.body, live | test_free | body_live)
     return live | test_free | body_live
 def visitIf(self, n, live):
     n.live = live
     then_live = self.dispatch(n.tests[0][1], live)
     else_live = self.dispatch(n.else_, live)
     return then_live | else_live | free_vars(n.tests[0][0])
 def visitSetIfEqInstr(self, n, live):
     n.live = live - free_vars(n.lhs)
     return n.live