<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/62024>62024</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Bitwise `or` used instead of offset in load
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          dzaima
      </td>
    </tr>
</table>

<pre>
    ```c
#include<stdlib.h>
void ext(int,int,int,int);
void f(int* a, size_t s, size_t n) {
    size_t i = 4*s;
    while (i+4 < n) {
        int w = a[i];   if (w>100) return;
        int x = a[i+1]; if (x>100) return;
        int y = a[i+2]; if (y>100) return;
        int z = a[i+3]; if (z>100) return;
 ext(w, x, y, z);
        i+= 4;
    }
}
```
with `-O3` compiles to:
```asm
f:                                      # @f
 push    r15
        push    r14
        push    rbx
        lea rax, [4*rsi + 4]
        cmp     rax, rdx
        jae .LBB0_7
        mov     rbx, rdx
        mov     r15, rsi
 mov     r14, rdi
        shl     r15, 2
.LBB0_2: # =>This Inner Loop Header: Depth=1
        mov     edi, dword ptr [r14 + 4*r15]
        cmp     edi, 100
        jg      .LBB0_7
 lea     rax, [4*r15]
        mov     rcx, rax
        or      rcx, 4
        mov     esi, dword ptr [r14 + rcx]
        cmp     esi, 100
        jg      .LBB0_7
        mov     rcx, rax
        or rcx, 8
        mov     edx, dword ptr [r14 + rcx]
        cmp     edx, 100
        jg      .LBB0_7
        or      rax, 12
        mov ecx, dword ptr [r14 + rax]
        cmp     ecx, 100
        jg .LBB0_7
        call    ext@PLT
        lea     rax, [r15 + 4]
 add     r15, 8
        cmp     r15, rbx
        mov     r15, rax
 jb      .LBB0_2
.LBB0_7:
        pop     rbx
        pop r14
        pop     r15
        ret
```
but all those `or`s would be better off being done as offsets within the load instructions (which they are with `size_t i = 0;`).

[compiler explorer](https://godbolt.org/z/K37n8GY15)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVsFu6ygU_ZqbzVUjDNixF17UTTMzmkozi7eZ1RM2JKZyTAS4SfP1I2wnjdOk6ntWhV0O93A4Fy4RzulNq1QOcQHxciY6Xxuby6PQWzErjXzPISHDXwVkCeQRKNNt1XRSAXtyXja6nNfAngf0zWiJ6uCBprr1QJ8-tRmw4mLs-jTyEQXQJ3T6qH56dBffLdAMYTFGIeIJ0AhsiRzoozuTBnhf60ZhIAZacAT2dIMjPLr1uO9JBMSFhngJrAj96xC9B_YcERIirfKdbSeTnOIPF_G0iEaOgeHwLYb3CQOdMLx_i-E4YWAThuN9hiFP-2D1ITTvoTlepug8CdBi8PoSgcVy3BPnj9NmGf7da18jJOThHwYJwcpsd7pRDr0B9ngVIdx26FkDO8_79QOUIXCyHhXtOleHbhvFU_UfAL8DlIcp0CiBVvSmQFyEHWadRqAF8mDuZGy13fXvcbyVV1yvQuH8pSjIz8UU2Jo3PM1-K_CMR3GPOz3iHwAfAvU00NXNZSAd0EEDDe72xrElsOcftXb4V9sqiy_G7PBPJaSyYcxS7XwNbBndFqWkDtxyb6zEnbfBJxvx0SP6GOa-59QYG3bl1KnN8J66FXJx4e8pHzf4z75Ug6HiylBj8RLnd1bm7q8sRN5dlfuVVX1f8gil9_Jw-D21Q9yvqT0bOKQiop81qeoLPeILPdVdPTelVKLpN3moYZz8-_Lj8wGebhobxdcHWEg5DBrOSXrnXI_H77pGXB_Pc-pey0sLJ6dvca57J5adGWe5pg_A54JlPjRNAKv8zQpcdh6DU742ToVSbCwkxOHedI3EUmGpvFcWzXqNpdLtBqVpFQoXepzyDkMN1y36WmFjhETdOm-7ymvTuv6WrHVVB_gdhVV4KvmTK5qEayMJd9B8VDm0cTFeCRbVYdcYq2zIDk1r73cueEVXQFcbI0vT-LmxG6CrI9DV32zRpn_8F5zPZjJnMmOZmKk8SlKSZWmcJbM651m6SChPKGciTrIoXidRSjhRLOYyZouZzimhjHCSEUJYlMwTLtYx5ZSniUjXogJO1FboZt40b9sw_Uw716k8oYTyWSNK1bj-pxOlrdpjDwINN_jM5iHmoew2DjhptPPug8Vr36i80H6vL7KCnVODv0pINOsxBajb3vlZZ5v8yhjt666cV2YLdBXYx9fDzppXVXmgq16TA7rqNf8fAAD___TTjjE">