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