Help wanted: Overloading an Intinsic

Hello All,

I have been modifying LLVM a project of mine, and have encountered issues with overloading an intrinsic function.

I have defined two types, abit (which is mapped, in, to i128) and qbit (accordingly mapped to i16). I would like my intrinsic function, CNOT(x,y), to accept either an abit or a qbit for each argument, so I overload with iAny and llvm_anyint_ty, as seemed to be the method for other intrinsics:

def int_CNOT: Intrinsic<, [llvm_anyint_ty, llvm_anyint_ty],,[“llvm.CNOT”]>;

My llvm/clang directory builds successfully, but I get an error on getType from clang, which I believe is rooted in my llvm code. My question is simply, are there any additional steps to overloading an intrinsic? I stand to believe there is more to be done than what I did in the one line above, but I cannot find where to do this.

For what its worth, I get this error in generating the initial IR through clang:

clang: …/ArrayRef.h:129: const T &llvm::ArrayRef<llvm::Type *>::operator const [T = llvm::Type *]: Assertion `Index < Length && “Invalid index!”’ failed.

Many Thanks,
David Noursi

Hi David,

The error shows that the clang source code uses this intrinsic as well, but in the old form. You need to modify the clang source code (where this intrinsic is used) to consider the overloaded operands.

The assert would show the trace where clang uses this intrinsic.

Hope this helps,

Thank you Anna! Since sending this email I have reached this conclusion from the stack dump, and have been modifying calls to getIntrinsic in clang.

Many Thanks,