<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">