https://github.com/s-barannikov updated https://github.com/llvm/llvm-project/pull/106537
>From 83efc1aa133fb2e52e81ae4319c978859da61911 Mon Sep 17 00:00:00 2001 From: Sergei Barannikov <baranniko...@gmail.com> Date: Thu, 1 Aug 2024 23:47:25 +0300 Subject: [PATCH] [IR] Make @llvm.memset prototype byte width dependent This patch changes the type of the value argument of @llvm.memset and similar intrinsics from i8 to iN, where N is the byte width specified in data layout string. Note that the argument still has fixed type (not overloaded), but type checker will complain if the type does not match the byte width. Ideally, the type of the argument would be dependent on the address space of the pointer argument. It is easy to do this (and I did it downstream as a PoC), but since data layout string doesn't currently allow different byte widths for different address spaces, I refrained from doing it now. --- llvm/include/llvm-c/Core.h | 2 +- llvm/include/llvm/IR/Intrinsics.h | 14 +++-- llvm/include/llvm/IR/Intrinsics.td | 13 ++-- llvm/lib/AsmParser/LLParser.cpp | 4 +- llvm/lib/IR/AutoUpgrade.cpp | 4 +- llvm/lib/IR/Core.cpp | 4 +- llvm/lib/IR/Function.cpp | 4 +- llvm/lib/IR/IRBuilder.cpp | 2 +- llvm/lib/IR/Intrinsics.cpp | 61 +++++++++++-------- llvm/lib/IR/Verifier.cpp | 2 +- .../NumericalStabilitySanitizer.cpp | 2 +- .../LLVMIR/LLVMToLLVMIRTranslation.cpp | 4 +- 12 files changed, 69 insertions(+), 47 deletions(-) diff --git a/llvm/include/llvm-c/Core.h b/llvm/include/llvm-c/Core.h index d645646289025..4ecc657837910 100644 --- a/llvm/include/llvm-c/Core.h +++ b/llvm/include/llvm-c/Core.h @@ -2930,7 +2930,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 156805293367b..896c952c95c14 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,8 +76,7 @@ namespace Intrinsic { LLVM_ABI std::string getNameNoUnnamedTypes(ID Id, ArrayRef<Type *> Tys); /// Return the function type for an intrinsic. - LLVM_ABI FunctionType *getType(LLVMContext &Context, ID id, - ArrayRef<Type *> Tys = {}); + LLVM_ABI FunctionType *getType(Module *M, ID id, ArrayRef<Type *> Tys = {}); /// Returns true if the intrinsic can be overloaded. LLVM_ABI bool isOverloaded(ID id); @@ -141,6 +141,7 @@ namespace Intrinsic { struct IITDescriptor { enum IITDescriptorKind { Void, + Byte, VarArg, MMX, Token, @@ -253,9 +254,9 @@ namespace Intrinsic { /// /// Returns false if the given type matches with the constraints, true /// otherwise. - LLVM_ABI MatchIntrinsicTypesResult - matchIntrinsicSignature(FunctionType *FTy, ArrayRef<IITDescriptor> &Infos, - SmallVectorImpl<Type *> &ArgTys); + LLVM_ABI MatchIntrinsicTypesResult matchIntrinsicSignature( + const DataLayout &DL, FunctionType *FTy, ArrayRef<IITDescriptor> &Infos, + SmallVectorImpl<Type *> &ArgTys); /// Verify if the intrinsic has variable arguments. This method is intended to /// be called after all the fixed arguments have been matched first. @@ -270,7 +271,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<Type *> &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 bd6f94ac1286c..438910fd2aef5 100644 --- a/llvm/include/llvm/IR/Intrinsics.td +++ b/llvm/include/llvm/IR/Intrinsics.td @@ -308,6 +308,7 @@ def IIT_V1 : IIT_Vec<1, 28>; def IIT_VARARG : IIT_VT<isVoid, 29>; def IIT_ONE_NTH_ELTS_VEC_ARG : IIT_Base<30>; def IIT_SAME_VEC_WIDTH_ARG : IIT_Base<31>; +def IIT_BYTE : IIT_Base<32>; def IIT_VEC_OF_ANYPTRS_TO_ELT : IIT_Base<34>; def IIT_I128 : IIT_Int<128, 35>; def IIT_V512 : IIT_Vec<512, 36>; @@ -392,6 +393,10 @@ class LLVMType<ValueType vt> { !foreach(iit, IITs, iit.Number)); } +class LLVMByteType : LLVMType<OtherVT> { + let Sig = [IIT_BYTE.Number]; +} + class LLVMAnyType<ValueType vt> : LLVMType<vt> { let ArgCode = !cond( !eq(vt, Any) : ArgKind.Any, @@ -497,7 +502,7 @@ class LLVMVectorOfBitcastsToInt<int num> : LLVMMatchType<num, IIT_VEC_OF_BITCASTS_TO_INT>; def llvm_void_ty : LLVMType<isVoid>; - +def llvm_byte_ty : LLVMByteType; def llvm_any_ty : LLVMAnyType<Any>; def llvm_anyint_ty : LLVMAnyType<iAny>; def llvm_anyfloat_ty : LLVMAnyType<fAny>; @@ -1020,7 +1025,7 @@ def int_memmove : Intrinsic<[], WriteOnly<ArgIndex<0>>, ReadOnly<ArgIndex<1>>, ImmArg<ArgIndex<3>>]>; 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, @@ -1033,7 +1038,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<ArgIndex<0>>, WriteOnly<ArgIndex<0>>, ImmArg<ArgIndex<3>>]>; @@ -2606,7 +2611,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<ArgIndex<0>>, WriteOnly<ArgIndex<0>>, ImmArg<ArgIndex<3>>]>; diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index b7f6950f679ef..089786507901f 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -346,8 +346,8 @@ bool LLParser::validateEndOfModule(bool UpgradeDebugInfo) { return error(Info.second, "intrinsic can only be used as callee"); SmallVector<Type *> OverloadTys; - if (!Intrinsic::getIntrinsicSignature(IID, CB->getFunctionType(), - OverloadTys)) + if (!Intrinsic::getIntrinsicSignature( + M->getDataLayout(), IID, CB->getFunctionType(), OverloadTys)) return error(Info.second, "invalid intrinsic signature"); U.set(Intrinsic::getOrInsertDeclaration(M, IID, OverloadTys)); diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index 86285a03c66bb..ff226f4827d3b 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -1637,7 +1637,9 @@ bool llvm::UpgradeIntrinsicFunction(Function *F, Function *&NewFn, if (Intrinsic::ID id = F->getIntrinsicID()) { // Only do this if the intrinsic signature is valid. SmallVector<Type *> 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 f7ef4aa473ef5..f1e1b3900021d 100644 --- a/llvm/lib/IR/Core.cpp +++ b/llvm/lib/IR/Core.cpp @@ -2478,11 +2478,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<Type*> 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 7a03663e129dc..33f39f48cbdb6 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<Type *> 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 28037d7ec5616..a87bca4f534de 100644 --- a/llvm/lib/IR/IRBuilder.cpp +++ b/llvm/lib/IR/IRBuilder.cpp @@ -870,7 +870,7 @@ CallInst *IRBuilderBase::CreateIntrinsic(Type *RetTy, Intrinsic::ID ID, FunctionType *FTy = FunctionType::get(RetTy, ArgTys, false); SmallVector<Type *> 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 d2632d50dff06..77d67ccb8c194 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<Type *> 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); } @@ -213,6 +213,9 @@ DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> 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; @@ -491,7 +494,8 @@ void Intrinsic::getIntrinsicInfoTableEntries( } static Type *DecodeFixedType(ArrayRef<Intrinsic::IITDescriptor> &Infos, - ArrayRef<Type *> Tys, LLVMContext &Context) { + ArrayRef<Type *> Tys, LLVMContext &Context, + const DataLayout &DL) { using namespace Intrinsic; IITDescriptor D = Infos.front(); @@ -500,6 +504,8 @@ static Type *DecodeFixedType(ArrayRef<Intrinsic::IITDescriptor> &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: @@ -528,14 +534,14 @@ static Type *DecodeFixedType(ArrayRef<Intrinsic::IITDescriptor> &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<Type *, 8> 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: @@ -568,7 +574,7 @@ static Type *DecodeFixedType(ArrayRef<Intrinsic::IITDescriptor> &Infos, return VectorType::getOneNthElementsVectorType( cast<VectorType>(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<VectorType>(Ty)) return VectorType::get(EltTy, VTy->getElementCount()); @@ -593,17 +599,18 @@ static Type *DecodeFixedType(ArrayRef<Intrinsic::IITDescriptor> &Infos, llvm_unreachable("unhandled"); } -FunctionType *Intrinsic::getType(LLVMContext &Context, ID id, - ArrayRef<Type *> Tys) { +FunctionType *Intrinsic::getType(Module *M, ID id, ArrayRef<Type *> Tys) { SmallVector<IITDescriptor, 8> Table; getIntrinsicInfoTableEntries(id, Table); ArrayRef<IITDescriptor> TableRef = Table; - Type *ResultTy = DecodeFixedType(TableRef, Tys, Context); + Type *ResultTy = + DecodeFixedType(TableRef, Tys, M->getContext(), M->getDataLayout()); SmallVector<Type *, 8> 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, @@ -752,7 +759,7 @@ Function *Intrinsic::getOrInsertDeclaration(Module *M, ID id, ArrayRef<Type *> 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); return cast<Function>( M->getOrInsertFunction( Tys.empty() ? getName(id) : getName(id, Tys, M, FT), FT) @@ -807,7 +814,8 @@ using DeferredIntrinsicMatchPair = std::pair<Type *, ArrayRef<Intrinsic::IITDescriptor>>; static bool -matchIntrinsicType(Type *Ty, ArrayRef<Intrinsic::IITDescriptor> &Infos, +matchIntrinsicType(const DataLayout &DL, Type *Ty, + ArrayRef<Intrinsic::IITDescriptor> &Infos, SmallVectorImpl<Type *> &ArgTys, SmallVectorImpl<DeferredIntrinsicMatchPair> &DeferredChecks, bool IsDeferredCheck) { @@ -830,6 +838,8 @@ matchIntrinsicType(Type *Ty, ArrayRef<Intrinsic::IITDescriptor> &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: { @@ -863,7 +873,7 @@ matchIntrinsicType(Type *Ty, ArrayRef<Intrinsic::IITDescriptor> &Infos, case IITDescriptor::Vector: { VectorType *VT = dyn_cast<VectorType>(Ty); return !VT || VT->getElementCount() != D.Vector_Width || - matchIntrinsicType(VT->getElementType(), Infos, ArgTys, + matchIntrinsicType(DL, VT->getElementType(), Infos, ArgTys, DeferredChecks, IsDeferredCheck); } case IITDescriptor::Pointer: { @@ -878,7 +888,7 @@ matchIntrinsicType(Type *Ty, ArrayRef<Intrinsic::IITDescriptor> &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; @@ -969,7 +979,7 @@ matchIntrinsicType(Type *Ty, ArrayRef<Intrinsic::IITDescriptor> &Infos, return true; EltTy = ThisArgType->getElementType(); } - return matchIntrinsicType(EltTy, Infos, ArgTys, DeferredChecks, + return matchIntrinsicType(DL, EltTy, Infos, ArgTys, DeferredChecks, IsDeferredCheck); } case IITDescriptor::VecOfAnyPtrsToElt: { @@ -1033,24 +1043,24 @@ matchIntrinsicType(Type *Ty, ArrayRef<Intrinsic::IITDescriptor> &Infos, } Intrinsic::MatchIntrinsicTypesResult -Intrinsic::matchIntrinsicSignature(FunctionType *FTy, +Intrinsic::matchIntrinsicSignature(const DataLayout &DL, FunctionType *FTy, ArrayRef<Intrinsic::IITDescriptor> &Infos, SmallVectorImpl<Type *> &ArgTys) { SmallVector<DeferredIntrinsicMatchPair, 2> 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; } @@ -1077,7 +1087,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<Type *> &ArgTys) { if (!ID) return false; @@ -1086,7 +1097,7 @@ bool Intrinsic::getIntrinsicSignature(Intrinsic::ID ID, FunctionType *FT, getIntrinsicInfoTableEntries(ID, Table); ArrayRef<Intrinsic::IITDescriptor> TableRef = Table; - if (Intrinsic::matchIntrinsicSignature(FT, TableRef, ArgTys) != + if (Intrinsic::matchIntrinsicSignature(DL, FT, TableRef, ArgTys) != Intrinsic::MatchIntrinsicTypesResult::MatchIntrinsicTypes_Match) { return false; } @@ -1097,8 +1108,8 @@ bool Intrinsic::getIntrinsicSignature(Intrinsic::ID ID, FunctionType *FT, bool Intrinsic::getIntrinsicSignature(Function *F, SmallVectorImpl<Type *> &ArgTys) { - return getIntrinsicSignature(F->getIntrinsicID(), F->getFunctionType(), - ArgTys); + return getIntrinsicSignature(F->getDataLayout(), F->getIntrinsicID(), + F->getFunctionType(), ArgTys); } std::optional<Function *> Intrinsic::remangleIntrinsicFunction(Function *F) { diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index eb747bc48a8a5..03fdba71c48e4 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -5531,7 +5531,7 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) { // Walk the descriptors to extract overloaded types. SmallVector<Type *, 4> 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/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp index fa1db288fbb2e..42bcedd51da00 100644 --- a/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp @@ -1585,7 +1585,7 @@ Value *NumericalStabilitySanitizer::maybeHandleKnownCallBase( SmallVector<Type *, 4> ArgTys; ArrayRef<Intrinsic::IITDescriptor> 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 70029d7e15a90..05aab309022d1 100644 --- a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp @@ -91,8 +91,8 @@ getOverloadedDeclaration(CallIntrinsicOp op, llvm::Intrinsic::ID id, ArrayRef<llvm::Intrinsic::IITDescriptor> tableRef = table; SmallVector<llvm::Type *, 8> 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() _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits