Skip to content

JIT: inefficient multidimensional array access vis Jit32 (and in general) #8569

Description

@AndyAyersMS

RyuJit fails to optimize multidimensional array indices and misses some cases that Jit32 is able to optimize. In the following code example,

class M
{
    public static int Example(int[,] a, int b)
    {
        int r = 0;
        for (int i = 0; i < a.GetLength(1); i++)
        {
            r += a[b, i] + a[b, i];
        }
        return r;
    }

    public static int Main()
    {
        int[,] a = new int[10,10];
        a[3,3] = 3;
        a[3,7] = 7;
        int r = Example(a, 3);
        return r == 20 ? 100 : 0;
    }
}

Jit32 is able to CSE the addressing done in the a[b,i] references in Example (though it does not CSE the array fetch itself). RyuJit does not CSE anything in the loop.

Neither jit recognizes a.GetLength as being a loop invariant, or that the initial bounds check r[b, ] is likewise a loop invariant, or inline and decompose GetLength despite inlining the very similar bounds check and element addressing logic. Neither jit is able to optimize away the bounds checks in Main where the array size and indices are known.

category:cq
theme:md-arrays
skill-level:expert
cost:large

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

JitUntriagedCLR JIT issues needing additional triagearea-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIenhancementProduct code improvement that does NOT require public API changes/additionsoptimizationtenet-performancePerformance related issue

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions