dotnet / dotnet/runtime

Suboptimal codegen for `Split(int, int)` overload vs `Split(Range)`

Open
#122,124 1 comment 1 reaction 1 assignee Claimed by @EgorBo View on GitHub
area-CodeGen-coreclr
Dominant language
C#
Stars
18.3k
Forks
5.6k
PR merge metrics
PR metrics pending

Description

### Description

Title.

### Configuration

CoreCLR, main (from Godbolt)

### Codegen

Godbolt link: [here](https://godbolt.org/z/qq5r8nWax).

```csharp
using System;

static ReadOnlySpan ExtractTypeName1(string runtimeClassName)
{
const string IReferencePrefix = "Windows.Foundation.IReference<";

return runtimeClassName.StartsWith(IReferencePrefix)
? runtimeClassName.AsSpan(IReferencePrefix.Length..1)
: runtimeClassName;
}
```
```asm
Program:<$>g__ExtractTypeName1|0_0(System.String):System.ReadOnlySpan`1[char] (FullOpts):
push rbp
push rbx
push rax
lea rbp, [rsp+0x10]
mov rbx, rdi
cmp byte ptr [rbx], bl
mov rdi, rbx
mov rsi, 0x778ED0202550 ; 'Windows.Foundation.IReference<'
xor edx, edx
call [System.String:StartsWith(System.String,int):bool:this]
test eax, eax
jne SHORT G_M9911_IG04
lea rax, bword ptr [rbx+0x0C]
mov edx, dword ptr [rbx+0x08]
add rsp, 8
pop rbx
pop rbp
ret
G_M9911_IG04: ;; offset=0x0034
mov eax, dword ptr [rbx+0x08]
call [System.Range:ThrowArgumentOutOfRangeException()]
int3
```

```csharp
using System;

static ReadOnlySpan ExtractTypeName2(string runtimeClassName)
{
const string IReferencePrefix = "Windows.Foundation.IReference<";

return runtimeClassName.StartsWith(IReferencePrefix)
? runtimeClassName.AsSpan(IReferencePrefix.Length, runtimeClassName.Length - IReferencePrefix.Length - 1)
: runtimeClassName;
}
```
```asm
Program:<$>g__ExtractTypeName2|0_1(System.String):System.ReadOnlySpan`1[char] (FullOpts):
push rbp
push rbx
push rax
lea rbp, [rsp+0x10]
mov rbx, rdi
cmp byte ptr [rbx], bl
mov rdi, rbx
mov rsi, 0x778ED0202550 ; 'Windows.Foundation.IReference<'
xor edx, edx
call [System.String:StartsWith(System.String,int):bool:this]
test eax, eax
je SHORT G_M58101_IG05
mov edx, dword ptr [rbx+0x08]
lea edi, [rdx-0x1F]
mov eax, edx
mov edx, edi
add rdx, 30
cmp rax, rdx
jb SHORT G_M58101_IG07
lea rax, bword ptr [rbx+0x48]
mov rdx, rdi
add rsp, 8
pop rbx
pop rbp
ret
G_M58101_IG05: ;; offset=0x0047
lea rax, bword ptr [rbx+0x0C]
mov edx, dword ptr [rbx+0x08]
add rsp, 8
pop rbx
pop rbp
ret
G_M58101_IG07: ;; offset=0x0055
mov edi, 33
call [System.ThrowHelper:ThrowArgumentOutOfRangeException(int)]
int3
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.