Commit 41472c4
Fix bug in LowerCallMemmove (#123907)
Might fix (but not sure) #123748
`LowerCallMemmove` was initially written to inline `SpanHelpers.Memmove`
into something that guarantees proper non-aliased move (load all data
into separate registers first, then save them all at once) as opposite
to what normal `GT_STORE_BLK` does - it's paired with
`genCodeForMemmove`. That's why we sort of try to Lower BLK/STORE_BLK by
hands there.
Later, `CORINFO_HELP_MEMCPY` was added as well (typical scenario:
`cpblk` IL code (`Unsafe.CopyBlocksUnaligned`) with the length that
becomes a constant in a late phase) and since it doesn't require the
memmove semantics, we used `GenTreeBlk::BlkOpKindUnroll`, but in that
case we either have to replace the call into a pre-Lower shape and call
Lower on srcBlk+storeBlk since we're no longer paired with
`genCodeForMemmove`, or just use the same memmove mode.
`memmove` mode is more expensive for LSRA and doesn't support addressing
modes, but it seems that `CORINFO_HELP_MEMCPY` is rarely used.
Example of a changed codegen:
```cs
static void Test(ref byte a, ref byte b, uint len)
{
if (len == 200)
{
Unsafe.CopyBlockUnaligned(ref a, ref b, len);
}
}
```
Was:
```asm
vmovdqu32 zmm0, zmmword ptr [rdx]
vmovdqu32 zmmword ptr [rcx], zmm0
vmovdqu32 zmm0, zmmword ptr [rdx+0x40]
vmovdqu32 zmmword ptr [rcx+0x40], zmm0
vmovdqu32 zmm0, zmmword ptr [rdx+0x80]
vmovdqu32 zmmword ptr [rcx+0x80], zmm0
mov rax, qword ptr [rdx+0xC0]
mov qword ptr [rcx+0xC0], rax
```
Now:
```asm
vmovdqu32 zmm0, zmmword ptr [rdx]
vmovdqu32 zmm1, zmmword ptr [rdx+0x40]
vmovdqu32 zmm2, zmmword ptr [rdx+0x80]
vmovdqu xmm3, xmmword ptr [rdx+0xB8]
vmovdqu32 zmmword ptr [rcx], zmm0
vmovdqu32 zmmword ptr [rcx+0x40], zmm1
vmovdqu32 zmmword ptr [rcx+0x80], zmm2
vmovdqu xmmword ptr [rcx+0xB8], xmm3
```
No
[diffs](https://dev.azure.com/dnceng-public/public/_build/results?buildId=1287687&view=ms.vss-build-web.run-extensions-tab)
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>1 parent 23c8cd9 commit 41472c4
1 file changed
+6
-6
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2468 | 2468 | | |
2469 | 2469 | | |
2470 | 2470 | | |
| 2471 | + | |
| 2472 | + | |
2471 | 2473 | | |
2472 | 2474 | | |
2473 | 2475 | | |
| |||
2477 | 2479 | | |
2478 | 2480 | | |
2479 | 2481 | | |
2480 | | - | |
2481 | | - | |
2482 | | - | |
2483 | | - | |
2484 | | - | |
| 2482 | + | |
| 2483 | + | |
2485 | 2484 | | |
2486 | 2485 | | |
2487 | 2486 | | |
| |||
2499 | 2498 | | |
2500 | 2499 | | |
2501 | 2500 | | |
2502 | | - | |
| 2501 | + | |
| 2502 | + | |
2503 | 2503 | | |
2504 | 2504 | | |
2505 | 2505 | | |
| |||
0 commit comments