Skip to content

Commit ab54c7e

Browse files
authored
[SYCL-MLIR] Support _Float16 type (#7267)
Emit warning when using this type in an unsupported target, as promotion is not yet implemented. Signed-off-by: Victor Perez <[email protected]>
1 parent 480bc63 commit ab54c7e

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

polygeist/tools/cgeist/Lib/CodeGenTypes.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1586,6 +1586,14 @@ mlir::Type CodeGenTypes::getMLIRType(clang::QualType QT, bool *implicitRef,
15861586
return builder.getF80Type();
15871587
if (T->isFP128Ty())
15881588
return builder.getF128Type();
1589+
if (T->is16bitFPTy()) {
1590+
if (CGM.getTarget().shouldEmitFloat16WithExcessPrecision()) {
1591+
llvm::WithColor::warning()
1592+
<< "Experimental usage of _Float16. Code generated will be illegal "
1593+
"for this target. Use with caution.\n";
1594+
}
1595+
return builder.getF16Type();
1596+
}
15891597

15901598
if (auto IT = dyn_cast<llvm::IntegerType>(T)) {
15911599
return builder.getIntegerType(IT->getBitWidth());
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
// RUN: cgeist %s --function=* -S -march=x86-64 2>&1 | FileCheck %s --check-prefix=CHECK-EXTEND
2+
// RUN: cgeist %s --function=* -S -march=sapphirerapids 2>&1 | FileCheck %s --check-prefix=CHECK-NATIVE
3+
4+
// COM: sapphirerapids supports _Float16 natively
5+
6+
// CHECK-EXTEND: warning: Experimental usage of _Float16.
7+
// CHECK-NATIVE-NOT: warning: Experimental usage of _Float16.
8+
9+
// CHECK-EXTEND-LABEL: func.func @type(%arg0: f16) -> f16
10+
// CHECK-EXTEND-NEXT: return %arg0 : f16
11+
// CHECK-EXTEND-NEXT: }
12+
13+
// CHECK-NATIVE-LABEL: func.func @type(%arg0: f16) -> f16
14+
// CHECK-NATIVE-NEXT: return %arg0 : f16
15+
// CHECK-NATIVE-NEXT: }
16+
17+
_Float16 type(_Float16 arg) {
18+
return arg;
19+
}
20+
21+
// CHECK-EXTEND-LABEL: func.func @arith(%arg0: f16, %arg1: f16, %arg2: f16, %arg3: f16, %arg4: f16) -> f16
22+
// CHECK-EXTEND-NEXT: %[[ADD:.*]] = arith.addf %arg0, %arg1 : f16
23+
// CHECK-EXTEND-NEXT: %[[NEG:.*]] = arith.negf %arg3 : f16
24+
// CHECK-EXTEND-NEXT: %[[MUL:.*]] = arith.mulf %arg2, %[[NEG]] : f16
25+
// CHECK-EXTEND-NEXT: %[[DIV:.*]] = arith.divf %[[MUL]], %arg4 : f16
26+
// CHECK-EXTEND-NEXT: %[[SUB:.*]] = arith.subf %[[ADD]], %[[DIV]] : f16
27+
// CHECK-EXTEND-NEXT: return %[[SUB]] : f16
28+
// CHECK-EXTEND-NEXT: }
29+
30+
// CHECK-NATIVE-LABEL: func.func @arith(%arg0: f16, %arg1: f16, %arg2: f16, %arg3: f16, %arg4: f16) -> f16
31+
// CHECK-NATIVE-NEXT: %[[ADD:.*]] = arith.addf %arg0, %arg1 : f16
32+
// CHECK-NATIVE-NEXT: %[[NEG:.*]] = arith.negf %arg3 : f16
33+
// CHECK-NATIVE-NEXT: %[[MUL:.*]] = arith.mulf %arg2, %[[NEG]] : f16
34+
// CHECK-NATIVE-NEXT: %[[DIV:.*]] = arith.divf %[[MUL]], %arg4 : f16
35+
// CHECK-NATIVE-NEXT: %[[SUB:.*]] = arith.subf %[[ADD]], %[[DIV]] : f16
36+
// CHECK-NATIVE-NEXT: return %[[SUB]] : f16
37+
// CHECK-NATIVE-NEXT: }
38+
39+
_Float16 arith(_Float16 a,
40+
_Float16 b,
41+
_Float16 c,
42+
_Float16 d,
43+
_Float16 e) {
44+
return (+a) + b - c * (-d) / e;
45+
}
46+
47+
// CHECK-EXTEND-LABEL: func.func @compound_assign(%arg0: memref<?xf16>, %arg1: f16)
48+
// CHECK-EXTEND-NEXT: %[[ORIG:.*]] = affine.load %arg0[0] : memref<?xf16>
49+
// CHECK-EXTEND-NEXT: %[[ADD:.*]] = arith.addf %[[ORIG]], %arg1 : f16
50+
// CHECK-EXTEND-NEXT: affine.store %[[ADD]], %arg0[0] : memref<?xf16>
51+
// CHECK-EXTEND-NEXT: return
52+
// CHECK-EXTEND-NEXT: }
53+
54+
// CHECK-NATIVE-LABEL: func.func @compound_assign(%arg0: memref<?xf16>, %arg1: f16)
55+
// CHECK-NATIVE-NEXT: %[[ORIG:.*]] = affine.load %arg0[0] : memref<?xf16>
56+
// CHECK-NATIVE-NEXT: %[[ADD:.*]] = arith.addf %[[ORIG]], %arg1 : f16
57+
// CHECK-NATIVE-NEXT: affine.store %[[ADD]], %arg0[0] : memref<?xf16>
58+
// CHECK-NATIVE-NEXT: return
59+
// CHECK-NATIVE-NEXT: }
60+
61+
void compound_assign(_Float16 *a, _Float16 b) {
62+
*a += b;
63+
}

0 commit comments

Comments
 (0)