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

    <tr>
        <th>Summary</th>
        <td>
            c++: converting uint32_t xvalue to rvalue reference to float does not work in this:
        </td>
    </tr>

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

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

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

<pre>
    Please take a look at the following code, which tends to break float into uint parts for transfer, (not for calculation, so endian is not considered) , and to build it back.

The MergeFloat_Wrongly does not generate expected result as MergeFloat does:

inline void SplitFloat32(bool &sign_bit, uint &exponent, uint &mantissa, const float value)
{
    float copy = value;
    uint32_t *p = (uint32_t *)&copy;
    
    sign_bit = (*p & 0x80000000) != 0;
 exponent = (*p & 0x7F800000) >> 23;
    mantissa = (*p & 0x007FFFFF);
}

float MergeFloat(const bool sign_bit, const uint exponent, const uint mantissa)

// this works:
    uint32_t Temp = uint32_t((sign_bit ? 0x80000000 : 0) | (exponent << 23) | mantissa);
 return (float&)Temp;
}

float MergeFloat_Wrongly(const bool sign_bit, const uint exponent, const uint mantissa)
{
// THIS DOES NOT WORK, the compiler directly convert uint32 xvalue to float, which is expected to be loaded directly
    auto f = (float&&)(uint32_t((sign_bit ? 0x80000000 : 0) | (exponent << 23) | mantissa));
    return f;
}

///////// THE ASM IN MEMORY ////////
    0x100003080 <+0>: pushq  %rbp
    0x100003081 <+1>:  movq   %rsp, %rbp
    0x100003084 <+4>:  movb   %dil, %al
    0x100003087 <+7>:  andb   $0x1, %al
 0x100003089 <+9>:  movb   %al, -0x1(%rbp)
    0x10000308c <+12>: movl %esi, -0x8(%rbp)
    0x10000308f <+15>: movl   %edx, -0xc(%rbp)
 0x100003092 <+18>: movzbl -0x1(%rbp), %eax
    0x100003096 <+22>: shll $0x1f, %eax
    0x100003099 <+25>: movl   -0x8(%rbp), %ecx
 0x10000309c <+28>: shll   $0x17, %ecx
    0x10000309f <+31>: orl    %ecx, %eax
    0x1000030a1 <+33>: movl   -0xc(%rbp), %ecx
    0x1000030a4 <+36>: orl    %ecx, %eax
 ->  0x1000030a6 <+38>: cvtsi2ss %rax, %xmm0
 0x1000030ab <+43>: movss  %xmm0, -0x14(%rbp)

it seems it did a normal direct conversion from uint32(eax)->64(rax)->double(xmm0) with cvtsi2ss

Environment:
Apple clang version 14.0.0 (clang-1400.0.29.202)
Target: x86_64-apple-darwin22.2.0
(btw: g++ seems to have same issue)

I hope it's my understanding of c++ grammar that went wrong. 
Anyway, thanks for any possible reply
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0V01v2zgQ_TX0ZRCDpmxZOvjgNDFaLNIsmgDFngJKGlvcUKRK0l_99QtKpCU3abeHXSNwFGrem5k35HDCrRU7hbgii1uyuJvwvau1WYnme72XYlLo6rz6UyK3CI6_InCQWr8Cd-BqhK2WUh-F2kGpKyTsAxxrUdbgUFUWnIbCIH-FrdTcgVBOw14oBy03zsJWG3CGK7tF46GEZUq7brnkstxL7oRW_o3VgKoSXIGw4G1Krayo0GBFWA7ehKuq87cXsgLhoODl65TQO0LX_fdzjfCAZocbH8zLV6PVTp6h0thT7lCh4Q4BTy2WDiswaPfSAbcjXGdPkvWYWSgpFMJBiwqeWilcZ5kwwrJCawmEpV7jl0I4H2mnAGEpnlqtUF2tNVw5YS33az5HF6Q7cLlHwvLgdnnbPwBAMCh1ewaS3AXLZGTguRP24vnXbWdDWDZe9Lws9QxXuOEpRh_BPRFLgZ4y2n_6Msy8AR1YYorvAJebbAAm9yS5B5Zc-Y9avAOmdLnxHx95hJDl3bgovSxD4QjLekG7kozr0S93FRiXZLQ8VGUoQJCHsA1hG3C1sHDU5nXYG1fSP2PTSx9XunyykbCbkZhAkjX0yiy7YzHS8QNJPnilwstxaBfxDLq9UR647VNPCct9CL8rVjwd_7VoV5o9f_z0BHeP90_w-fEZvj5--cMz-K5S6qYVEg1UwmDp5NnzHtC4IB-cul3uz3tIMPYdYYfj67sBgtS8wurCNNSG7z08bq5BqLQ7Dtn_WahxrQBiubY_q06v17s_8PzxHtZPD_DpMzzcPzx--Qt-an3xR08zH3xCM9rFyW5pdwLX0O5t_Q2AsIUp2vcAswCYBQA0-vANeoRt-yb-M-w8YOcjbNFjKyEDlsv3oMsAXUYoV1UPndPT7EfogMsDLn_rkncebzp4FoKOO_XaeRlzZoGl0Qff1BdoReDI_o1jGzkWY44uEKxOgaV8h-VCkbNIkQ0U3wv5NoVeDeSndwLJ08DCYjK2ljLouP01NIrJfsjhTf6BpTy9ySFKybKx91jH5Rvklf-oYRI3nzYSgobl6Zex87hvk-RN7OUvY79iiTs4SX8rght_qY3gUfskZl8enBXM2u7Q8Ehwahr6o3K8iIdnlIC1cLEPe3n-dguFGcWBRWysH40qUQEHpU3DZWiMocFaoRVsjW5Co_UdzceV-1RST24uf1Z6X0gkLOv953AUrr6kNPZ9rw7CaNX4OyLejuu2lQil5GoH0fFsPqVT6ttot34zm1M6pVOWTxlll3yeudmhJ4JTlr6k8xvuqW4qbo5CMTZlUxrbZla4ozfcEXZL2G1QwGmo-QHB8gZBWDserLrvT1DrFsFfdEsLzRn2qkJjHVeVn3T1FspAuDO8abgBV3MHR9_3j_7inIbhYK3OR37ubzWuXvuJl6sztNpaUUgEg608T6pVUuVJzie4mqXLRZ4s5nk2qVecLpblYpljmuZllZcZLfMiXfL5olqkVVZNxIpRllBGc5on2Syb5rPFNs2WdF4gXWCyJHOKDRdyKuWhmWqzm3QJr1KassVE8gKl7SZ_xhQeoxrM_yNgVh5zU-x3lsypFNbZgcUJJ3EVZOi2cn9Be30uQ89wS5v-yeAWDapyuLmH8dsPTyBUN0mRZD3ZG7mqnWu7gaq7wHbC1ftiWuqGsI2PJPy6aY3-G0tH2KaL3xK26fL7JwAA___mzp6b">