Issue 135860
Summary Missed optimization on in-order RISC-V
Labels new issue
Assignees
Reporter chadaustin
    I've observed situations where clang and rustc will generate suboptimal code for in-order RISC-V cores that support multiple parallel loads.

In general, as many clobbered temporary registers as possible should be used to hoist loads before any instructions that use them.

C:

```C
void inc2(int* __restrict a, int* __restrict b, int* __restrict c, int* __restrict d)
{
    (*a)++;
    (*b)++;
    (*c)++;
 (*d)++;
}
```

rv64gc gcc:

```
inc2(int*, int*, int*, int*):
 lw      a7,0(a0)
        lw      a6,0(a1)
        lw      a4,0(a2)
 lw      a5,0(a3)
        addiw   a7,a7,1
        addiw   a6,a6,1
 addiw   a4,a4,1
        addiw   a5,a5,1
        sw      a7,0(a0)
 sw      a6,0(a1)
        sw      a4,0(a2)
        sw      a5,0(a3)
 ret
```

rv64gc clang:

```
inc2(int*, int*, int*, int*):
        lw a4, 0(a0)
        lw      a5, 0(a1)
        addi    a4, a4, 1
 sw      a4, 0(a0)
        lw      a0, 0(a2)
        lw      a4, 0(a3)
 addi    a5, a5, 1
        sw      a5, 0(a1)
        addi    a0, a0, 1
 addi    a4, a4, 1
        sw      a0, 0(a2)
        sw      a4, 0(a3)
        ret
```

You can see the same issue in rustc's output: https://gcc.godbolt.org/z/b8na96EhW

I apologize if duplicate - could not find another issue about this.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to