Repository: pytorch
Issue: Behavior change of exported_program.run_decompositions
Labels: oncall: pt2,oncall: export

### 🐛 Describe the bug

Hello. I've been working with aten graph and one of the test uses `copy_` operator. The version that works well is `2.5.0.dev20240828+cpu` nightly version. But, recently, after updating a torch with latest one (`2.6.0.dev20241015+cpu`), there seems to be a behavior change.

```python
class SimpleCopy(torch.nn.Module):
    def __init__(self):
        super().__init__()

    def forward(self, dst, src):
        dst.copy_(src)
        return dst

    def get_example_inputs(self):
        return (torch.randn(5, 5), torch.randn(5, 5))

mod = SimpleCopy()
with torch.no_grad():
    exported_program = export(mod.eval(), mod.get_example_inputs())
print (exported_program) # before
exported_program = exported_program.run_decompositions()
print (exported_program) # after
```

### 2.5.0.dev20240828+cpu

```bash
=== before ===
ExportedProgram:
    class GraphModule(torch.nn.Module):
        def forward(self, dst: "f32[5, 5]", src: "f32[5, 5]"):
             # File: test/modules/single/op/copy.py:9 in forward, code: dst.copy_(src)
            copy: "f32[5, 5]" = torch.ops.aten.copy.default(dst, src);  dst = src = None
            return (copy, copy)
            
Graph signature: ExportGraphSignature(input_specs=[InputSpec(kind=<InputKind.USER_INPUT: 1>, arg=TensorArgument(name='dst'), target=None, persistent=None), InputSpec(kind=<InputKind.USER_INPUT: 1>, arg=TensorArgument(name='src'), target=None, persistent=None)], output_specs=[OutputSpec(kind=<OutputKind.USER_INPUT_MUTATION: 6>, arg=TensorArgument(name='copy'), target='dst'), OutputSpec(kind=<OutputKind.USER_OUTPUT: 1>, arg=TensorArgument(name='copy'), target=None)])
Range constraints: {}

=== after ===
ExportedProgram:
    class GraphModule(torch.nn.Module):
        def forward(self, dst: "f32[5, 5]", src: "f32[5, 5]"):
             # File: test/modules/single/op/copy.py:9 in forward, code: dst.copy_(src)
            copy: "f32[5, 5]" = torch.ops.aten.copy.default(dst, src);  dst = src = None
            return (copy, copy)
            
Graph signature: ExportGraphSignature(input_specs=[InputSpec(kind=<InputKind.USER_INPUT: 1>, arg=TensorArgument(name='dst'), target=None, persistent=None), InputSpec(kind=<InputKind.USER_INPUT: 1>, arg=TensorArgument(name='src'), target=None, persistent=None)], output_specs=[OutputSpec(kind=<OutputKind.USER_INPUT_MUTATION: 6>, arg=TensorArgument(name='copy'), target='dst'), OutputSpec(kind=<OutputKind.USER_OUTPUT: 1>, arg=TensorArgument(name='copy'), target=None)])
Range constraints: {}
```

### 2.6.0.dev20241015+cpu

```bash
=== before ===
ExportedProgram:
    class GraphModule(torch.nn.Module):
        def forward(self, dst: "f32[5, 5]", src: "f32[5, 5]"):
             # File: test/modules/single/op/copy.py:9 in forward, code: dst.copy_(src)
            copy: "f32[5, 5]" = torch.ops.aten.copy.default(dst, src);  dst = src = None
            return (copy, copy)
            
Graph signature: ExportGraphSignature(input_specs=[InputSpec(kind=<InputKind.USER_INPUT: 1>, arg=TensorArgument(name='dst'), target=None, persistent=None), InputSpec(kind=<InputKind.USER_INPUT: 1>, arg=TensorArgument(name='src'), target=None, persistent=None)], output_specs=[OutputSpec(kind=<OutputKind.USER_INPUT_MUTATION: 6>, arg=TensorArgument(name='copy'), target='dst'), OutputSpec(kind=<OutputKind.USER_OUTPUT: 1>, arg=TensorArgument(name='copy'), target=None)])
Range constraints: {}

/home/seongwoo/circle-exir/.venv/lib/python3.10/site-packages/torch/export/exported_program.py:1076: UserWarning: This API is deprecated and soon will be removed. Please look at the docstring to see how to preserve an operator.
  warnings.warn(
=== after ===
ExportedProgram:
    class GraphModule(torch.nn.Module):
        def forward(self, dst: "f32[5, 5]", src: "f32[5, 5]"):
             # File: test/modules/single/op/copy.py:9 in forward, code: dst.copy_(src)
            copy: "f32[5, 5]" = torch.ops.aten.copy.default(dst, src);  src = None
            
            # No stacktrace found for following nodes
            copy_1: "f32[5, 5]" = torch.ops.aten.copy.default(dst, copy);  dst = copy = None
            return (copy_1, copy_1)
            
Graph signature: ExportGraphSignature(input_specs=[InputSpec(kind=<InputKind.USER_INPUT: 1>, arg=TensorArgument(name='dst'), target=None, persistent=None), InputSpec(kind=<InputKind.USER_INPUT: 1>, arg=TensorArgument(name='src'), target=None, persistent=None)], output_specs=[OutputSpec(kind=<OutputKind.USER_INPUT_MUTATION: 6>, arg=TensorArgument(name='copy_1'), target='dst'), OutputSpec(kind=<OutputKind.USER_OUTPUT: 1>, arg=TensorArgument(name='copy_1'), target=None)])
Range constraints: {}
```

---

Anyway, this is not related with above bug directly but just curiosity, is there any document for `torch.ops.aten.copy.default`? There are two copy ops: `torch.ops.aten.copy.default` and `torch.ops.aten.copy_.default`. And, `torch.ops.aten.copy.default(t1, t2)` returns a new tensor that contains `t2` data. What is this for? Why doesn't it return dst data instead of src one? 

### Versions

```bash
Versions of relevant libraries:
[pip3] flake8==6.0.0
[pip3] flake8-breakpoint==1.1.0
[pip3] flake8-bugbear==23.6.5
[pip3] flake8-comprehensions==3.12.0
[pip3] flake8-import-order==0.18.2
[pip3] flake8-plugin-utils==1.3.3
[pip3] flake8-pyi==23.5.0
[pip3] mypy==1.9.0
[pip3] mypy-extensions==1.0.0
[pip3] numpy==2.1.2
[pip3] torch==2.5.0.dev20240828+cpu
[pip3] torchvision==0.20.0.dev20240828+cpu
[conda] Could not collect

## after update
# ..
[pip3] torch==2.6.0.dev20241016+cpu
[pip3] torchvision==0.20.0.dev20241016+cpu
# ..
```

cc @ezyang @chauhang @penguinwu @avikchaudhuri @gmagogsfm @zhxchen17 @tugsbayasgalan @angelayi @suo @ydwu4