dotnet / dotnet/fsharp

Span IL gen produces 2 get_Item calls for span[i] <- span[i] + 1

Open
#16,245 0 comments 1 reaction 0 assignees View on GitHub
Area-Compiler-CodeGen Feature Improvement
Dominant language
F#
Stars
4.3k
Forks
876
Avg merge
4d 22h
Merged PRs (30d)
144

Description

The issue is that 2 ```System.Span`1::get_Item(int32)``` method calls are generated, while simply adding 1 to a byte value.
This can lead to suboptimal results in tight loops.

**Repro steps**

F# good & bad codegen examples

https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA0AbEAzAzmgFxAEsMAfCABxgDsACAZQE9cCYBbAWACgra6AYgwAWAQyiUAdADlRBYgDcYASRpsoVHjwDENCAHdx9AEQBOY1u48MMAnWI0MDmPZpgFdABQI6IOsCZYbAAeAH0APgBKOgBeOh9guHi6AGo6ABlRGgBzAFdRbJgABShidmJ5JVxJAHFaGFKwAHkaGEsbOwcnVrpWUTAAa1EMDAgwYIByUTp9YX4pv1yadiyCmAATcK8bHIJhPwcCaL8GSizJ0S2Ynjpbug66Sli6WUrigihJPsHh0fGprY7bJ7OhkLavRTvT4ECAANQgxHWRQ+Nzup3OAM8lDQ91owOEkUslgA2sEAKJqKBMIoItThAC61lsdBWDjo4myuFiqNuDzYrAAjCczjRggE2FdegR+kMRmM6AKAAzKxU83F2fkEABMwvO4pgku+sr+CpVqu4dzoauw0Hsrjoiskkk1Ask6TxIKSAro6wgastLuJxHpdESdEDwdSCtyTDV1ttxHtjudMFYWrdHuEdC9Pr9Fstdwc7joADJNVqg4yrPnbmrzZagA==

Also, C# version added for reference.

https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA0AXEBLANgHwAEAmARgFgAoQgZgAIS6BhOgbyrs4fsJToFkAFAEo2HLhIDKABwCGAOwA8wAJ4YYAPjoZZAc10wAJgAUIAZwxMIAV3kY6AXjoXZYANazcuCGDqr1dADapAAMAPohkQC6ANziEpwAZtB0ggBuslB02I50ITHZdIp0oRGRBdgA1JXC8QnslAlcdU2cOvpGphZWthiB2FHVcY2tAL5UdeOUo0A==

**Expected behavior**

Load the value, add 1 to it, push it back.

**Actual behavior**

Get item 2 times, load object / store object etc.

**Known workarounds**

```let inline incv (x : byref<_>) = x <- x + LanguagePrimitives.GenericOne```

Use ```incv &span[i]``` in loop body

**Related information**

Reproduced in .NET 8 RC2

Noticed it while working on https://github.com/jinyus/related_post_gen/pull/413

If this is nonsense, please close it.

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.