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

    <tr>
        <th>Summary</th>
        <td>
            [Question] Weird AArch64 assemblies
        </td>
    </tr>

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

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

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

<pre>
    LLVM: 17.0.2
When I compile libgmp into AArch64 assemblies (clang++ -O3), I got some weird instructions:
```
.LBB28_35:
sub     x8, x29, #312
ldur    x8, [x8, #-256]                 // 8-byte Folded Reload
lsr     x8, x8, #0 // that's weird
add     x8, x8, #15
and     x9, x8, #0xfffffffffffffff0
mov     x8, sp
subs    x0, x8, x9
mov     sp, x0
sub     x8, x29, #328
stur    x0, [x8, #-256]                 // 8-byte Folded Spill
b       .LBB28_37
```
the instruction `lsr x8, x8, #0` is confusing. To my best knowledge, I think it just did nothing

another problem:
```
.LBB200_16:
ldr     x8, [sp, #72]                   // 8-byte Folded Reload
ldr     x12, [sp, #88]                  // 8-byte Folded Reload
ldur    x11, [x29, #-24]                // 8-byte Folded Reload
ldur    w13, [x29, #-68]                // 4-byte Folded Reload
ldur    w14, [x29, #-72]                // 4-byte Folded Reload
ldr     x9, [sp, #96]                   // 8-byte Folded Reload
mov     w10, w9                         // move to w10
and     w10, w10, w14, lsl #1       // but immediately overwrite w10
eor     w10, w10, w13
asr     x13, x11, #63
add     x11, x11, x13
eor     x11, x11, x13
stur    x12, [x29, #-112]               // 8-byte Folded Spill
stur    x11, [x29, #-104]               // 8-byte Folded Spill
stur    w10, [x29, #-92]                // 4-byte Folded Spill
stur    x9, [x29, #-88]                 // 8-byte Folded Spill
stur    x8, [x29, #-80]                 // 8-byte Folded Spill
b       .LBB200_17
```
why not use one instruction `and w10, w9, w14, lsl #1` instead of the two instruction above?


another problem:
```
add     x11, x11, x13
subs    x8, x8, x11
cset    w14, ne
                                      // implicit-def: $x8
mov     w8, w14
sbfx    x11, x8, #0, #1
mov     w8, #2                          // =0x2
                                      // kill: def $x8 killed $w8
and     w14, w14, #0x1            // I think this instruction is redundant?
ands    w14, w14, #0x1
csinc   x8, x8, xzr, ne
subs    x10, x10, #31
add     x12, x12, x13
subs    x10, x10, x12
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyklttu4zYQhp-GvhnY4EHW4cIXdgMDC6QoekD3ciGJtMQNRboiFdl9-kJHS7GSuLtGAMWk-Hk4__DnxNbKTAuxQ9sD2j6t4srlptzVpizcP2qVGH7dPT___StieyDBBm8owk8I77_mQsMXSE1xlkqAkklWnEFqZ2C_L9Pc9yC2VhSJksIComGqYp0hekD0AOvfGKIRor_AF8iMA2sKAbWQJQeprSur1EmjLWL77seQj_u_9uvm-XCg4Te2HV-wVYJwdAkb5KUjI8oY6YNVvCrHebQ99P9QtqZbH22f4O0H0SOiRwjXydUJOBrFBYc_hDIx74n2BhxpeFjn8tghGthuT92KmPP7FWTbT-p2MprjLqf5p99-YV5Hkj2PCbDNIL4RLtH0dXtux_CH-aJhP-26fOGfytefZ6lUB2x-bVAtWNTU5WKqPSAfK1vC2wwjH4O0kBp9qqzU2Qb-MlBcIRHWwYs2tRI8E11luVzqF5AOvlfWAZcctGnGsj6APvPG5aKEc2kSJYoPSw7jb8Qf31B8VlNdghFlAV3K0CM11QEJfUsMw0XiA8BORkIGHUep19RbYD5KrAm7J_pLUfZE73Oid09czOQDxHI8S9MsRouV-8CmuwNUk_Y01NECYgYqzKsAZ6BZMDncw_rh0e5XWdXawJyQVA5kUQguYyfUFcyrKOtSOnFjClMuMFn_g505dSIN6lPms5kTdePjg03B70wOvjCW6EQsQhbU-swXRuBChRK8UKIPAvuMzIHRw-W0EGF0z1s-lo9uOVwA4p_y1saels21zq-N90FlBRh9Z7Sx5mMNRQvV2Zqutk7EHMwJGqt2tZlR4sS8CsSOU2v9Xwb7YVEOt9vkMmheaedSK9zNQLToRt89pEuplcVZyVS6NRenps9B1LuEs7MfDlnpwklOl0mwt8upv9TvlyLK6KdhIPaEL_QH4n9paoHtgYtTF3s7InjzpQ7nJuRN9G17DLIAHO5Ol0s7k1laKAWvNI-1G9WONbfvsAeJpE7f6vdvOdVrULirwv7RtnDz8qDdNF0sj9niy9D8jYW24jvGIxbFK7EjASE-wZ7nr_JdkgZBgsOY-mlAiRcGIqQnemI4SUiQpnQldxRTDzMa4oBiz99so5D4WxyQiIg4IgR5WBSxVBulXouNKbOVtLYSu9CPSLhScSKUbTtsSrWooZ1EtPGjVblr1qyTKrPIw0paZ28UJ51qW_PfK2EbBRqD-No2yvdd9qoq1S537tw2zq2SmXR5lWxSUyB6bKj9Y30uzXeROkSPbSwW0WMb638BAAD__1hBJwM">