[clang] clang: Remove useFP16ConversionIntrinsics target option (PR #207212)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Jul 2 09:01:11 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-risc-v
Author: Matt Arsenault (arsenm)
<details>
<summary>Changes</summary>
Follow up to #<!-- -->174494. Remove the remnants of the control to
use llvm.convert.to.fp16/llvm.convert.from.fp16. Prefer
directly using the IR half type, unless the value is used
in an ABI context where it needs to remain as i16.
I did the first 80% of this a long time ago, and AI finished
the last bit and handled the recent rebases and test updates.
Co-authored-by: Claude (Opus 4.8) <noreply@<!-- -->anthropic.com>
---
Patch is 34.04 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/207212.diff
24 Files Affected:
- (modified) clang/include/clang/Basic/TargetInfo.h (-10)
- (modified) clang/lib/Basic/Targets/AArch64.h (-4)
- (modified) clang/lib/Basic/Targets/AMDGPU.h (-2)
- (modified) clang/lib/Basic/Targets/ARM.h (-4)
- (modified) clang/lib/Basic/Targets/DirectX.h (-1)
- (modified) clang/lib/Basic/Targets/LoongArch.h (-2)
- (modified) clang/lib/Basic/Targets/NVPTX.h (-2)
- (modified) clang/lib/Basic/Targets/RISCV.h (-4)
- (modified) clang/lib/Basic/Targets/SPIR.h (-4)
- (modified) clang/lib/Basic/Targets/SystemZ.h (-2)
- (modified) clang/lib/Basic/Targets/WebAssembly.h (-1)
- (modified) clang/lib/Basic/Targets/X86.h (-4)
- (modified) clang/lib/CIR/CodeGen/CIRGenExprConstant.cpp (+1-9)
- (modified) clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp (+4-18)
- (modified) clang/lib/CIR/CodeGen/CIRGenTypes.cpp (+1-7)
- (modified) clang/lib/CodeGen/CGExprConstant.cpp (+2-10)
- (modified) clang/lib/CodeGen/CGExprScalar.cpp (+16-38)
- (modified) clang/lib/CodeGen/CodeGenTypes.cpp (+10-18)
- (modified) clang/lib/CodeGen/TargetBuiltins/NVPTX.cpp (+2-20)
- (modified) clang/lib/Sema/SemaChecking.cpp (+5-15)
- (modified) clang/lib/Sema/SemaExpr.cpp (+1-2)
- (modified) clang/test/CodeGen/builtin_float.c (+3-4)
- (modified) clang/test/CodeGen/builtin_float_strictfp.c (+4-4)
- (modified) clang/test/CodeGen/wasm-fp16.c (+30-47)
``````````diff
diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h
index d1914d626c753..b3af03cbc2f66 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -1017,16 +1017,6 @@ class TargetInfo : public TransferrableTargetInfo,
return ComplexLongDoubleUsesFP2Ret;
}
- /// Check whether conversions to and from __fp16 should go through an integer
- /// bitcast with i16.
- ///
- /// FIXME: This function should be removed. The intrinsics / no longer exist,
- /// and are emulated with bitcast + fp cast. This only exists because of
- /// misuse in ABI determining contexts.
- virtual bool useFP16ConversionIntrinsics() const {
- return true;
- }
-
/// Specify if mangling based on address space map should be used or
/// not for language specific address spaces
bool useAddressSpaceMapMangling() const {
diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h
index b4b66db34b9b7..04d0fa84684ef 100644
--- a/clang/lib/Basic/Targets/AArch64.h
+++ b/clang/lib/Basic/Targets/AArch64.h
@@ -171,10 +171,6 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo {
llvm::APInt getFMVPriority(ArrayRef<StringRef> Features) const override;
- bool useFP16ConversionIntrinsics() const override {
- return false;
- }
-
void getTargetDefinesARMV81A(const LangOptions &Opts,
MacroBuilder &Builder) const;
void getTargetDefinesARMV82A(const LangOptions &Opts,
diff --git a/clang/lib/Basic/Targets/AMDGPU.h b/clang/lib/Basic/Targets/AMDGPU.h
index b13e9008b67a4..7bd34526105d3 100644
--- a/clang/lib/Basic/Targets/AMDGPU.h
+++ b/clang/lib/Basic/Targets/AMDGPU.h
@@ -263,8 +263,6 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUTargetInfo final : public TargetInfo {
llvm::SmallVector<Builtin::InfosShard> getTargetBuiltins() const override;
- bool useFP16ConversionIntrinsics() const override { return false; }
-
void getTargetDefines(const LangOptions &Opts,
MacroBuilder &Builder) const override;
diff --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Targets/ARM.h
index 8bd56c8855fe3..976e1e06ae9b2 100644
--- a/clang/lib/Basic/Targets/ARM.h
+++ b/clang/lib/Basic/Targets/ARM.h
@@ -177,10 +177,6 @@ class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public TargetInfo {
bool setFPMath(StringRef Name) override;
- bool useFP16ConversionIntrinsics() const override {
- return false;
- }
-
void getTargetDefinesARMV81A(const LangOptions &Opts,
MacroBuilder &Builder) const;
void getTargetDefinesARMV82A(const LangOptions &Opts,
diff --git a/clang/lib/Basic/Targets/DirectX.h b/clang/lib/Basic/Targets/DirectX.h
index 8b21b86bac264..64e5533bbffeb 100644
--- a/clang/lib/Basic/Targets/DirectX.h
+++ b/clang/lib/Basic/Targets/DirectX.h
@@ -70,7 +70,6 @@ class LLVM_LIBRARY_VISIBILITY DirectXTargetInfo : public TargetInfo {
resetDataLayout();
TheCXXABI.set(TargetCXXABI::GenericItanium);
}
- bool useFP16ConversionIntrinsics() const override { return false; }
void getTargetDefines(const LangOptions &Opts,
MacroBuilder &Builder) const override;
diff --git a/clang/lib/Basic/Targets/LoongArch.h b/clang/lib/Basic/Targets/LoongArch.h
index 16124a87d4955..4c98f9d0e40ae 100644
--- a/clang/lib/Basic/Targets/LoongArch.h
+++ b/clang/lib/Basic/Targets/LoongArch.h
@@ -107,8 +107,6 @@ class LLVM_LIBRARY_VISIBILITY LoongArchTargetInfo : public TargetInfo {
bool hasBFloat16Type() const override { return true; }
- bool useFP16ConversionIntrinsics() const override { return false; }
-
bool handleTargetFeatures(std::vector<std::string> &Features,
DiagnosticsEngine &Diags) override;
diff --git a/clang/lib/Basic/Targets/NVPTX.h b/clang/lib/Basic/Targets/NVPTX.h
index 8af9cb91c47ab..00be0fe54c1bd 100644
--- a/clang/lib/Basic/Targets/NVPTX.h
+++ b/clang/lib/Basic/Targets/NVPTX.h
@@ -82,8 +82,6 @@ class LLVM_LIBRARY_VISIBILITY NVPTXTargetInfo : public TargetInfo {
llvm::SmallVector<Builtin::InfosShard> getTargetBuiltins() const override;
- bool useFP16ConversionIntrinsics() const override { return false; }
-
bool isCLZForZeroUndef() const override { return false; }
bool
diff --git a/clang/lib/Basic/Targets/RISCV.h b/clang/lib/Basic/Targets/RISCV.h
index 193f77fe68a0b..73287c5d2d58d 100644
--- a/clang/lib/Basic/Targets/RISCV.h
+++ b/clang/lib/Basic/Targets/RISCV.h
@@ -117,10 +117,6 @@ class RISCVTargetInfo : public TargetInfo {
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;
- bool useFP16ConversionIntrinsics() const override {
- return false;
- }
-
bool isValidCPUName(StringRef Name) const override;
void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;
bool isValidTuneCPUName(StringRef Name) const override;
diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h
index 389cc075a3a0b..42256920f353e 100644
--- a/clang/lib/Basic/Targets/SPIR.h
+++ b/clang/lib/Basic/Targets/SPIR.h
@@ -173,10 +173,6 @@ class LLVM_LIBRARY_VISIBILITY BaseSPIRTargetInfo : public TargetInfo {
}
public:
- // SPIR supports the half type and the only llvm intrinsic allowed in SPIR is
- // memcpy as per section 3 of the SPIR spec.
- bool useFP16ConversionIntrinsics() const override { return false; }
-
llvm::SmallVector<Builtin::InfosShard> getTargetBuiltins() const override {
return {};
}
diff --git a/clang/lib/Basic/Targets/SystemZ.h b/clang/lib/Basic/Targets/SystemZ.h
index 70b529e8ca854..d56306c7c4a88 100644
--- a/clang/lib/Basic/Targets/SystemZ.h
+++ b/clang/lib/Basic/Targets/SystemZ.h
@@ -107,8 +107,6 @@ class LLVM_LIBRARY_VISIBILITY SystemZTargetInfo : public TargetInfo {
unsigned getMinGlobalAlign(uint64_t Size, bool HasNonWeakDef) const override;
- bool useFP16ConversionIntrinsics() const override { return false; }
-
void getTargetDefines(const LangOptions &Opts,
MacroBuilder &Builder) const override;
diff --git a/clang/lib/Basic/Targets/WebAssembly.h b/clang/lib/Basic/Targets/WebAssembly.h
index 88192a756cc4f..0b0266a48469a 100644
--- a/clang/lib/Basic/Targets/WebAssembly.h
+++ b/clang/lib/Basic/Targets/WebAssembly.h
@@ -120,7 +120,6 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo {
StringRef getABI() const override;
bool setABI(const std::string &Name) override;
- bool useFP16ConversionIntrinsics() const override { return !HasFP16; }
protected:
void getTargetDefines(const LangOptions &Opts,
diff --git a/clang/lib/Basic/Targets/X86.h b/clang/lib/Basic/Targets/X86.h
index b0daffbea4576..641bb78906610 100644
--- a/clang/lib/Basic/Targets/X86.h
+++ b/clang/lib/Basic/Targets/X86.h
@@ -338,10 +338,6 @@ class LLVM_LIBRARY_VISIBILITY X86TargetInfo : public TargetInfo {
return "";
}
- bool useFP16ConversionIntrinsics() const override {
- return false;
- }
-
void getTargetDefines(const LangOptions &Opts,
MacroBuilder &Builder) const override;
diff --git a/clang/lib/CIR/CodeGen/CIRGenExprConstant.cpp b/clang/lib/CIR/CodeGen/CIRGenExprConstant.cpp
index 384b975b3f422..ffb0f9148c876 100644
--- a/clang/lib/CIR/CodeGen/CIRGenExprConstant.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenExprConstant.cpp
@@ -1304,18 +1304,10 @@ mlir::Attribute ConstantEmitter::tryEmitPrivate(const APValue &value,
return cir::IntAttr::get(ty, value.getInt());
}
case APValue::Float: {
- const llvm::APFloat &init = value.getFloat();
- if (&init.getSemantics() == &llvm::APFloat::IEEEhalf() &&
- !cgm.getASTContext().getLangOpts().NativeHalfType &&
- cgm.getASTContext().getTargetInfo().useFP16ConversionIntrinsics()) {
- cgm.errorNYI("ConstExprEmitter::tryEmitPrivate half");
- return {};
- }
-
mlir::Type ty = cgm.convertType(destType);
assert(mlir::isa<cir::FPTypeInterface>(ty) &&
"expected floating-point type");
- return cir::FPAttr::get(ty, init);
+ return cir::FPAttr::get(ty, value.getFloat());
}
case APValue::Array: {
const ArrayType *arrayTy = cgm.getASTContext().getAsArrayType(destType);
diff --git a/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp b/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp
index 3c2d2726ac9fa..645cca9fe16eb 100644
--- a/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp
@@ -969,19 +969,10 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
if (srcType->isHalfType() &&
!cgf.getContext().getLangOpts().NativeHalfType) {
// Cast to FP using the intrinsic if the half type itself isn't supported.
- if (mlir::isa<cir::FPTypeInterface>(mlirDstType)) {
- if (cgf.getContext().getTargetInfo().useFP16ConversionIntrinsics())
- cgf.getCIRGenModule().errorNYI(loc,
- "cast via llvm.convert.from.fp16");
- } else {
- // Cast to other types through float, using either the intrinsic or
- // FPExt, depending on whether the half type itself is supported (as
- // opposed to operations on half, available with NativeHalfType).
- if (cgf.getContext().getTargetInfo().useFP16ConversionIntrinsics())
- cgf.getCIRGenModule().errorNYI(loc,
- "cast via llvm.convert.from.fp16");
- // FIXME(cir): For now lets pretend we shouldn't use the conversion
- // intrinsics and insert a cast here unconditionally.
+ if (!mlir::isa<cir::FPTypeInterface>(mlirDstType)) {
+ // Cast to other types through float, using FPExt, depending on whether
+ // the half type itself is supported (as opposed to operations on half,
+ // available with NativeHalfType).
src = builder.createCast(cgf.getLoc(loc), cir::CastKind::floating, src,
cgf.floatTy);
srcType = cgf.getContext().FloatTy;
@@ -1039,11 +1030,6 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
res = emitScalarCast(src, srcType, dstType, mlirSrcType, mlirDstType, opts);
if (mlirDstType != resTy) {
- if (cgf.getContext().getTargetInfo().useFP16ConversionIntrinsics()) {
- cgf.getCIRGenModule().errorNYI(loc, "cast via llvm.convert.to.fp16");
- }
- // FIXME(cir): For now we never use FP16 conversion intrinsics even if
- // required by the target. Change that once this is implemented
res = builder.createCast(cgf.getLoc(loc), cir::CastKind::floating, res,
resTy);
}
diff --git a/clang/lib/CIR/CodeGen/CIRGenTypes.cpp b/clang/lib/CIR/CodeGen/CIRGenTypes.cpp
index 3170666304a06..298c44d849782 100644
--- a/clang/lib/CIR/CodeGen/CIRGenTypes.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenTypes.cpp
@@ -449,13 +449,7 @@ mlir::Type CIRGenTypes::convertType(QualType type) {
resultType = cgm.fP16Ty;
break;
case BuiltinType::Half:
- if (astContext.getLangOpts().NativeHalfType ||
- !astContext.getTargetInfo().useFP16ConversionIntrinsics()) {
- resultType = cgm.fP16Ty;
- } else {
- cgm.errorNYI(SourceLocation(), "processing of built-in type", type);
- resultType = cgm.sInt32Ty;
- }
+ resultType = cgm.fP16Ty;
break;
case BuiltinType::BFloat16:
resultType = cgm.bFloat16Ty;
diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp
index 7a2b00647f189..27b7423a42f98 100644
--- a/clang/lib/CodeGen/CGExprConstant.cpp
+++ b/clang/lib/CodeGen/CGExprConstant.cpp
@@ -2598,16 +2598,8 @@ ConstantEmitter::tryEmitPrivate(const APValue &Value, QualType DestType,
llvm::StructType::get(Complex[0]->getType(), Complex[1]->getType());
return llvm::ConstantStruct::get(STy, Complex);
}
- case APValue::Float: {
- const llvm::APFloat &Init = Value.getFloat();
- if (&Init.getSemantics() == &llvm::APFloat::IEEEhalf() &&
- !CGM.getContext().getLangOpts().NativeHalfType &&
- CGM.getContext().getTargetInfo().useFP16ConversionIntrinsics())
- return llvm::ConstantInt::get(CGM.getLLVMContext(),
- Init.bitcastToAPInt());
- else
- return llvm::ConstantFP::get(CGM.getLLVMContext(), Init);
- }
+ case APValue::Float:
+ return llvm::ConstantFP::get(CGM.getLLVMContext(), Value.getFloat());
case APValue::ComplexFloat: {
llvm::Constant *Complex[2];
diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp
index 18ed6570730f4..6f7b7e7d6840e 100644
--- a/clang/lib/CodeGen/CGExprScalar.cpp
+++ b/clang/lib/CodeGen/CGExprScalar.cpp
@@ -1690,28 +1690,17 @@ Value *ScalarExprEmitter::EmitScalarConversion(Value *Src, QualType SrcType,
bool OBWrapInvolved =
(DstOBT && DstOBT->isWrapKind()) || (SrcOBT && SrcOBT->isWrapKind());
- // Cast from half through float if half isn't a native type.
- if (SrcType->isHalfType() && !CGF.getContext().getLangOpts().NativeHalfType) {
- // Cast to FP using the intrinsic if the half type itself isn't supported.
- if (DstTy->isFloatingPointTy()) {
- if (CGF.getContext().getTargetInfo().useFP16ConversionIntrinsics()) {
- Value *BitCast = Builder.CreateBitCast(Src, CGF.CGM.HalfTy);
- return Builder.CreateFPExt(BitCast, DstTy, "conv");
- }
- } else {
- // Cast to other types through float, using either the intrinsic or FPExt,
- // depending on whether the half type itself is supported
- // (as opposed to operations on half, available with NativeHalfType).
+ // If half isn't a native type, cast to float for evaluation.
+ if (SrcType->isHalfType() && !CGF.getContext().getLangOpts().NativeHalfType &&
+ SrcTy == CGF.CGM.HalfTy && DstTy != CGF.CGM.HalfTy) {
+ if (DstTy->isFloatingPointTy())
+ return Builder.CreateFPExt(Src, DstTy, "conv");
- if (Src->getType() != CGF.CGM.HalfTy) {
- assert(CGF.getContext().getTargetInfo().useFP16ConversionIntrinsics());
- Src = Builder.CreateBitCast(Src, CGF.CGM.HalfTy);
- }
-
- Src = Builder.CreateFPExt(Src, CGF.CGM.FloatTy, "conv");
- SrcType = CGF.getContext().FloatTy;
- SrcTy = CGF.FloatTy;
- }
+ // Cast to other types through float (as opposed to operations on half,
+ // available with NativeHalfType).
+ Src = Builder.CreateFPExt(Src, CGF.CGM.FloatTy, "conv");
+ SrcType = CGF.getContext().FloatTy;
+ SrcTy = CGF.FloatTy;
}
// Ignore conversions like int -> uint.
@@ -1816,23 +1805,13 @@ Value *ScalarExprEmitter::EmitScalarConversion(Value *Src, QualType SrcType,
EmitFloatConversionCheck(OrigSrc, OrigSrcType, Src, SrcType, DstType, DstTy,
Loc);
- // Cast to half through float if half isn't a native type.
- if (DstType->isHalfType() && !CGF.getContext().getLangOpts().NativeHalfType) {
+ // Cast to half from float if half isn't a native type. When __fp16 isn't
+ // native, arithmetic is evaluated as float.
+ if (DstType->isHalfType() && !CGF.getContext().getLangOpts().NativeHalfType &&
+ DstTy == CGF.CGM.HalfTy) {
// Make sure we cast in a single step if from another FP type.
- if (SrcTy->isFloatingPointTy()) {
- // Handle the case where the half type is represented as an integer (as
- // opposed to operations on half, available with NativeHalfType).
-
- // If the half type is supported, just use an fptrunc.
- Value *Res = Builder.CreateFPTrunc(Src, CGF.CGM.HalfTy, "conv");
- if (DstTy == CGF.CGM.HalfTy)
- return Res;
-
- assert(DstTy->isIntegerTy(16) &&
- CGF.getContext().getTargetInfo().useFP16ConversionIntrinsics() &&
- "Only half FP requires extra conversion");
- return Builder.CreateBitCast(Res, DstTy);
- }
+ if (SrcTy->isFloatingPointTy())
+ return Builder.CreateFPTrunc(Src, CGF.CGM.HalfTy, "conv");
DstTy = CGF.FloatTy;
}
@@ -1844,7 +1823,6 @@ Value *ScalarExprEmitter::EmitScalarConversion(Value *Src, QualType SrcType,
if (ResTy != CGF.CGM.HalfTy) {
assert(ResTy->isIntegerTy(16) &&
- CGF.getContext().getTargetInfo().useFP16ConversionIntrinsics() &&
"Only half FP requires extra conversion");
Res = Builder.CreateBitCast(Res, ResTy);
}
diff --git a/clang/lib/CodeGen/CodeGenTypes.cpp b/clang/lib/CodeGen/CodeGenTypes.cpp
index 3de3bad6affb5..c68a24ca045bc 100644
--- a/clang/lib/CodeGen/CodeGenTypes.cpp
+++ b/clang/lib/CodeGen/CodeGenTypes.cpp
@@ -300,14 +300,9 @@ void CodeGenTypes::RefreshTypeCacheForClass(const CXXRecordDecl *RD) {
}
static llvm::Type *getTypeForFormat(llvm::LLVMContext &VMContext,
- const llvm::fltSemantics &format,
- bool UseNativeHalf = false) {
- if (&format == &llvm::APFloat::IEEEhalf()) {
- if (UseNativeHalf)
- return llvm::Type::getHalfTy(VMContext);
- else
- return llvm::Type::getInt16Ty(VMContext);
- }
+ const llvm::fltSemantics &format) {
+ if (&format == &llvm::APFloat::IEEEhalf())
+ return llvm::Type::getHalfTy(VMContext);
if (&format == &llvm::APFloat::BFloat())
return llvm::Type::getBFloatTy(VMContext);
if (&format == &llvm::APFloat::IEEEsingle())
@@ -485,16 +480,14 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) {
case BuiltinType::Float16:
ResultType =
- getTypeForFormat(getLLVMContext(), Context.getFloatTypeSemantics(T),
- /* UseNativeHalf = */ true);
+ getTypeForFormat(getLLVMContext(), Context.getFloatTypeSemantics(T));
break;
case BuiltinType::Half:
- // Half FP can either be storage-only (lowered to i16) or native.
- ResultType = getTypeForFormat(
- getLLVMContext(), Context.getFloatTypeSemantics(T),
- Context.getLangOpts().NativeHalfType ||
- !Context.getTargetInfo().useFP16ConversionIntrinsics());
+ // Half FP can either be storage-only (lowered to i16 for ABI purposes) or
+ // native.
+ ResultType =
+ getTypeForFormat(getLLVMContext(), Context.getFloatTypeSemantics(T));
break;
case BuiltinType::LongDouble:
LongDoubleReferenced = true;
@@ -504,9 +497,8 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) {
case BuiltinType::Double:
case BuiltinType::Float128:
case BuiltinType::Ibm128:
- ResultType = getTypeForFormat(getLLVMContext(),
- Context.getFloatTypeSemantics(T),
- /* UseNativeHalf = */ false);
+ ResultType =
+ getTypeForFormat(getLLVMContext(), Context.getFloatTypeSemantics(T));
break;
case BuiltinType::NullPtr:
diff --git a/clang/lib/CodeGen/TargetBuiltins/NVPTX.cpp b/clang/lib/CodeGen/TargetBuiltins/NVPTX.cpp
index 0be166ce7bb38..48b6866147281 100644
--- a/clang/lib/CodeGen/TargetBuiltins/NVPTX.cpp
+++ b/clang/lib/CodeGen/TargetBuiltins/NVPTX.cpp
@@ -393,23 +393,8 @@ static Value *MakeCpAsync(unsigned IntrinsicID, unsigned IntrinsicIDS,
CGF.EmitScalarExpr(E->getArg(1))});
}
-static bool EnsureNativeHalfSupport(unsigned BuiltinID, const CallExpr *E,
- CodeGenFunction &CGF) {
- auto &C = CGF.CGM.getContext();
- if (!C.getLangOpts().NativeHalfType &&
- C.getTargetInfo().useFP16ConversionIntrinsics()) {
- CGF.CGM.Error(E->getExprLoc(), C.BuiltinInfo.getQuotedName(BuiltinID) +
- " requires native half type support.");
- return false;
- }
- return true;
-}
-
static Value *MakeHalfType(Function *Intrinsic, unsigned BuiltinID,
const CallExpr *E, CodeGenFunction &CGF) {
- if (!EnsureNativeHalfSupport(BuiltinID, E, CGF))
- return nullptr;
-
SmallVector<Value *, 16> Args;
auto *FTy = Intrinsic->getFunctionType();
unsigned ICEArguments = 0;
@@ -1128,13 +1113,10 @@ Value *CodeGenFunction::EmitNVPTXBuiltinExpr(unsigned BuiltinID,
EmitScalarExpr(E->getArg(0)));
case NVPTX::BI__nvvm_ldg_h:
case NVPTX::BI__nvvm_ldg_h2:
- return EnsureNativeHalfSupport(BuiltinID, E, *this) ? MakeLdg(*this, E)
- ...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/207212
More information about the cfe-commits
mailing list