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 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
