<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/152844>152844</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[AVR][clang] Attribute half float type to float32
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
benshi001
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
benshi001
</td>
</tr>
</table>
<pre>
As https://gcc.gnu.org/wiki/avr-gcc, double type is attributed to float32 on avr-gcc-7.3, since libgcc-7.3 does not contains infrastructure for float64 type. And clang follows this way. However clang should also treats float16 as float32.
```c++
void qww(double *p ) {
*p = p[1] + 1.0;
}
```
is compiled to the following IR file by llc
```
; Function Attrs: noinline nounwind optnone
define dso_local void @qww(ptr noundef %p) addrspace(1) #0 {
entry:
%p.addr = alloca ptr, align 1
store ptr %p, ptr %p.addr, align 1
%0 = load ptr, ptr %p.addr, align 1
%arrayidx = getelementptr inbounds float, ptr %0, i16 1
%1 = load float, ptr %arrayidx, align 1
%add = fadd float %1, 1.000000e+00
%2 = load ptr, ptr %p.addr, align 1
store float %add, ptr %2, align 1
ret void
}
```
However clang can not handle float16 type correctly, it should also treats fp16 as float32.
fp16 operations are miscompiled.
```c++
void qww(__fp16 *p ) {
*p = p[1] + 1.0;
}
```
; Function Attrs: noinline nounwind optnone
define dso_local void @qww(ptr noundef %p) addrspace(1) #0 {
entry:
%p.addr = alloca ptr, align 1
store ptr %p, ptr %p.addr, align 1
%0 = load ptr, ptr %p.addr, align 1
%arrayidx = getelementptr inbounds i16, ptr %0, i16 1
%1 = load i16, ptr %arrayidx, align 1
%2 = call addrspace(1) float @llvm.convert.from.fp16.f32(i16 %1)
%add = fadd float %2, 1.000000e+00
%3 = call addrspace(1) i16 @llvm.convert.to.fp16.f32(float %add)
%4 = load ptr, ptr %p.addr, align 1
store i16 %3, ptr %4, align 1
ret void
}
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzUVs-P6yYQ_mvIZbQWxr-Sgw_Ji6L2-g69rjCMbVoCLuCk-e8riJPNptvte1V7eBFSEMw3M98wnzXcezUYxJZUO8JYh8aPitKcMEaq_YrPYbSuvR-vOisv7dbDGMLkSbEl7EDYYRAiG8ycWTcQdjir3xRhB35yL4MQhH0BaedOI4TLhKA88BCc6uaAEoKFXlseCgbWwAJ5abIiwrwyAkGrbjkDadGDsQGENYEr40GZ3nEf3CzC7BB6667-6jJFy2BrJAjNzQC91dqePYRReTjzSwY_2TOe0C33frSzlsC1txAc8uCvrvIauL9lmRG6jaum1yUI28VFtyerJPx-PhO2XugStp2AsA2QJhrA7Xc9L_YwkWqXk2oPhO0gzygpoh1p9o8RrgGVB2GPk9LXmoURFz7KDPDzV-iVRuguoLV4yjDuix0cZiOCsga2Ibj4cmCsMloZBGNnc1ZGgp2CsQYJ3Urs44309lVbwTUkdqSkV4JTcAklsQfCqimS5FI6P3GBhK3zxJoVdKGOJrhL7JZYhQjIonWqAdcxAEzBxRfnWg0G8mjng3UYz5cIX-77BH6yjhc0OdSWy5u7zxCEVdw5flHyj4QbMKDGI5oQUcp0kd_y7g--aNyrvH4Lm7-FfTa-BfggWS5lwvVxk3DJV7TMM5p-SNiO0huAfRe7pXx3x1zKBwh7tnYY0hP_Xfu9V4rgJqlw5EZqvKskyVtY51AEfUl1Ch-qavpIUunUTuh4bFMP3CEclb91ffaPqnt9TS7-O9X9iKr532XzrbpRef2tqnlv-olmrhIQXOu_1m3p9JJqfTpmwpoTupD1zh6z2BZZXzDC1io1SJTZ5nMhso-FSFhVfJJEcv-UQrCPCbwX5D2J8t-IeyFTPJiX3yXslWwLuSk2fIVt3lRlw9ZN3azGdlN061z2peC0EB3d0JzmZV4XfYMllnW9Ui2jrKJruqHrYsOaTDY157wveV1XXVlyUlI8cqWzVAvrhpXyfsY2r9i6LFead6j9MnSkj8oycLg2Al66efCxkMoH_-YiqKDTpLL95Sup9qTaXaHVPukzjRQwct0v75g-SG8Txmp2un0aXFQY5y4T9kjYIcZZ_l4mZ39FEQg7pLw9YYcl9VPL_gwAAP__3W29Zw">