<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/62260>62260</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Miscompilation of union containing __fp16 and _BitInt for big-endian targets
</td>
</tr>
<tr>
<th>Labels</th>
<td>
miscompilation
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
ostannard
</td>
</tr>
</table>
<pre>
clang generates incorrect code for function foo in this example, at all optimisation levels, and when targeting any big-endian architecture:
```c
union U1 {
__fp16 M0;
_BitInt(28) M1;
};
union U2 {
__fp16 M0;
int M1;
};
union U1 foo() {
union U1 result = {1.0};
return result;
}
union U2 bar() {
union U2 result = {1.0};
return result;
}
```
The encoding of 1.0 in FP16 is 0x3c00 (checked with https://evanw.github.io/float-toy/), so that must appear in the return value somewhere, but for foo, that value gets shifted and truncated to 0xc00:
```
$ /work/llvm/build/bin/clang --target=arm-none-eabi -march=armv7-a -c test.c -o - -S -O1 -mbig-endian
...
foo:
.fnstart
mov r0, #-1073741824
bx lr
...
bar:
.fnstart
mov r0, #1006632960
bx lr
...
```
The generated code for AArch64 is similar:
```
$ /work/llvm/build/bin/clang --target=aarch64-none-eabi -c test.c -o - -S -O1 -mbig-endian
...
foo: // @foo
// %bb.0: // %entry
mov x0, #-4611686018427387904 // =0xc000000000000000
ret
...
bar: // @bar
// %bb.0: // %entry
mov x0, #4323455642275676160 // =0x3c00000000000000
ret
...
```
Powerpc (big-endian) also has the same wrong constants in the output:
```
$ /work/llvm/build/bin/clang --target=powerpc -c test.c -o - -S -O1
...
foo: # @foo
.Lfunc_begin0:
.cfi_startproc
# %bb.0: # %entry
lis 3, -16384
...
.type bar,@function
bar: # @bar
.Lfunc_begin1:
.cfi_startproc
# %bb.0: # %entry
lis 3, 15360
blr
...
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0lktv4zYQgH8NfRlI4EuydPBhdwMDBbroAm3PAUWNLXYlUiCpOPn3BSU_s3GTFlsiiCWSmgfn48yoEMzeIm5I8ZkUDys1xc75jQtRWat8u2pc-7LRvbJ72KNFryIGMFY771FH0K5F2DkPu8nqaJyFnXNgLMTOBMBnNYw9Ev4FVATV9-DGaAYT1Ly1xyfsw7xqWzh0aCEqv8do7B6UfYHG7DO0rVEWlNediajj5JGIT4Q-EHr6X9LlTy_vk03C_2RA1p-XGYDHx93ISvhKibjMfTbxFxsJr3hFeA1f2XmRrB8uz9dC-XtCjY0fEsTSQZFF8ZXI86rHMPURiHhIyyyn15IAPMbJ2-OuG21v2dwof1cVf0fVe5pOh3-t-I8OAa12bQqk2wHLaWJi-42VYALQZ6EpBcIr3aH-ji0cTOygi3EMKbZ8S_gWn5Q95HsTu6nJjSN8u-udill0L_OGOnETHMRORRimEEGNIyq_wIcnu59UPyEEN-ChQz-j2ExxQTYF4MsiYNm2xxggdGYXsZ2ZjH6yWqW36IA-a0rvsXd85RII3x6c_074tu-fBsK3zWT6Nv0aS_h2uUtZtpBOxIPyQ2adxQxVYyAbEunL9NM6U5BpiBhiriFzkEH2O2S_MciGy91YVOd5vjwkt05GQr6zISofT0FfxuCe5l9P0wEQLjJG12ItWcXl7c7mGXr_SkGi6azgOD6oh1FaloLXp_NK8ufxg5K7XJ2yUHvJPZ8-ed2VMqEVzGD6K_t-RnzULP06Rv8tJLCADUTSNHE0aJniRdPkCS7453HZjzb6l-Mpns75-RxPWTJWViVlleRrUa1rKl9JEA8zzzfjcuXfDPk7tt2IlzR9c8fHt714Bc3ZGSm4kEVRSs7XRbkuWUlfa0vOCP1BZ95E65s7oB91SkpXYeQ1qD446FSYk0pQA8LBO7sH7RLxNoZTwnFTHKf4M8kbjza9yds9xMQNX_mvqTA_Nrg3lv54a_XOPM73dvROnwwVt6ESd-LUmwAihShjpajkK3sgjy8jpgySas-XZNOxQ_j3RIkbnK5dYv-TS6wQ5xR1HM39FLVqN6KtRa1WuGFlxeqqkLJYdZsdCt7WhSp2tZY1r1tal1Iy3rKmqhrVrMyGUy6o5JRRRmWRF02hZcmxYi2umayIpDgo0-eJmNz5_cqEMOGm5Lykq1412Ie5d-N8MEG7YTT93FwRzlM_5zfpw6yZ9oFI2psQw0VUNLHHzdeb71K5XjoD7WxUxqYSfmx0UkU8Nk1z3r1qzxZmw2ry_ea2jh8ruHbDhfvZptG7v1BHwrezS4Hw7ezV3wEAAP__kuLl4g">