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