<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/151994>151994</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Missed optimization: Eager use of callee-saved registers pessimizes hot branch
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Kritzefitz
</td>
</tr>
</table>
<pre>
Let's look at the assembly for this code:
```llvm
%T = type { i1, i64 }
@v = global %T { i1 false, i64 0 }
declare void @cold_init(%T *) unnamed_addr cold
define i64 @get_global() unnamed_addr {
%unlikely_ptr = getelementptr %T, %T *@v, i64 0, i32 0
%unlikely = load i1, i1 *%unlikely_ptr
br i1 %unlikely, label %doload, label %doinit
doinit:
call void (i64 *) @cold_init(%T *@v)
br label %doload
doload:
%value_ptr = getelementptr %T, %T *@v, i64 0, i32 1
%loaded = load i64, i64 *%value_ptr
ret i64 %loaded
}
```
```assembly
get_global: # @get_global
push rbx
mov rbx, qword ptr [rip + v@GOTPCREL]
cmp byte ptr [rbx], 0
je .LBB0_1
mov rax, qword ptr [rbx + 8]
pop rbx
ret
.LBB0_1: # %doinit
mov rdi, qword ptr [rip + v@GOTPCREL]
call cold_init@PLT
mov rax, qword ptr [rbx + 8]
pop rbx
ret
```
We can see that `rbx` is spilled at the start of the function, even though the hot path doesn't contain any function calls that would make this spilling strictly necessary. The reason for this seems to be, that `rbx` is accessed again after the call in the cold path.
I'm not expert in X86
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJykVdFu4ygU_RryctUIYztOHvyQtNPVarva0arS7luFzbXNFIMXsNv061fgxMlkZl5mkCUwcO6593AE3DnZasSS5AeSP6z46Dtjyz-s9B_YSP-xqow4lk_oCSscKGNegXvwHQJ3DvtKHaExFnwnHdRGIEn3hMZvQ-dPqakP_yx_BpI-gD8OCKQ4gEwIuwe5yYAUDydQRqe4qVWm4gpmUNwLDVcOzwh6wQisFbcIk5ECSEZro8SL1NITtp3xbE_YDkateY_ihQthIWw6wxupcU4joy36l5k7om9QpDgQugeAkNiolXxFdXwZvJ1zRo8Ke9Q-zrD8OWS7pJDRack-DlIG9NtwMZQyXJz1SeYCvuI7wSo7Ly9rAaB4hVE5YUKYm6koDN2fBvGwQqSaK3VSkG2jFrNoP9IzFrO7pHFLGhjiYGEgLJ-4GvFX5EousUJwFFdibbLFTVGuheyEsehPqydsOP7ZQ2en3hj3bHBC91e2SPdAWHrjlZkitGF0XaSr3q9mezPBeZbdw39vxgqIZecHKwcg7AATyehvfz1_vv_70xPJH67QdT_Evjp6XFDVe9jE7hcPhfYFYf10ONCX5Hvk_Dvk1Xsk337NOJgBrqqwGDxzjpwu237UokBXbrvOxAr5MxIEf4Z-MWNGPz8938b-6QpPbS70xhD_INRcg0ME33EPZEMDakNBOnCDVArF-VJ0nlsPpok_zahrL40OOeGEGnxnxraLa53xMHDfgTDoNGGFh9poz6UGro8LNBbuZt43MyoBPX_F-bqN1FK34LyVtVdH0Fijc9we1_DcIVjkzujL_ewQewfeQBXv0W-L4XXAh2ramEjj0cZso_xSz2OjREx9PcvzO2FFD9p4wPcBrQ_7_t1uYCXKVOzSHV9hmRR5lrJsk6SrrqRbnrGM51nTbLZZQpE1LE-bfNNQTrdptZIloyynW5olG5am6braUSxYITApdjnlgmQUey7VOrwta2PblXRuxDLJk90uW8XLyMUnjTGNbxBXCWPhhbNlAN1VY-tIRpV03l3CeOkVln_KKIIZvOzlB49HmO7hE2_RwugwnG9QBPHO8QkFWGyl82gdDOhcAKGLJ1xZrutuNVpVdt4PLlyH7JGwx1b6bqzWtekJe4wv5NzdDdZ8wdoT9hiTdoQ9nqqaSvZ_AAAA___7Z0Pg">