<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/61897>61897</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Simle and innocent inline assembly that never writes to %rsp crashes by causing a weird write to %rsp to be conjured up at -O0
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
pskocik
</td>
</tr>
</table>
<pre>
This:
```
void *readsp(void){
register void *rsp __asm("rsp");
void *savedSp; __asm ("mov %1, %0\n" : "=r"(savedSp): "r"(rsp) );
return savedSp;
}
```
works on clang at optimization levels >= -O1 (on on gcc on ALL optimization levels), but on clang, at optimization level -O0 it crashes due to conjuring up a weird load from the stack and into the stack pointer (!):
```
pushq %rbp
movq %rsp, %rbp
movq -8(%rbp), %rax //???
movq %rax, %rsp //???
...
```
https://godbolt.org/z/bPEr1Wqc4
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJx8U81u8yoQfRq8GSVyIHbshRdp0qwq9Uq90l1WGCY2DQYXcPrz9FeQpM1X9YuFjIBzZpgzB-696gxiQ4o7UmwzPoXeumb0ByvUIWut_Gj-7ZUnbE3yLcnXpMzP47RM_6NVEghdO-TSj4RWcYPQmqzuTgAAAIed8gEdfKH9CM_P3A-EVoRSF5k0stgV6wL2_IjyaSTs7sSBE2mwRyC0WBC6iXNOio0hlAJha4jR2NaloNWFH8Ono_N-ylrDH2kdhskZ-E55rnW1vS76hxJv1h08WANCc9MBD2DHoAb1yYOyBjQeUXsg7J6wLcweF7EAayKhEyJO64eH3yjxZnQD7RS-gsf1r_Fh9piDCiAc9z16kBNCsCCseZmcMh1MI3B4Q-UkaMsl7J0dIPQIPnBxAG4kKBPs1dZolYlNS3IvTvLdcALAOPn-FSB2w7XjdyPjN9hjPEpnUffNTdSsSkkT4CRCXPD3FGAXB7uMv2bh7xeeH2-w5vP5jaL6EMb0AhK_s7K1Osyt6wjdfRK6a_-5d4v_XsUykw2TNat5hs2irPIlpTSvsr5h5aqijJb7CuuC7Vf1Xgi2ZyWVe1HsJWaqoTll-TKn-aool9W8LKqqlTVvq7KsUVZkmePAlZ5rfRxi7kx5P2FTLqp6lWneovaXR-yaCJq1U-fJMtfKB_9NCypobJ7UoPHcb2MFmgDKaGUQuPc4tPoDQs8DGDyigzenAvpopbOSF4O1HyD45KO1Lr5K2CtosNDi2YIokwND9Gk2Od38UFaFfmrnwg6E7uKFz9NsdPYFRSB0l4r2hO5S3f8HAAD__1SWY90">