<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/61950>61950</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Missed simple devirtualization
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang:codegen,
            missed-optimization,
            llvm
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          davidbolvansky
      </td>
    </tr>
</table>

<pre>
    ```
struct base_task
{
    void run() {
        return run_impl();
    }
 virtual void run_impl() = 0;
};

struct compute_task : public base_task
{
    void run_impl() {
 __builtin_printf("work");
    }
};


void wrapper(compute_task &t) {
    t.run();
}
```

GCC is able to devirtualize it.

https://godbolt.org/z/dYMMxnn8T
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMUkGPozwM_TXmEg0KCaFw4NBpxXfq7bvsqUogpdkGghKns9NfvwKqTrujlbaqgk2e_fweliGYftS6BvEOYp_IiGfn605eTaecvcoxXD4T5brPGgp6_9M90G1AH1skSgZ9RBku61vYvK8BIYRcnemIjyOwElhFXu7mn9cY_TgjjmaY7AoD_oSCzf6eXI3HKO2j51MFAb4n9FE31zzi51FbN0wR12kJ8C2ZorKm_ScJL3QPwPGoorFoxuPkzYinBcA-nL8AY3_V8n3A9Vy4PrycJu2Bla_jsgK_eYjpw9wX9Wvw-rnW87_djphApLKaoCOdvttqbpoYTJ-hZ8QpAN8Ca4A1vZvXAVPne2DNDVjT_Tgcfo1j-X_S1byreCUTXWdFSTdU8KJKzjWnut3IXKgi2-RZWZ1OshKF4EqKUtFKJ6ZmlHGaU5HlvKBV2lJRFVVWFoLyUp4o5FQP0tjU2uswcycmhKjrIqsETaxU2oZlcxlrrRx74NvWdbrX4-L_DhgbTAi6e3MTmsHcJBr3dTd3nROxT3w9J28q9gFyak3A8EWKBq2uD0snEuZN0M_WLU2T6G39h2cGz1GlrRuANSvX8nibvPupWwTWLHICsGZR9DsAAP__ZsQKJQ">