Skip to content

Commit 56905da

Browse files
authored
[clang] fix half && bfloat16 convert node expr codegen (#89051)
Data type conversion between fp16 and bf16 will generate fptrunc and fpextend nodes, but they are actually bitcast nodes.
1 parent ffcff4a commit 56905da

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

clang/lib/CodeGen/CGExprScalar.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1455,6 +1455,10 @@ Value *ScalarExprEmitter::EmitScalarCast(Value *Src, QualType SrcType,
14551455
return Builder.CreateFPToUI(Src, DstTy, "conv");
14561456
}
14571457

1458+
if ((DstElementTy->is16bitFPTy() && SrcElementTy->is16bitFPTy())) {
1459+
Value *FloatVal = Builder.CreateFPExt(Src, Builder.getFloatTy(), "fpext");
1460+
return Builder.CreateFPTrunc(FloatVal, DstTy, "fptrunc");
1461+
}
14581462
if (DstElementTy->getTypeID() < SrcElementTy->getTypeID())
14591463
return Builder.CreateFPTrunc(Src, DstTy, "conv");
14601464
return Builder.CreateFPExt(Src, DstTy, "conv");
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -disable-O0-optnone -emit-llvm \
2+
// RUN: %s -o - | opt -S -passes=mem2reg | FileCheck %s
3+
4+
// CHECK-LABEL: define dso_local half @test_convert_from_bf16_to_fp16(
5+
// CHECK-SAME: bfloat noundef [[A:%.*]]) #[[ATTR0:[0-9]+]] {
6+
// CHECK-NEXT: entry:
7+
// CHECK-NEXT: [[FPEXT:%.*]] = fpext bfloat [[A]] to float
8+
// CHECK-NEXT: [[FPTRUNC:%.*]] = fptrunc float [[FPEXT]] to half
9+
// CHECK-NEXT: ret half [[FPTRUNC]]
10+
//
11+
_Float16 test_convert_from_bf16_to_fp16(__bf16 a) {
12+
return (_Float16)a;
13+
}
14+
15+
// CHECK-LABEL: define dso_local bfloat @test_convert_from_fp16_to_bf16(
16+
// CHECK-SAME: half noundef [[A:%.*]]) #[[ATTR0]] {
17+
// CHECK-NEXT: entry:
18+
// CHECK-NEXT: [[FPEXT:%.*]] = fpext half [[A]] to float
19+
// CHECK-NEXT: [[FPTRUNC:%.*]] = fptrunc float [[FPEXT]] to bfloat
20+
// CHECK-NEXT: ret bfloat [[FPTRUNC]]
21+
//
22+
__bf16 test_convert_from_fp16_to_bf16(_Float16 a) {
23+
return (__bf16)a;
24+
}
25+

0 commit comments

Comments
 (0)