diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -6276,13 +6276,6 @@ return ABIArgInfo::getDirect(ResType); } - // __bf16 gets passed using the bfloat IR type, or using i32 but - // with the top 16 bits unspecified. - if (Ty->isBFloat16Type() && IsFloatABISoftFP) { - llvm::Type *ResType = llvm::Type::getInt32Ty(getVMContext()); - return ABIArgInfo::getDirect(ResType); - } - if (!isAggregateTypeForABI(Ty)) { // Treat an enum type as its underlying type. if (const EnumType *EnumTy = Ty->getAs()) { @@ -6497,15 +6490,6 @@ return ABIArgInfo::getDirect(ResType); } - // if we're using the softfp float abi, __bf16 get returned as if it were an - // int but with the top 16 bits unspecified. - if (RetTy->isBFloat16Type()) { - llvm::Type *ResType = IsAAPCS_VFP ? - llvm::Type::getBFloatTy(getVMContext()) : - llvm::Type::getInt32Ty(getVMContext()); - return ABIArgInfo::getDirect(ResType); - } - if (!isAggregateTypeForABI(RetTy)) { // Treat an enum type as its underlying type. if (const EnumType *EnumTy = RetTy->getAs()) diff --git a/clang/test/CodeGen/arm-bf16-params-returns.c b/clang/test/CodeGen/arm-bf16-params-returns.c --- a/clang/test/CodeGen/arm-bf16-params-returns.c +++ b/clang/test/CodeGen/arm-bf16-params-returns.c @@ -13,9 +13,8 @@ // CHECK32-HARD: ret bfloat %v // CHECK64-HARD: define bfloat @test_ret_bf16(bfloat returned %v) {{.*}} { // CHECK64-HARD: ret bfloat %v -// CHECK32-SOFTFP: define i32 @test_ret_bf16(i32 [[V0:.*]]) {{.*}} { -// CHECK32-SOFTFP: %tmp2.0.insert.ext = and i32 [[V0]], 65535 -// CHECK32-SOFTFP: ret i32 %tmp2.0.insert.ext +// CHECK32-SOFTFP: define bfloat @test_ret_bf16(bfloat returned %v) {{.*}} { +// CHECK32-SOFTFP: ret bfloat %v // CHECK64-SOFTFP: define bfloat @test_ret_bf16(bfloat returned %v) {{.*}} { // CHECK64-SOFTFP: ret bfloat %v diff --git a/clang/test/CodeGen/arm-mangle-bf16.cpp b/clang/test/CodeGen/arm-mangle-bf16.cpp --- a/clang/test/CodeGen/arm-mangle-bf16.cpp +++ b/clang/test/CodeGen/arm-mangle-bf16.cpp @@ -1,8 +1,6 @@ -// RUN: %clang_cc1 -triple aarch64-arm-none-eabi -target-feature +bf16 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK64 -// RUN: %clang_cc1 -triple arm-arm-none-eabi -target-feature +bf16 -mfloat-abi hard -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK32-HARD -// RUN: %clang_cc1 -triple arm-arm-none-eabi -target-feature +bf16 -mfloat-abi softfp -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK32-SOFTFP +// RUN: %clang_cc1 -triple aarch64-arm-none-eabi -target-feature +bf16 -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple arm-arm-none-eabi -target-feature +bf16 -mfloat-abi hard -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple arm-arm-none-eabi -target-feature +bf16 -mfloat-abi softfp -emit-llvm -o - %s | FileCheck %s -// CHECK64: define {{.*}}void @_Z3foou6__bf16(bfloat %b) -// CHECK32-HARD: define {{.*}}void @_Z3foou6__bf16(bfloat %b) -// CHECK32-SOFTFP: define {{.*}}void @_Z3foou6__bf16(i32 %b.coerce) +// CHECK: define {{.*}}void @_Z3foou6__bf16(bfloat %b) void foo(__bf16 b) {}