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

    <tr>
        <th>Summary</th>
        <td>
            PowerPC: fatal error: error in backend: failed to perform tail call elimination on a call site marked musttail
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    FreeBSD 13.1-RELEASE on powerpc / powerpc64 / powerpc64le
LLVM 14.0.6

```
namespace std {
template <bool, class, class _Then> using conditional_t = _Then;
void is_same_v();
template <class _Tp> using remove_cvref_t = _Tp;
template <class = void> struct coroutine_handle;
namespace experimental {
template <class R, class...> struct coroutine_traits : R {};
template <typename Promise>
struct coroutine_handle : std::coroutine_handle<Promise> {};
} // namespace experimental
template <> struct coroutine_handle<> {
  coroutine_handle(decltype(nullptr));
  void *address() noexcept;
};
template <class> struct coroutine_handle : coroutine_handle<> {
  static coroutine_handle from_address(void *) noexcept;
};
struct suspend_always {
  bool await_ready();
  void await_suspend(coroutine_handle<>);
  void await_resume();
};
inline namespace _LIBCPP_ABI_NAMESPACE {
template <long, class> struct tuple_element;
template <class...> class tuple;
template <class...> struct __tuple_types;
template <long _Ip, class... _Types>
struct tuple_element<_Ip, __tuple_types<_Types...>> {
  typedef __type_pack_element<_Ip, _Types...> type;
};
template <long _Ip, class... _Tp> struct tuple_element<_Ip, tuple<_Tp...>> {
  typedef typename tuple_element<_Ip, __tuple_types<_Tp...>>::type type;
};
template <long _Ip, class... _Tp>
using tuple_element_t = typename tuple_element<_Ip, _Tp...>::type;
} // namespace _LIBCPP_ABI_NAMESPACE
} // namespace std
namespace QCoro {
template <typename> class AsyncGenerator;
namespace detail {
class AsyncGeneratorYieldOperation;
struct AsyncGeneratorPromiseBase {
  std::suspend_always initial_suspend();
  AsyncGeneratorYieldOperation final_suspend() noexcept;
  void unhandled_exception();
  void return_void();
};
struct AsyncGeneratorYieldOperation {
  bool await_ready() noexcept;
  std::coroutine_handle<> await_suspend(std::coroutine_handle<>) noexcept;
  void await_resume() noexcept;
};
struct IteratorAwaitableBase {
  IteratorAwaitableBase(AsyncGeneratorPromiseBase, std::coroutine_handle<>);
  void await_suspend(std::coroutine_handle<>);
};
struct AsyncGeneratorPromise : AsyncGeneratorPromiseBase {
  AsyncGenerator<std::tuple<int, bool>> get_return_object();
};
} // namespace detail
template <typename> struct AsyncGenerator {
  using promise_type = detail::AsyncGeneratorPromise;
  auto begin() {
    struct BeginIteratorAwaitable : detail::IteratorAwaitableBase {
      detail::AsyncGeneratorPromise __trans_tmp_1;
      BeginIteratorAwaitable(std::coroutine_handle<> producerCoroutine)
          : IteratorAwaitableBase(__trans_tmp_1, producerCoroutine) {}
      bool await_ready();
      void await_resume();
    };
    return BeginIteratorAwaitable{nullptr};
  }
};
} // namespace QCoro
class QWebSocket;
namespace QCoro::detail {
struct QCoroWebSocket {
  AsyncGenerator<std::tuple<int>> binaryFrames();
  QWebSocket *mWebSocket;
};
namespace concepts {
template <typename>
concept QObject = requires {
  std::is_same_v;
};
} // namespace concepts
template <concepts::QObject, typename> struct QCoroSignalQueue;
} // namespace QCoro::detail
template <QCoro::detail::concepts::QObject T, typename FuncPtr>
auto qCoroSignalListener(T, FuncPtr)
    -> QCoro::AsyncGenerator<QCoro::detail::QCoroSignalQueue<T, FuncPtr>>;
struct QWebSocket {
  void binaryFrameReceived(int, bool);
};
using namespace QCoro::detail;
template <typename> struct signal_args;
template <typename T, typename R, typename... Args>
struct signal_args<R (T::*)(Args...)> {
  using types = std::tuple<std::remove_cvref_t<Args>...>;
};
template <typename T> using signal_args_t = typename signal_args<T>::types;
template <typename> struct unwrapped_signal_args;
template <typename... Args> struct unwrapped_signal_args<std::tuple<Args...>> {
  using args_tuple = std::tuple<std::remove_cvref_t<Args>...>;
  using type =
      std::conditional_t<0, std::tuple_element_t<0, args_tuple>, args_tuple>;
};
template <typename... Args>
using unwrapped_signal_args_t = typename unwrapped_signal_args<Args...>::type;
struct WebSocketSignalWatcher {
  void ready();
};
template <typename Signal>
auto watcherGenerator(QWebSocket *, Signal)
    -> QCoro::AsyncGenerator<unwrapped_signal_args_t<signal_args_t<Signal>>> {
  void watcher();
  auto signalListener =
      qCoroSignalListener(watcher, &WebSocketSignalWatcher::ready);
  co_await signalListener.begin();
}
int binaryFrames_timeout;
QCoro::AsyncGenerator<std::tuple<int>> QCoroWebSocket::binaryFrames() {
  watcherGenerator(mWebSocket, &QWebSocket::binaryFrameReceived);
}
```

Build with:
`clang++14 -cc1 -triple powerpc-unknown-freebsd13.1 -emit-obj -std=gnu++20 qcorowebsocket-c2cb02.cpp`
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytWVtv4jgU_jXwYoFCKLR94AEoXY3U2elltKN9ipzEUE9zG8cp23-_59gJcRIn6WgXIUrI8fF3vnN16qfhx-ZeMLZ7uSOL5Xwxez48HLYvB5ImJEvPTGQBmbj31ff1VfMqYhPnbuJsHx7--koWV3NnvtY_lJ9rp3yry4TGLM9owEguQzK53umfJYuziEpGJsu9n6bRxN2TIKJ5fvlCvO-vLJksD6TIeXIiQZqEXPI0oZEnYdldJVBqfE95SHju5bCh9z5xbybu7eWmuV2lPat1Cxan78wL3gU7XpRnA6tRAjdEFbkURSABn0gLyRPmvdIkBJKq1TUD7J-MCR6zRNLIToXW_nwhYT6fW7eQgnKJMLbkWWm6vrOilR8Zw_3Jo0hjngOogxbqAa00gqPgD7y7Ju1rPe1t4TvGCYaK3eIuukH29tUeahnpSrg3IQsitBC-JkUUZVKgzw23E-UkgLWlYSgYRheGBUlS9k_AMmmC7_f2AEzF1zj2XFLJg-7qI7Dp1dAqsKMQSzR5kYN7Q49GZ_qRmxtiShF6hiDxBKPhRysdSl60QKkFROyG9C4E1EXMWqpNmDyJQJkRDt7Dl93-8dHb7r54f26_Hl4et_uDPROiNDnVRaH2gCyyiHksYhhU_T4rE0fnk1ozKltu4Hl6Cwys3LoIoRHvS2ZmKdQLLd_MrxbafbmqtcdeL9Y4WqGDIiE74hL45gGNbxZ9xnq1YjSwe2zI-pmu9irJBMzZIOBL6fk0B7U-XX7wzn-2RgvrMt9AUtb5UZg1rArTcMmzxviAPFbbVp942kMi2tOiglsH9zb_SII_WMIElamwdJ2QScqNfmNb9jdnUfgtwwvosO0605QtW8CO5qxZ48qu0apKPIGuDT27LjPNgjIEhBx50l7arYxlUSoSXbVCT99HQ6xlTzBZiMRT_bu_eFltb8Ebrbg2sEPtFd3arsoj8kOUdOv0p_rKF6mt3eJy6kcdX1sFYIPeQMFMGrdjrD_9hoZRT5bgVAP_VHy382x_QVNVRA51A-xU46wuiyeG7KtoS_2fLJAD8WYtDjp3h8uA1TwTuS5-mTZL1VtV-UrdygQrA4Y7aCFT4rMTL1PKVE8qBDu83wkNxbC512h04WsUHPYPQZPck3HmLQyo-LIjGY8gJCksAib21W30lqEYX2hPXwI0QUEw2BRWk7Ohd3Rew9fY6KXAGRGF1zr6-gi53lVzc2PZBdxofKpOZbaVpx_Mf0mDNyYtnUhLK_7bTakMISVxUfH76afTzoeuIT7uBW7c4ejJUO9u4y5e0-gaOxw_sWzmo225ZEOLk6dvKu9Vwgn2q-DgOWvXrE-uny4OFSTLWFvdUapLDGp469YNRfkLP0GjfSpYMTLddFzY3bwrUmacBRP5bqIi90USPEI0ViyqsvOrBvjAc4khAE5VCyt5M0lnaJuBoRM4Pfi6POwbe5SDaSterbGqEtUIwmcWMP7OsIWZPaKnEehyPUT50Enf8GyujPGoONnPMRfam054Nq9wkN4qBc2DTUP3_pkojyiM-vyKwwDcw9EZzTx0-5Ga-1VedDL58kPzuQzcKaFUE_nIscAw8PKoxwDePgE0bfremPmHGTRIL5KzoBkcgbzP0m9QPKKkW_MqjjunMG2sthJl_x-iTd-hRrM7Ga3VeFAHqpzG8Nc6g1X3a6RqkGv_8FlPd8JV47Xy2XZ_H-kmx50jYOmwSxnQBeQHlcErE52aYOvto8GrVTZr4llvUJc196bZ15DCcuFvFccepjBWWtc1rE7wKVtLiJ3-q_DnjXLeDiV7xb8o3IOBazvjVTQrms1dg9RTk1Nr57kx0zY8Uj6_ko1ZwpM8ZjDGXSSHmByYT5pTjpbqziwmoxZ_G5OLZuSpX2PdgCxWth7Y689dwSPwIZevqKySgxkPn8rt4L24IrMgWJCZFBzrS_nvgVmRvCXpOZkdBWN-HuL_F8iMxVzO4AREZoqVu1NSaC2uQ37hKH4GWQV9FriB77jzIMtgv2m4WYa3y1s6lVxGbPOImzzucQI_UnyIzoRAsrf6C-EJ8SmoSUItwiMWEgg3OLAfUxETNXMGNIKFEY-BH3WKhzfVv-Ycci-m4g2WxUUuUX5aiGjzKmWmJhc1D52AlsKfB2kMF1H0Xv2ZwbSvJ617nucFOvJ-tV5f305fN7dX7nLhO-sbunSOy8XN6hje0PC4vr5ZMcc9Xk8j6rMo30xWwIubsDNRKuD7ZHU35RvXcV3n2oWPlbtazW-Dq-WRwbWzdG6PR3dy5bAY0M4RxzwVp6nYKEh-AUXsyokg4PP6JozqkAeMqe1APyTlayo22Vvh059TtfNGIf8XafY_gQ">