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

    <tr>
        <th>Summary</th>
        <td>
            Clang 13: Wrong assembly generated on Apple M1 processor for variadic ms_abi function with optimatilization -O0
        </td>
    </tr>

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

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

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

<pre>
    Hello,
We have issues with wrong assembly code generated. On Apple M1 processor for variadic ms_abi function with optimatilization -O0. Optimazation -O1 and above are fine.

clang version 15.0.0 (https://github.com/llvm/llvm-project.git 6cbf15e9b5ac31887fda9a8fbbf7caa2dcbcf958)
Target: x86_64-apple-darwin21.2.0

Example:

```
#include <stdio.h>
#include <stdarg.h>

void __attribute__((ms_abi)) Foo_va_list (int VaNum, const char  *Format, ...){
                __builtin_ms_va_list  Marker;
                long long    Value;

                __builtin_ms_va_start (Marker, Format);
                for (int i = 0; i < VaNum; i++ ) {
                                Value = __builtin_va_arg (Marker, int);
                                printf("Value = 0x%llx\n", Value);
                }
                __builtin_ms_va_end (Marker);
}

int main() {
  Foo_va_list (16, "0123456789abcdef= %x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x\n",0,1,2,3,4,5,6,7,8,9,0xa,0xb,0xc,0xd,0xe,0xf);
  return 0;
}

```

The first 6 argumets are stored to registers w2 - w7 but they are never retrieved at Foo_va_list with optimalization -O0 function as with optimalization -O1 . And output of program is wrong (start from argument value 6 instead of 0)

Output:
Value = 0x6
Value = 0x7
Value = 0x8
Value = 0x9
Value = 0xa
Value = 0xb
Value = 0xc
Value = 0xd
Value = 0xe
Value = 0xf
Value = 0x4637ea4
Value = 0x0
Value = 0x6b7cb8d0
Value = 0x49290f4
Value = 0x0
Value = 0x0

```
_main:                                  ; @main
        .cfi_startproc
; %bb.0:
        sub     sp, sp, #112                    ; =112
        stp     x29, x30, [sp, #96]             ; 16-byte Folded Spill
        add     x29, sp, #96                    ; =96
        .cfi_def_cfa w29, 16
        .cfi_offset w30, -8
        .cfi_offset w29, -16
        **mov   w2, #0**
        stur    w2, [x29, #-8]                  ; 4-byte Folded Spill
        stur    wzr, [x29, #-4]
        mov     w0, #16
        adrp    x1, l_.str.1@PAGE
        add     x1, x1, l_.str.1@PAGEOFF
        **mov   w3, #1
        mov     w4, #2
        mov     w5, #3
        mov     w6, #4
        mov     w7, #5**
        mov     x9, sp
```

registers x2-x7 are newer retrieved.

```
__Z11Foo_va_listiPKcz:                  ; @_Z11Foo_va_listiPKcz
        .cfi_startproc
; %bb.0:
        sub     sp, sp, #64                     ; =64
        stp     x29, x30, [sp, #48]             ; 16-byte Folded Spill
        add     x29, sp, #48                    ; =48
        .cfi_def_cfa w29, 16
        .cfi_offset w30, -8
        .cfi_offset w29, -16
        stur    w0, [x29, #-4]
        stur    x1, [x29, #-16]
        add     x9, sp, #24                     ; =24
        add     x8, x29, #16                    ; =16
        str     x8, [x9]
        str     wzr, [sp, #12]
LBB0_1:                                 ; =>This Inner Loop Header: Depth=1
        ldr     w8, [sp, #12]
        ldur    w9, [x29, #-4]
        subs    w8, w8, w9
        b.ge    LBB0_4
; %bb.2:                                ;   in Loop: Header=BB0_1 Depth=1
        ldr     x9, [sp, #24]
        ldr     w8, [x9]
        add     x9, x9, #8                      ; =8
        str     x9, [sp, #24]
        str     w8, [sp, #8]
        ldrsw   x8, [sp, #8]
        str     x8, [sp, #16]
        ldr     x8, [sp, #16]
        adrp    x0, l_.str@PAGE
        add     x0, x0, l_.str@PAGEOFF
        mov     x9, sp
        str     x8, [x9]
        bl      _printf
; %bb.3:                                ;   in Loop: Header=BB0_1 Depth=1
        ldr     w8, [sp, #12]
        add     w8, w8, #1                      ; =1
        str     w8, [sp, #12]
        b       LBB0_1
LBB0_4:
        ldp     x29, x30, [sp, #48]             ; 16-byte Folded Reload
        add     sp, sp, #64                     ; =64
        ret
        .cfi_endproc
                 ; -- End function


```
[main.txt](https://github.com/llvm/llvm-project/files/8139258/main.txt)
[fail.O0.asm.txt](https://github.com/llvm/llvm-project/files/8139255/fail.O0.asm.txt)
[working.O1.asm.txt](https://github.com/llvm/llvm-project/files/8139257/working.O1.asm.txt)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy9GNuOozb0a8iLFWTM_SEPk2SmW3W3s2pXu1JfkAGT0CUQGZNk5ut7bAjhlmR2Oy0Ch_gcn_vFOCzil8UHlmWFRlYaXmv44RtDW3pgKC3LipXomIotOvIi3yBalmwXZi8oKmKGNixnnAoW6-g5Rw_7fcbQJwPteRGxsiw4SuA5UJ7SOI3QrgxomKKkyiORFnlNttiLdEdFmqWvVM3OnzFQU7PtjIFoHiMaFiAT5Qwlac70WtR6jDIKwh0YL-UCw9axjpFGvK0Q-1IzHzTyBPcGGFahHhU7-JNlh_PPHAT-m0VCBwTkRGFi2MwPbRqZhue5SUx96iVhmLgRpSSOwijxbU8jfs37C-UbJoAJOnlO4FhzKu0wjyk_pjkxdKLjrqiPJ7oDuBSqM6s5uLnrv8RM8yirwMaauSpFnBb6VjMfr0BBgi5YjYcijVEQUCF4GlaCBQHYA-7aC1J64qOnoggONMjSUkhzpblAX-nvFRhmBR7OYTbaUo4A9vBUcPCTBOi6Lpe7y5oRGlxBEFZpJtI8AFZn4ugT5d8Z18wrizIZXGqA6yvNKtaivo1LKShXOjSMQM6zxP5VrjI8G7VTMOUaYUBVr6vGDvKvRpZwI2mvq0oPL6WCInkRFKQER_VlBNa3BBxeew4LEuVIcmGBTxqxs-yk2ascAJJubcIblDV3_TbDMsi8jsgXii2FepRG3NE0V8L1LDUIMsORAoKc2CCmZTuu59MwilkiVQFFTv_qaU2A4THgke8mPBY8NjySuwsPSLnyJd6JqjFUY6TGWI1MjUnfipyJiucqUCbNMEzkukRsZc3ioL8D9WtT7ZgoVSErRcFZjEQBdDdgHyhg6EjQHB1dBEmLxJa9KMScQXGTzHkKb1ALRc-snVLaLaSXWkvLKzgG0tEDuLioxB4YFoms3htOd1D8m5oPPquzK-HFrpEfnH1Q8edACIPcNJZLcVsU6_FZEW1LXTdinfGUO57yxlP-eIqOp8LxVDSeisdTbDyVjKcsx3QZtcYAPKFp6EahF09ALJ_4OHkbFXwjyAKVd-bd6gFZD_VMs7DCb-j5epSkdfmUfbuZlnjEDkPoXZdG5ZdVKMe9TOB6hFZkGOQqK3MN0MtysYfxJFvPCp1MrAjYy5aS72j2ekTEcObhi2AQ71kMkf_nPs2yliSN4wvJDqEbEvlOX3WoPEGUUMg7RcQYgIskKRlkWC3u3JuG1mvnncXQMuHeFQd4P5JGMFzPdixS8QvcXjaKACYwGtii1cG6YY8zwVc-pmgBxRaxEQyfneh0TMqVm2TxRFmgl4LrBgTN54dfHod2VziTmM9PT9OmMM8ch6JYDYAMAXYDMIeAppGY1hDgNgB7YO4afDoHy_WCfanGJzI_uU0JPnZLsH4rIYO_DKNTn9PPv0WvkwnaJOQk_nslqGNdrwXm2rHenJ_WKCZ_Mj8t74ZAlve_5Oc5U_CdRGnw6iDv4xlOF7FRta8puWl7Yg1Xe8r0LQvjViHrKcPb1VJGv69BvyRcKjdp0T4ulzgw3tJDGubwtfFlC1uEX3P4BEQfi2KPPsAuQG7xH9Ca7cVWStjKkMVKBu-GCAqr9ol_zydVWLbkmrHdePihvoEu7iuVrGG6kDfoKLER7GuUWhL_rNlaWemqeid_qB6x-ur1jND3Ujd8Tme1J_Ok9YE39P8d_k0gjJzgDYQsj91gmkYbRNzFoc5Y43tY546DL33kSr9RGBN43W4zWeTvpEgIFcsPmq-rQcSY_2HE3EuIWu1unEuUm0Fh3HV3n0V4ThWjUwmsblPJ4ndoC3-wrKDxQLGfbVTQhPtlHj5SL71xksB8jh7hM-f8QdRr3pP7AHspd8m6OAlprR89SoK_SZqxEn49w_SJPC96agm2X0n2MqFppj9jnZa7d-Nly5kB3Q7LY8G_p_lGfzbelStsup4mSBN_Fi_M2Dd9OhOpyNhipQ7rDJVX3_qniu2BIire8TxxVvFs8cPa1Yef8GJb2PVn24WLrRgql29Zlue7Lo4wsWMjdJzY850oJLOMhiwrF2BijRDYLtbnp_I4wl7P0gXBRN62YVk-xjoxzDhyHYzD2HcYtaGUsZ30mpRDL_hmxhdKpLDalACUG8PyAgSbpZucMcUO6NNKbAu-2FX5K93PFOeFkvwfOkbJww">