Issue 152844
Summary [AVR][clang] Attribute half float type to float32
Labels clang
Assignees benshi001
Reporter benshi001
    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
}
```

_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to