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

    <tr>
        <th>Summary</th>
        <td>
            [clang][X86] Lax vector conversion between `long double` and integer vectors of equal sizeof emits an invalid bitcast (<1 x x86_fp80> vs <4 x i32>)
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

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

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

<pre>
    https://godbolt.org/z/v5qx4xYYa (`-O0`, x86_64)

```c
typedef long double a __attribute__((vector_size(16)));
typedef int b __attribute__((vector_size(16)));
a f(b c) { return c; }
```
```
clang: llvm/lib/IR/Instructions.cpp:3111: static llvm::CastInst* llvm::CastInst::Create(...): Assertion `castIsValid(op, S, Ty) && "Invalid cast!"' failed.
 #11 llvm::IRBuilderBase::CreateCast(...)
 #12 (anonymous namespace)::ScalarExprEmitter::VisitCastExpr(clang::CastExpr*) CGExprScalar.cpp
 #14 clang::CodeGen::CodeGenFunction::EmitScalarExpr(clang::Expr const*, bool)
 #15 clang::CodeGen::CodeGenFunction::EmitReturnStmt(clang::ReturnStmt const&)
```

Sema allows the implicit (lax) conversion because both vector types have `sizeof == 16`. CodeGen lowers it to a bitcast, but `<1 x x86_fp80>` is an 80-bit value stored in 16 bytes while `<4 x i32>` is 128 bits, so the bitcast is not valid IR. An explicit cast `(a)c`, the other direction, `long long` elements, and `vector_size(32)` all fail the same way; `double` vectors are fine. Either the conversion should be rejected for `long double` vectors, or CodeGen needs to go through memory for it. Clang trunk, assertions build.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJycVU1vo0gT_jXlS2kQFDaBgw_YiUeRXumVktVo5xQ1ULZ7t-n2dDeOPb9-VUAmzsxcdiWEoLs-n3qqSoWgD5Z5DasNrO4XaohH59etOkWlreXeVVTRonHddX2M8RQgr4F2QLuD6xpnYuL8AWj3HWh3Xn27LC9fvyoEKqFIP_0_hSIF2uKlLF6KJVAFaS1PkU5PC2kdryfueI_G2QN2bmgMo8KXFxWj180Q-eVFzFF55jY6_xL0dwYqs0LMTU--ubGjbcTmP-gr3AOVDbZAFcLdBj3HwVtsId8g3N3fxv3Td2uUPUBeozHnHmhndAO0e3ySlw3RD23UzoakPZ0gr_Msy0Q4RBV1O-nkNeT1VoUo8kD1706nP88qSvxJkoyh11iHwF4coCAq0uGLMroDKt1J0H-W1x_XMS8qgAoEokd7FiEUBaAMiIDucK-04S6BtEagPMtu4nh82gzadOw3KvBtMNvRwltAsyYJB5R19tq7IaBVPYeTanmKGfL6uVVG-YfLyT_0Okb20_EXHXQUi3IDVL5BOwMxndaSyvaz_ExmRmRnz0u81XEdf2b74Wc32LEe06F4f4_lo0c5wdZNJREQG-fMTZKrf-_qaSTVc-zjR1fv528Oi7ldbjmX1s_cK1TGuNeA8cio-5PRrY4Ct1EXAaZ19sw-CCEabtUQGBsXjzjxH6VPAh7VmYUv0g1uj5DfQ36PWQFFmuAcPRr3yj6gjhgdKmx0nNiyxWaIog35NsPL2N77U5lC_gBFijqgslimnxod8azMwBii89yhtpgV2FwjB3w9asOzkSVeUOf0rp9RKe6C-ApuzHT2LrfWjXZ1h49PCdYW-TKjMEqMQ6dUQFU7zx_Rd_HIHjvteSoJbUVwnDryEsdsuGc7eVW2k_uPQyMnKUqRSgXGXhktB9UzvqrrOCiKdJphIjUpB1Seca8tJ_igxyhE66ZM4egG02HD6PkvbiN3uHf-R3i_GJT4nP9RJsvcBSnRQZDybjgcsefe-etoRscEt8I0jH6wf4_JvY2MgI00dbLo1nlX5ZVa8Dq7K6uqTKtiuTium7Tb037VVk1eqpxXXZO3VJHq6K5YLfluodeUUpFWlKXlqkiXSbvfF03R0VKlVdbdKVim3CttEhklsi0WOoSB10SrNC8XRjVswrh-iKaGIJJN5Nei8KkZDgGWqdEhhncTUUcz7qxJY3UPq82fZQGre_yfurxR_UMnxFdm-xtMpdDaRj6w_1Ewt0f-NiiDc3twr-NIaj1PzTcyymb5pQfwHPAjqalaDN78vEB1PA5N0rpxZcybQ1I-eScsANqNSAWg3QzWeU3_BAAA__-G92Ux">