diff --git a/llvm/test/TableGen/intrinsic-pointer-to-any.td b/llvm/test/TableGen/intrinsic-pointer-to-any.td new file mode 100644 --- /dev/null +++ b/llvm/test/TableGen/intrinsic-pointer-to-any.td @@ -0,0 +1,53 @@ +// RUN: llvm-tblgen -gen-intrinsic-impl %s | FileCheck %s + +// This test is validating that it an Intrinsic with an LLVMPointerType to +// llvm_any_ty still properly work after r363233. That patch rewrote the +// substitution handling code in the Intrinsic Emitter, and didn't consider this +// case, so TableGen would hit an assertion in EncodeFixedType that was checking +// to ensure that the substitution being processed was correctly replaced. + +class IntrinsicProperty; +class SDNodeProperty; + +class ValueType { + string Namespace = "MVT"; + int Size = size; + int Value = value; +} + +def iPTR : ValueType<0 , 254>; +def Any : ValueType<0 , 255>; + +class LLVMType { + ValueType VT = vt; + int isAny = 0; +} + + +class Intrinsic ret_types> { + string LLVMName = ""; + string TargetPrefix = ""; // Set to a prefix for target-specific intrinsics. + list RetTypes = ret_types; + list ParamTypes = []; + list IntrProperties = []; + list Properties = []; + bit isTarget = 0; +} + +class LLVMQualPointerType + : LLVMType{ + LLVMType ElTy = elty; + int AddrSpace = 0; +} + +class LLVMPointerType + : LLVMQualPointerType; + +let isAny = 1 in { + def llvm_any_ty : LLVMType; +} +def i8 : ValueType<8, 3>; +def llvm_i8_ty : LLVMType; + +def int_has_ptr_to_any : Intrinsic<[LLVMPointerType, llvm_i8_ty]>; +// CHECK: /* 0 */ 21, 14, 15, 0, 2, 0 diff --git a/llvm/utils/TableGen/IntrinsicEmitter.cpp b/llvm/utils/TableGen/IntrinsicEmitter.cpp --- a/llvm/utils/TableGen/IntrinsicEmitter.cpp +++ b/llvm/utils/TableGen/IntrinsicEmitter.cpp @@ -372,6 +372,9 @@ unsigned Tmp = 0; switch (getValueType(R->getValueAsDef("VT"))) { default: break; + case MVT::iPTR: + UpdateArgCodes(R->getValueAsDef("ElTy"), ArgCodes, NumInserted, Mapping); + break; case MVT::iPTRAny: ++Tmp; LLVM_FALLTHROUGH;