JIT: Strength reduction should be able to reason about field accesses on top of arrays

Open
#108,706 1 comment 1 reaction 1 assignee View on GitHub

@jakobbotsch is already working on this.

Since Oct 9, 2024.

Assessment

This issue has not been assessed yet.

Description

area-CodeGen-coreclr Priority:3

From BenchmarksGame.Fasta:
https://github.com/dotnet/performance/blob/88a140a2234569c20129615ffea668ed857fc374/src/benchmarks/micro/runtime/BenchmarksGame/fasta-1.cs#L225-L233

Codegen on main:

...
G_M57319_IG03:  ;; offset=0x000B
       xor      edx, edx
       align    [3 bytes for IG04]
						;; size=5 bbWeight=0.25 PerfScore 0.12
G_M57319_IG04:  ;; offset=0x0010
       mov      r8, rdx
       vaddsd   xmm0, xmm0, qword ptr [rcx+r8+0x18]
       vmovsd   qword ptr [rcx+r8+0x18], xmm0
       add      rdx, 16
       dec      eax
       jne      SHORT G_M57319_IG04
						;; size=25 bbWeight=4 PerfScore 39.00
G_M57319_IG05:  ;; offset=0x0029
       ret      
						;; size=1 bbWeight=1 PerfScore 1.00

Codegen with #105267:

...
G_M57319_IG03:  ;; offset=0x000B
       add      rcx, 16
       align    [1 bytes for IG04]
						;; size=5 bbWeight=0.25 PerfScore 0.12
G_M57319_IG04:  ;; offset=0x0010
       vaddsd   xmm0, xmm0, qword ptr [rcx+0x08]
       vmovsd   qword ptr [rcx+0x08], xmm0
       add      rcx, 16
       dec      eax
       jne      SHORT G_M57319_IG04
						;; size=18 bbWeight=4 PerfScore 38.00
G_M57319_IG05:  ;; offset=0x0022
       ret      
						;; size=1 bbWeight=1 PerfScore 1.00

which is definitely an improvement, but we should be able to fold in the +0x08 offset that comes from the access of the p field. Currently we give up while trying to prove that rcx+0x08 is a valid managed byref in all iterations of the loop.

Dominant language
C#
Stars
18.3k
Forks
5.6k
PR merge metrics
PR metrics pending

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from dotnet/runtime

All issues in dotnet/runtime

Similar issues

More C# issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.