<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/136848>136848</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[x86] Unable to fold table lookup into tail call
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:X86
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
zmodem
</td>
</tr>
</table>
<pre>
Reported by @haberman
Consider:
```
typedef void Func(void *table, long idx);
void ExtraMov(Func** table, long idx) {
return table[idx](table, idx);
}
```
Actual output:
```
ExtraMov(void (**)(void*, long), long):
mov rax, qword ptr [rdi + 8*rsi]
jmp rax
```
Desired output:
```
ExtraMov(void (**)(void*, long), long):
jmp qword ptr [rdi + 8*rsi]
```
(GCC can do it: https://godbolt.org/z/73rGW9M45)
(For 32-bit x86 we get it right, but only for -fno-pic; for -fpic we get confused: https://godbolt.org/z/1e9s787Gr)
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy8k0-P8yYQxj_N-DJKhPE_fPDBSeo9vZdKVXsFgxN2sXEBZ5P99BV2drfdrtSeXssSMMzzzG-Qhnuvz5NSDRQHKE4JX8LFuuZttFKNibDy3vyqZuuCkijuCDm5cKHcyCcE0gJpj3byWioHWbsFoCSPn7ThPiupBrxaLbFbph4oW_dA28CFUUCPaOx0Ri1vQGvIDpvJmvTLLTj-w16Bsk3bAm3xOx1CFYWIiE6FxU2PrOIQ74sTUPYh-0el6vSFGEjb9mHhBu0S5iV829bfwB7dsA0uGm-x9bAxrsHP7WqIj2-013V1_BZz_ny1TuIcHEJxcFIj0ANGb-d1bIO0-DzOH4p_oZ-U107Jn8P-TvLf0F8ogbKn4xF7PqG0qCMnXkKYffSnHdDubKWwJuytOwPt3oB2Veaefq9_5EXEeHfprMOM7oQOeGMlvio8q4A6oNPnS4jgYgloJ3PHwTrcDZPdzbqH7PA4z7p_V_V2Ghav5P-BSVXtK1Y9OaB1IptM1lnNE9WkVV7kpGJ1mVyaUolBVCkjRJZ1WeeyoikrKZFC8r5K80Q3lNCC5DRL0yzN0v3A-pQOacmk7KnsBeREjVybvTHXMZZPtPeLatKsZDlLDBfK-HVwKRW8f1FTpP-DlUBpnGXXROFOLGcPOTHaB_9pFXQw69TfWAnFCX-b4oBgsDhYI7f5QWPtyzKjnoLFwLXBnhuTLM40X55Ih8si9r0dgXaxxGPZzc4-qz4A7VZ0Hx9vo7829K8AAAD___0kTvU">