[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.
diff --git a/llvm/include/llvm-c/Core.h b/llvm/include/llvm-c/Core.h
index d645646..4ecc6578 100644
--- a/llvm/include/llvm-c/Core.h
+++ b/llvm/include/llvm-c/Core.h
@@ -2930,7 +2930,7 @@
*
* @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 1568052..bce5090 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 @@
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,
+ LLVM_ABI FunctionType *getType(const Module *M, ID id,
ArrayRef<Type *> Tys = {});
/// Returns true if the intrinsic can be overloaded.
@@ -141,6 +142,7 @@
struct IITDescriptor {
enum IITDescriptorKind {
Void,
+ Byte,
VarArg,
MMX,
Token,
@@ -253,9 +255,9 @@
///
/// 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 +272,8 @@
///
/// 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 bd6f94a..438910f 100644
--- a/llvm/include/llvm/IR/Intrinsics.td
+++ b/llvm/include/llvm/IR/Intrinsics.td
@@ -308,6 +308,7 @@
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 @@
!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 @@
: 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 @@
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 @@
// 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 @@
// @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 b7f6950..0897865 100644
--- a/llvm/lib/AsmParser/LLParser.cpp
+++ b/llvm/lib/AsmParser/LLParser.cpp
@@ -346,8 +346,8 @@
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 86285a0..ff226f4 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -1637,7 +1637,9 @@
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 f7ef4aa..f1e1b39 100644
--- a/llvm/lib/IR/Core.cpp
+++ b/llvm/lib/IR/Core.cpp
@@ -2478,11 +2478,11 @@
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 7a03663..33f39f4 100644
--- a/llvm/lib/IR/Function.cpp
+++ b/llvm/lib/IR/Function.cpp
@@ -507,7 +507,9 @@
// 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 28037d7..a87bca4 100644
--- a/llvm/lib/IR/IRBuilder.cpp
+++ b/llvm/lib/IR/IRBuilder.cpp
@@ -870,7 +870,7 @@
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 d2632d5..a1d9f2a 100644
--- a/llvm/lib/IR/Intrinsics.cpp
+++ b/llvm/lib/IR/Intrinsics.cpp
@@ -169,9 +169,9 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
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 @@
llvm_unreachable("unhandled");
}
-FunctionType *Intrinsic::getType(LLVMContext &Context, ID id,
- ArrayRef<Type *> Tys) {
+FunctionType *Intrinsic::getType(const 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
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 @@
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 @@
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(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 eb747bc..03fdba7 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -5531,7 +5531,7 @@
// 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/Target/AMDGPU/SIISelLowering.cpp b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
index e2a10be..5657ffb 100644
--- a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
+++ b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
@@ -16932,8 +16932,9 @@
// 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 fa1db28..42bcedd 100644
--- a/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp
@@ -1585,7 +1585,7 @@
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 70029d7..05aab309 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp
@@ -91,8 +91,8 @@
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()