<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/62976>62976</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
atomic_fence's memory barrier greater than a function call, lead to auto inline missing optimization
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
youngbe
</td>
</tr>
</table>
<pre>
For the code:
test.c:
```c
#include <stddef.h>
#include <stdatomic.h>
void test(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);
void test1(unsigned long *);
void test2(void);
void kkk2(void);
int kkk()
{
unsigned long k[512];
unsigned long k2[512];
test1(k2);
for (size_t i=0; i<512; ++i)
k[i] = k2[i];
k[1] = 3;
k[2] = 3;
k[3] = 3;
k[4] = 3;
k[5] = 3;
kkk2();
test(k[1], k[2], k[3], k[4], k[5]);
for (size_t i=0; i<512; ++i)
k[i] = k2[i];
test1(k);
return 0;
}
```
test2.c:
```c
#include <stdatomic.h>
void kkk2(void)
{
atomic_signal_fence(memory_order_acq_rel);
}
```
After compile by clang 16.0.0 with -O3:
test.s:
```assembly
kkk: # @kkk
pushq %r14
pushq %rbx
subq $8200, %rsp # imm = 0x2008
movq %rsp, %rbx
movq %rbx, %rdi
callq test1@PLT
callq kkk2@PLT
movl $3, %edi
movl $3, %esi
movl $3, %edx
movl $3, %ecx
movl $3, %r8d
callq test@PLT
leaq 4096(%rsp), %r14
movl $4096, %edx # imm = 0x1000
movq %r14, %rdi
movq %rbx, %rsi
callq memcpy@PLT
movq %r14, %rdi
callq test1@PLT
xorl %eax, %eax
addq $8200, %rsp # imm = 0x2008
popq %rbx
popq %r14
retq
```
test2.s:
```assembly
kkk2: # @kkk2
#MEMBARRIER
retq
```
However, if I put test2.c and test.c together, the kkk2 will be automatically inline to kkk, this make kkk function even more complex.
For code:
test.c:
```c
#include <stddef.h>
#include <stdatomic.h>
void test(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);
void test1(unsigned long *);
void test2(void);
void kkk2(void);
int kkk()
{
unsigned long k[512];
unsigned long k2[512];
test1(k2);
for (size_t i=0; i<512; ++i)
k[i] = k2[i];
k[1] = 3;
k[2] = 3;
k[3] = 3;
k[4] = 3;
k[5] = 3;
kkk2();
test(k[1], k[2], k[3], k[4], k[5]);
for (size_t i=0; i<512; ++i)
k[i] = k2[i];
test1(k);
return 0;
}
void kkk2()
{
atomic_signal_fence(memory_order_acq_rel);
}
```
After compile:
test.s
```assembly
kkk: # @kkk
pushq %r14
pushq %rbx
subq $8200, %rsp # imm = 0x2008
leaq 4096(%rsp), %rbx
movq %rbx, %rdi
callq test1@PLT
movq %rsp, %r14
movl $4096, %edx # imm = 0x1000
movq %r14, %rdi
movq %rbx, %rsi
callq memcpy@PLT
movq $3, 8(%rsp)
movq $3, 16(%rsp)
movq $3, 24(%rsp)
movq $3, 32(%rsp)
movq $3, 40(%rsp)
#MEMBARRIER
movq 8(%rsp), %rdi
movq 16(%rsp), %rsi
movq 24(%rsp), %rdx
movq 32(%rsp), %rcx
movq 40(%rsp), %r8
callq test@PLT
movl $4096, %edx # imm = 0x1000
movq %r14, %rdi
movq %rbx, %rsi
callq memcpy@PLT
movq %r14, %rdi
callq test1@PLT
xorl %eax, %eax
addq $8200, %rsp # imm = 0x2008
popq %rbx
popq %r14
retq
kkk2: # @kkk2
#MEMBARRIER
retq
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWF1vozgX_jXOzdFExgZCLnKRTCZ6R3pHu6r2PjLgJN4anBrTNvPrVwaTAIE2u22kXe1aFTWcx-fb9tOyohD7nPMFClYoWE9YaQ5KL06qzPcxn8QqPS02SoM5cEhUyhFdIrxGeGl4YabJ-RWFuP5J3DuhIk9kmXJA9Gth0pTvpgdEv42ImVGZSNqI6vmsRArWFCJRmVeupiBVvkfkK3z8wxzRVc-Q17cEiCwHkQSRyL5cCR8fH4dk9VPkxgIQiaysFswcousePKJgFXgEBeuzDgDog8gwqonFunLxAXZKAyJRIX7yrQGB6BojurKTr1YJXQEiK0RW4uwduGG9EShYA6Lr2qpo27yALdBrgLTjlBWRcREdF_njomBA5ErQCd0lxebEeWg7onGpmdPW3G_Ng2rer6ZVereUdsrYD0VzU-oc8MWh2bq3FS8blfyZnfrWVuy1dq9965Vb255Mbnc8TzgiUcYzpU9bpVOutyx52mouO5kccbx-LneGa0hUdhSSQ3yCRLJ8D144xVMML8Ic4MsvtHssFdfBsqLgWSxPl_5AdAmIUEA-tm-dwhzL4vAEAIgE2vPHZfGrkxVlbL8BIn5EMLZNY-XFEYaGNSuyrCo7fiUYR10TmXp-cusbTWdLbcjFC4dKRReVMCmfzl3k41___5sDNJKqoG3BRb90AVGnnfe1D2GKGzDpdSxXmGQI0wLoKB0PdSggyVmVMB_Pw-pkqLM7b_T1y9xyql7S-H5DRT2MXQ936uT5Y3UarmY_l3WIGc-S42mkZjfYGu-JV6VdyAFnjRd21lnP0vQTW_2oju3IR2Xn8mhunt44597d-lXDd7Y-6VpFhP749mO1fHj4_u2hKxq13X7-T73wZ65tXsQOvsOxNODOYGB5TR2mCRi15-ZQ4yy5so7Ai5ASYg6sNCpjRthanUDkUuQcjKqJg8WLAjL2WK2CXZknRqgc-DPPIVOaV8el5K_Ttl-Wxf3H4O7N4K752R1I3D1Jx9-LxzU3VJfKOeG_gs21-_HulKtDtvqc6p1T9VP5lBsVrfqci-a9-_-zCVZ7_YXG3YllDPj8l8lGE9ItPKOmY1Enn29CvfB2LPFvx1IygO2DfDyu8I1bv1ETDbXNWHK9wSYbYMcVuhdqo_u1F0gvSgcboMqu04fQUa_MY3z5H96Z7zPg6y3rxkdp8Icp79BB0aKeHRr7_vgkojtJFzSd0zmb8IUXRgGZkVkQTg6LwGfz3QzzwPNSzGgyp74_281oGsxIGkZ8IhYEE4oDEnmeN_fC6Y4nnLF0HoapPwuCGPmYZ0zIqZTP2VTp_UQURckXIZnPwolkMZdF9f9JQnL-ApUQEXvNT_TCrvkSl_sC-ViKwhQXLUYYyRfuhnRX46yA-nKEmGktuIa95szeeubAcmAXNm27xFZVcpZa7m05eUPFM1EUIt-DOhqRiZ_MLpiUWi4OxhyrP0HIBpHNXphDGU8TlSGysW65X1-OWv3OE4PIpgqmQGRTBftHAAAA__9EFYCj">