diff --git a/llvm/include/llvm-c/Core.h b/llvm/include/llvm-c/Core.h index 4e380d9bd5969..56ac4ed6c1ec2 100644 --- a/llvm/include/llvm-c/Core.h +++ b/llvm/include/llvm-c/Core.h @@ -2963,7 +2963,7 @@ LLVM_C_ABI LLVMValueRef LLVMGetIntrinsicDeclaration(LLVMModuleRef Mod, * * @see llvm::Intrinsic::getType() */ -LLVM_C_ABI LLVMTypeRef LLVMIntrinsicGetType(LLVMContextRef Ctx, unsigned ID, +LLVM_C_ABI LLVMTypeRef LLVMIntrinsicGetType(LLVMModuleRef Mod, unsigned ID, LLVMTypeRef *ParamTypes, size_t ParamCount); diff --git a/llvm/include/llvm/IR/Intrinsics.h b/llvm/include/llvm/IR/Intrinsics.h index 9577d0141f168..39a888b83ac14 100644 --- a/llvm/include/llvm/IR/Intrinsics.h +++ b/llvm/include/llvm/IR/Intrinsics.h @@ -23,6 +23,7 @@ namespace llvm { +class DataLayout; class Type; class FunctionType; class Function; @@ -75,7 +76,7 @@ namespace Intrinsic { LLVM_ABI std::string getNameNoUnnamedTypes(ID Id, ArrayRef Tys); /// Return the function type for an intrinsic. - LLVM_ABI FunctionType *getType(LLVMContext &Context, ID id, + LLVM_ABI FunctionType *getType(const Module *M, ID id, ArrayRef Tys = {}); /// Returns true if the intrinsic can be overloaded. @@ -135,6 +136,7 @@ namespace Intrinsic { struct IITDescriptor { enum IITDescriptorKind { Void, + Byte, VarArg, MMX, Token, @@ -247,9 +249,9 @@ namespace Intrinsic { /// /// Returns false if the given type matches with the constraints, true /// otherwise. - LLVM_ABI MatchIntrinsicTypesResult - matchIntrinsicSignature(FunctionType *FTy, ArrayRef &Infos, - SmallVectorImpl &ArgTys); + LLVM_ABI MatchIntrinsicTypesResult matchIntrinsicSignature( + const DataLayout &DL, FunctionType *FTy, ArrayRef &Infos, + SmallVectorImpl &ArgTys); /// Verify if the intrinsic has variable arguments. This method is intended to /// be called after all the fixed arguments have been matched first. @@ -264,7 +266,8 @@ namespace Intrinsic { /// /// Returns false if the given ID and function type combination is not a /// valid intrinsic call. - LLVM_ABI bool getIntrinsicSignature(Intrinsic::ID, FunctionType *FT, + LLVM_ABI bool getIntrinsicSignature(const DataLayout &DL, Intrinsic::ID, + FunctionType *FT, SmallVectorImpl &ArgTys); /// Same as previous, but accepts a Function instead of ID and FunctionType. diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td index 07aa2faffa7c5..1f2a2a83ec932 100644 --- a/llvm/include/llvm/IR/Intrinsics.td +++ b/llvm/include/llvm/IR/Intrinsics.td @@ -334,6 +334,7 @@ def IIT_V6 : IIT_Vec<6, 50>; def IIT_V10 : IIT_Vec<10, 51>; def IIT_V2048 : IIT_Vec<2048, 52>; def IIT_V4096 : IIT_Vec<4096, 53>; +def IIT_BYTE : IIT_Base<54>; } defvar IIT_all_FixedTypes = !filter(iit, IIT_all, @@ -376,6 +377,10 @@ class LLVMType { !foreach(iit, IITs, iit.Number)); } +class LLVMByteType : LLVMType { + let Sig = [IIT_BYTE.Number]; +} + class LLVMAnyType : LLVMType { let ArgCode = !cond( !eq(vt, Any) : ArgKind.Any, @@ -481,7 +486,7 @@ class LLVMVectorOfBitcastsToInt : LLVMMatchType; def llvm_void_ty : LLVMType; - +def llvm_byte_ty : LLVMByteType; def llvm_any_ty : LLVMAnyType; def llvm_anyint_ty : LLVMAnyType; def llvm_anyfloat_ty : LLVMAnyType; @@ -1011,7 +1016,7 @@ def int_memmove : Intrinsic<[], WriteOnly>, ReadOnly>, ImmArg>]>; def int_memset : Intrinsic<[], - [llvm_anyptr_ty, llvm_i8_ty, llvm_anyint_ty, + [llvm_anyptr_ty, llvm_byte_ty, llvm_anyint_ty, llvm_i1_ty], [IntrWriteMem, IntrArgMemOnly, IntrWillReturn, IntrNoFree, IntrNoCallback, @@ -1024,7 +1029,7 @@ def int_memset : Intrinsic<[], // The third argument (specifying the size) must be a constant. def int_memset_inline : Intrinsic<[], - [llvm_anyptr_ty, llvm_i8_ty, llvm_anyint_ty, llvm_i1_ty], + [llvm_anyptr_ty, llvm_byte_ty, llvm_anyint_ty, llvm_i1_ty], [IntrWriteMem, IntrArgMemOnly, IntrWillReturn, IntrNoFree, IntrNoCallback, NoCapture>, WriteOnly>, ImmArg>]>; @@ -2621,7 +2626,7 @@ def int_memmove_element_unordered_atomic // @llvm.memset.element.unordered.atomic.*(dest, value, length, elementsize) def int_memset_element_unordered_atomic - : Intrinsic<[], [llvm_anyptr_ty, llvm_i8_ty, llvm_anyint_ty, llvm_i32_ty], + : Intrinsic<[], [llvm_anyptr_ty, llvm_byte_ty, llvm_anyint_ty, llvm_i32_ty], [IntrWriteMem, IntrArgMemOnly, IntrWillReturn, IntrNoSync, NoCapture>, WriteOnly>, ImmArg>]>; diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index 8e3ce4990f437..893e581f329ad 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -343,8 +343,8 @@ bool LLParser::validateEndOfModule(bool UpgradeDebugInfo) { SmallVector OverloadTys; if (IID != Intrinsic::not_intrinsic && - Intrinsic::getIntrinsicSignature(IID, CB->getFunctionType(), - OverloadTys)) { + Intrinsic::getIntrinsicSignature( + M->getDataLayout(), IID, CB->getFunctionType(), OverloadTys)) { U.set(Intrinsic::getOrInsertDeclaration(M, IID, OverloadTys)); } else { // Try to upgrade the intrinsic. diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index 58b7ddd0381e5..a7e890c081cb8 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -1749,7 +1749,9 @@ bool llvm::UpgradeIntrinsicFunction(Function *F, Function *&NewFn, if (Intrinsic::ID id = F->getIntrinsicID()) { // Only do this if the intrinsic signature is valid. SmallVector OverloadTys; - if (Intrinsic::getIntrinsicSignature(id, F->getFunctionType(), OverloadTys)) + assert(F->getParent()); + if (Intrinsic::getIntrinsicSignature(F->getDataLayout(), id, + F->getFunctionType(), OverloadTys)) F->setAttributes( Intrinsic::getAttributes(F->getContext(), id, F->getFunctionType())); } diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp index 27d8294b01264..1cf61b619e3e6 100644 --- a/llvm/lib/IR/Core.cpp +++ b/llvm/lib/IR/Core.cpp @@ -2496,11 +2496,11 @@ const char *LLVMIntrinsicGetName(unsigned ID, size_t *NameLength) { return Str.data(); } -LLVMTypeRef LLVMIntrinsicGetType(LLVMContextRef Ctx, unsigned ID, +LLVMTypeRef LLVMIntrinsicGetType(LLVMModuleRef Mod, unsigned ID, LLVMTypeRef *ParamTypes, size_t ParamCount) { auto IID = llvm_map_to_intrinsic_id(ID); ArrayRef Tys(unwrap(ParamTypes), ParamCount); - return wrap(llvm::Intrinsic::getType(*unwrap(Ctx), IID, Tys)); + return wrap(llvm::Intrinsic::getType(unwrap(Mod), IID, Tys)); } char *LLVMIntrinsicCopyOverloadedName(unsigned ID, LLVMTypeRef *ParamTypes, diff --git a/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp index fc067459dcba3..ca003e4b4e0b9 100644 --- a/llvm/lib/IR/Function.cpp +++ b/llvm/lib/IR/Function.cpp @@ -507,7 +507,9 @@ Function::Function(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, // Don't set the attributes if the intrinsic signature is invalid. This // case will either be auto-upgraded or fail verification. SmallVector OverloadTys; - if (!Intrinsic::getIntrinsicSignature(IntID, Ty, OverloadTys)) + assert(ParentModule); + if (!Intrinsic::getIntrinsicSignature(ParentModule->getDataLayout(), IntID, + Ty, OverloadTys)) return; setAttributes(Intrinsic::getAttributes(getContext(), IntID, Ty)); diff --git a/llvm/lib/IR/IRBuilder.cpp b/llvm/lib/IR/IRBuilder.cpp index 95edb2e8e56d8..fbe1adbec7b8c 100644 --- a/llvm/lib/IR/IRBuilder.cpp +++ b/llvm/lib/IR/IRBuilder.cpp @@ -869,7 +869,7 @@ CallInst *IRBuilderBase::CreateIntrinsic(Type *RetTy, Intrinsic::ID ID, FunctionType *FTy = FunctionType::get(RetTy, ArgTys, false); SmallVector OverloadTys; Intrinsic::MatchIntrinsicTypesResult Res = - matchIntrinsicSignature(FTy, TableRef, OverloadTys); + matchIntrinsicSignature(M->getDataLayout(), FTy, TableRef, OverloadTys); (void)Res; assert(Res == Intrinsic::MatchIntrinsicTypes_Match && TableRef.empty() && "Wrong types for intrinsic!"); diff --git a/llvm/lib/IR/Intrinsics.cpp b/llvm/lib/IR/Intrinsics.cpp index 526800e217399..ce868ae96c7ef 100644 --- a/llvm/lib/IR/Intrinsics.cpp +++ b/llvm/lib/IR/Intrinsics.cpp @@ -169,9 +169,9 @@ static std::string getIntrinsicNameImpl(Intrinsic::ID Id, ArrayRef Tys, if (HasUnnamedType) { assert(M && "unnamed types need a module"); if (!FT) - FT = Intrinsic::getType(M->getContext(), Id, Tys); + FT = Intrinsic::getType(M, Id, Tys); else - assert((FT == Intrinsic::getType(M->getContext(), Id, Tys)) && + assert((FT == Intrinsic::getType(M, Id, Tys)) && "Provided FunctionType must match arguments"); return M->getUniqueIntrinsicName(Result, Id, FT); } @@ -212,6 +212,9 @@ DecodeIITType(unsigned &NextElt, ArrayRef Infos, case IIT_Done: OutputTable.push_back(IITDescriptor::get(IITDescriptor::Void, 0)); return; + case IIT_BYTE: + OutputTable.push_back(IITDescriptor::get(IITDescriptor::Byte, 0)); + return; case IIT_VARARG: OutputTable.push_back(IITDescriptor::get(IITDescriptor::VarArg, 0)); return; @@ -471,7 +474,8 @@ void Intrinsic::getIntrinsicInfoTableEntries( } static Type *DecodeFixedType(ArrayRef &Infos, - ArrayRef Tys, LLVMContext &Context) { + ArrayRef Tys, LLVMContext &Context, + const DataLayout &DL) { using namespace Intrinsic; IITDescriptor D = Infos.front(); @@ -480,6 +484,8 @@ static Type *DecodeFixedType(ArrayRef &Infos, switch (D.Kind) { case IITDescriptor::Void: return Type::getVoidTy(Context); + case IITDescriptor::Byte: + return Type::getIntNTy(Context, DL.getByteWidth()); case IITDescriptor::VarArg: return Type::getVoidTy(Context); case IITDescriptor::MMX: @@ -508,14 +514,14 @@ static Type *DecodeFixedType(ArrayRef &Infos, case IITDescriptor::Integer: return IntegerType::get(Context, D.Integer_Width); case IITDescriptor::Vector: - return VectorType::get(DecodeFixedType(Infos, Tys, Context), + return VectorType::get(DecodeFixedType(Infos, Tys, Context, DL), D.Vector_Width); case IITDescriptor::Pointer: return PointerType::get(Context, D.Pointer_AddressSpace); case IITDescriptor::Struct: { SmallVector Elts; for (unsigned i = 0, e = D.Struct_NumElements; i != e; ++i) - Elts.push_back(DecodeFixedType(Infos, Tys, Context)); + Elts.push_back(DecodeFixedType(Infos, Tys, Context, DL)); return StructType::get(Context, Elts); } case IITDescriptor::Argument: @@ -548,7 +554,7 @@ static Type *DecodeFixedType(ArrayRef &Infos, return VectorType::getOneNthElementsVectorType( cast(Tys[D.getRefArgNumber()]), D.getVectorDivisor()); case IITDescriptor::SameVecWidthArgument: { - Type *EltTy = DecodeFixedType(Infos, Tys, Context); + Type *EltTy = DecodeFixedType(Infos, Tys, Context, DL); Type *Ty = Tys[D.getArgumentNumber()]; if (auto *VTy = dyn_cast(Ty)) return VectorType::get(EltTy, VTy->getElementCount()); @@ -573,17 +579,18 @@ static Type *DecodeFixedType(ArrayRef &Infos, llvm_unreachable("unhandled"); } -FunctionType *Intrinsic::getType(LLVMContext &Context, ID id, - ArrayRef Tys) { +FunctionType *Intrinsic::getType(const Module *M, ID id, ArrayRef Tys) { SmallVector Table; getIntrinsicInfoTableEntries(id, Table); ArrayRef TableRef = Table; - Type *ResultTy = DecodeFixedType(TableRef, Tys, Context); + Type *ResultTy = + DecodeFixedType(TableRef, Tys, M->getContext(), M->getDataLayout()); SmallVector ArgTys; while (!TableRef.empty()) - ArgTys.push_back(DecodeFixedType(TableRef, Tys, Context)); + ArgTys.push_back( + DecodeFixedType(TableRef, Tys, M->getContext(), M->getDataLayout())); // DecodeFixedType returns Void for IITDescriptor::Void and // IITDescriptor::VarArg If we see void type as the type of the last argument, @@ -724,7 +731,7 @@ Function *Intrinsic::getOrInsertDeclaration(Module *M, ID id, ArrayRef Tys) { // There can never be multiple globals with the same name of different types, // because intrinsics must be a specific type. - auto *FT = getType(M->getContext(), id, Tys); + auto *FT = getType(M, id, Tys); Function *F = cast( M->getOrInsertFunction( Tys.empty() ? getName(id) : getName(id, Tys, M, FT), FT) @@ -792,7 +799,8 @@ using DeferredIntrinsicMatchPair = std::pair>; static bool -matchIntrinsicType(Type *Ty, ArrayRef &Infos, +matchIntrinsicType(const DataLayout &DL, Type *Ty, + ArrayRef &Infos, SmallVectorImpl &ArgTys, SmallVectorImpl &DeferredChecks, bool IsDeferredCheck) { @@ -815,6 +823,8 @@ matchIntrinsicType(Type *Ty, ArrayRef &Infos, switch (D.Kind) { case IITDescriptor::Void: return !Ty->isVoidTy(); + case IITDescriptor::Byte: + return !Ty->isIntegerTy(DL.getByteWidth()); case IITDescriptor::VarArg: return true; case IITDescriptor::MMX: { @@ -848,7 +858,7 @@ matchIntrinsicType(Type *Ty, ArrayRef &Infos, case IITDescriptor::Vector: { VectorType *VT = dyn_cast(Ty); return !VT || VT->getElementCount() != D.Vector_Width || - matchIntrinsicType(VT->getElementType(), Infos, ArgTys, + matchIntrinsicType(DL, VT->getElementType(), Infos, ArgTys, DeferredChecks, IsDeferredCheck); } case IITDescriptor::Pointer: { @@ -863,7 +873,7 @@ matchIntrinsicType(Type *Ty, ArrayRef &Infos, return true; for (unsigned i = 0, e = D.Struct_NumElements; i != e; ++i) - if (matchIntrinsicType(ST->getElementType(i), Infos, ArgTys, + if (matchIntrinsicType(DL, ST->getElementType(i), Infos, ArgTys, DeferredChecks, IsDeferredCheck)) return true; return false; @@ -954,7 +964,7 @@ matchIntrinsicType(Type *Ty, ArrayRef &Infos, return true; EltTy = ThisArgType->getElementType(); } - return matchIntrinsicType(EltTy, Infos, ArgTys, DeferredChecks, + return matchIntrinsicType(DL, EltTy, Infos, ArgTys, DeferredChecks, IsDeferredCheck); } case IITDescriptor::VecOfAnyPtrsToElt: { @@ -1018,24 +1028,24 @@ matchIntrinsicType(Type *Ty, ArrayRef &Infos, } Intrinsic::MatchIntrinsicTypesResult -Intrinsic::matchIntrinsicSignature(FunctionType *FTy, +Intrinsic::matchIntrinsicSignature(const DataLayout &DL, FunctionType *FTy, ArrayRef &Infos, SmallVectorImpl &ArgTys) { SmallVector DeferredChecks; - if (matchIntrinsicType(FTy->getReturnType(), Infos, ArgTys, DeferredChecks, - false)) + if (matchIntrinsicType(DL, FTy->getReturnType(), Infos, ArgTys, + DeferredChecks, false)) return MatchIntrinsicTypes_NoMatchRet; unsigned NumDeferredReturnChecks = DeferredChecks.size(); for (auto *Ty : FTy->params()) - if (matchIntrinsicType(Ty, Infos, ArgTys, DeferredChecks, false)) + if (matchIntrinsicType(DL, Ty, Infos, ArgTys, DeferredChecks, false)) return MatchIntrinsicTypes_NoMatchArg; for (unsigned I = 0, E = DeferredChecks.size(); I != E; ++I) { DeferredIntrinsicMatchPair &Check = DeferredChecks[I]; - if (matchIntrinsicType(Check.first, Check.second, ArgTys, DeferredChecks, - true)) + if (matchIntrinsicType(DL, Check.first, Check.second, ArgTys, + DeferredChecks, true)) return I < NumDeferredReturnChecks ? MatchIntrinsicTypes_NoMatchRet : MatchIntrinsicTypes_NoMatchArg; } @@ -1062,7 +1072,8 @@ bool Intrinsic::matchIntrinsicVarArg( return true; } -bool Intrinsic::getIntrinsicSignature(Intrinsic::ID ID, FunctionType *FT, +bool Intrinsic::getIntrinsicSignature(const DataLayout &DL, Intrinsic::ID ID, + FunctionType *FT, SmallVectorImpl &ArgTys) { if (!ID) return false; @@ -1071,7 +1082,7 @@ bool Intrinsic::getIntrinsicSignature(Intrinsic::ID ID, FunctionType *FT, getIntrinsicInfoTableEntries(ID, Table); ArrayRef TableRef = Table; - if (Intrinsic::matchIntrinsicSignature(FT, TableRef, ArgTys) != + if (Intrinsic::matchIntrinsicSignature(DL, FT, TableRef, ArgTys) != Intrinsic::MatchIntrinsicTypesResult::MatchIntrinsicTypes_Match) { return false; } @@ -1082,8 +1093,8 @@ bool Intrinsic::getIntrinsicSignature(Intrinsic::ID ID, FunctionType *FT, bool Intrinsic::getIntrinsicSignature(Function *F, SmallVectorImpl &ArgTys) { - return getIntrinsicSignature(F->getIntrinsicID(), F->getFunctionType(), - ArgTys); + return getIntrinsicSignature(F->getDataLayout(), F->getIntrinsicID(), + F->getFunctionType(), ArgTys); } std::optional Intrinsic::remangleIntrinsicFunction(Function *F) { diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 59eb870798235..2e75567373aad 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -5682,7 +5682,7 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) { // Walk the descriptors to extract overloaded types. SmallVector ArgTys; Intrinsic::MatchIntrinsicTypesResult Res = - Intrinsic::matchIntrinsicSignature(IFTy, TableRef, ArgTys); + Intrinsic::matchIntrinsicSignature(DL, IFTy, TableRef, ArgTys); Check(Res != Intrinsic::MatchIntrinsicTypes_NoMatchRet, "Intrinsic has incorrect return type!", IF); Check(Res != Intrinsic::MatchIntrinsicTypes_NoMatchArg, diff --git a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp index 8bb28084159e8..4dc03b1bd0f08 100644 --- a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp +++ b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp @@ -18118,8 +18118,9 @@ Align SITargetLowering::computeKnownAlignForTargetInstr( // site specifies a lower alignment? Intrinsic::ID IID = GI->getIntrinsicID(); LLVMContext &Ctx = VT.getMachineFunction().getFunction().getContext(); + const Module *M = VT.getMachineFunction().getFunction().getParent(); AttributeList Attrs = - Intrinsic::getAttributes(Ctx, IID, Intrinsic::getType(Ctx, IID)); + Intrinsic::getAttributes(Ctx, IID, Intrinsic::getType(M, IID)); if (MaybeAlign RetAlign = Attrs.getRetAlignment()) return *RetAlign; } diff --git a/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp index a2fad021e0480..fbd1906a4bc4b 100644 --- a/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp @@ -1586,7 +1586,7 @@ Value *NumericalStabilitySanitizer::maybeHandleKnownCallBase( SmallVector ArgTys; ArrayRef TableRef = Table; [[maybe_unused]] Intrinsic::MatchIntrinsicTypesResult MatchResult = - Intrinsic::matchIntrinsicSignature(WidenedFnTy, TableRef, ArgTys); + Intrinsic::matchIntrinsicSignature(DL, WidenedFnTy, TableRef, ArgTys); assert(MatchResult == Intrinsic::MatchIntrinsicTypes_Match && "invalid widened intrinsic"); // For known intrinsic functions, we create a second call to the same diff --git a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp index eaf1d20da63c7..b0377587e3b50 100644 --- a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp @@ -95,8 +95,8 @@ getOverloadedDeclaration(CallIntrinsicOp op, llvm::Intrinsic::ID id, ArrayRef tableRef = table; SmallVector overloadedArgTys; - if (llvm::Intrinsic::matchIntrinsicSignature(ft, tableRef, - overloadedArgTys) != + if (llvm::Intrinsic::matchIntrinsicSignature(module->getDataLayout(), ft, + tableRef, overloadedArgTys) != llvm::Intrinsic::MatchIntrinsicTypesResult::MatchIntrinsicTypes_Match) { return mlir::emitError(op.getLoc(), "call intrinsic signature ") << diagStr(ft) << " to overloaded intrinsic " << op.getIntrinAttr()