Span IL gen produces 2 get_Item calls for span[i] <- span[i] + 1
- 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
Assessment
This issue has not been assessed yet.