necessary.
Example:
  >>> import torch
  >>> from torch.fx.experimental.proxy_tensor import make_fx
  >>> from torch.func import functionalize
  >>>
  >>> # A function that uses mutations and views, but only on intermediate tensors.
  >>> def f(a):
  ...     b = a + 1
  ...     c = b.view(-1)
  ...     c.add_(1)
  ...     return b
  ...
  >>> inpt = torch.randn(2)
  >>>
  >>> out1 = f(inpt)
  >>> out2 = functionalize(f)(inpt)
  >>>
  >>> # semantics are the same (outputs are equivalent)
  >>> print(torch.allclose(out1, out2))
  True
  >>>
  >>> f_traced = make_fx(f)(inpt)
  >>> f_no_mutations_traced = make_fx(functionalize(f))(inpt)
  >>> f_no_mutations_and_views_traced = make_fx(functionalize(f, remove='mutations_and_views'))(inpt)
  >>>
  >>> print(f_traced.code)



  def forward(self, a_1):
      add = torch.ops.aten.add(a_1, 1);  a_1 = None
      view = torch.ops.aten.view(add, [-1])
