code: def optimizeTemporariesAllocation(ast):
      
      nodes = [n for n in ast.postorderWalk() if n.reg.temporary]
      users_of = dict((n.reg, set()) for n in nodes)
  
      node_regs = dict((n, set(c.reg for c in n.children if c.reg.temporary))
                       for n in nodes)
      if nodes and nodes[-1] is not ast:
          nodes_to_check = nodes + [ast]
      else:
          nodes_to_check = nodes
      for n in nodes_to_check:
          for c in n.children:
              if c.reg.temporary:
                  users_of[c.reg].add(n)
  
      unused = dict([(tc, set()) for tc in scalar_constant_kinds])
      for n in nodes:
          for c in n.children:
              reg = c.reg
              if reg.temporary:
                  users = users_of[reg]
                  users.discard(n)
                  if not users:
                      unused[reg.node.astKind].add(reg)
          if unused[n.astKind]:
              reg = unused[n.astKind].pop()
              users_of[reg] = users_of[n.reg]
              n.reg = reg
docs: Attempt to minimize the number of temporaries needed, by
      reusing old ones.