Skip to content

Commit

Permalink
Guard Remove LLVMPointerToElt and LLVMAnyPointerToElt intrinsic types
Browse files Browse the repository at this point in the history
  • Loading branch information
Chenyang-L authored and jsji committed Aug 10, 2023
1 parent 97ebd44 commit 3963ab4
Show file tree
Hide file tree
Showing 3 changed files with 154 additions and 3 deletions.
35 changes: 32 additions & 3 deletions llvm/include/llvm/IR/Intrinsics.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,9 @@ namespace Intrinsic {
VecOfBitcastsToInt,
AMX,
PPCQuad,
#ifndef INTEL_SYCL_OPAQUEPOINTER_READY
AnyPtrToElt,
#endif // INTEL_SYCL_OPAQUEPOINTER_READY
AArch64Svcount,
} Kind;

Expand All @@ -159,33 +162,59 @@ namespace Intrinsic {
};

unsigned getArgumentNumber() const {
#ifdef INTEL_SYCL_OPAQUEPOINTER_READY
assert(Kind == Argument || Kind == ExtendArgument ||
Kind == TruncArgument || Kind == HalfVecArgument ||
Kind == SameVecWidthArgument || Kind == VecElementArgument ||
Kind == SameVecWidthArgument ||
Kind == PtrToElt || Kind == VecElementArgument ||
Kind == Subdivide2Argument || Kind == Subdivide4Argument ||
Kind == VecOfBitcastsToInt);
#else
assert(Kind == Argument || Kind == ExtendArgument ||
Kind == TruncArgument || Kind == HalfVecArgument ||
Kind == SameVecWidthArgument ||
Kind == PtrToArgument ||
Kind == PtrToElt || Kind == VecElementArgument ||
Kind == Subdivide2Argument || Kind == Subdivide4Argument ||
Kind == VecOfBitcastsToInt);

#endif // INTEL_SYCL_OPAQUEPOINTER_READY
return Argument_Info >> 3;
}
ArgKind getArgumentKind() const {
#ifndef INTEL_SYCL_OPAQUEPOINTER_READY
assert(Kind == Argument || Kind == ExtendArgument ||
Kind == TruncArgument || Kind == HalfVecArgument ||
#ifndef INTEL_SYCL_OPAQUEPOINTER_READY
Kind == PtrToArgument ||
#endif // INTEL_SYCL_OPAQUEPOINTER_READY
Kind == SameVecWidthArgument ||
Kind == VecElementArgument || Kind == Subdivide2Argument ||
Kind == Subdivide4Argument || Kind == VecOfBitcastsToInt);
#else // INTEL_SYCL_OPAQUEPOINTER_READY
assert(Kind == Argument || Kind == ExtendArgument ||
Kind == TruncArgument || Kind == HalfVecArgument ||
Kind == SameVecWidthArgument ||
Kind == VecElementArgument || Kind == Subdivide2Argument ||
Kind == Subdivide4Argument || Kind == VecOfBitcastsToInt);
#endif // INTEL_SYCL_OPAQUEPOINTER_READY
return (ArgKind)(Argument_Info & 7);
}

// VecOfAnyPtrsToElt uses both an overloaded argument (for address space)
// and a reference argument (for matching vector width and element types)
unsigned getOverloadArgNumber() const {
#ifdef INTEL_SYCL_OPAQUEPOINTER_READY
assert(Kind == VecOfAnyPtrsToElt);
#else
assert(Kind == VecOfAnyPtrsToElt || Kind == AnyPtrToElt);
#endif
return Argument_Info >> 16;
}
unsigned getRefArgNumber() const {
#ifdef INTEL_SYCL_OPAQUEPOINTER_READY
assert(Kind == VecOfAnyPtrsToElt);
#else
assert(Kind == VecOfAnyPtrsToElt || Kind == AnyPtrToElt);
#endif
return Argument_Info & 0xFFFF;
}

Expand Down
37 changes: 37 additions & 0 deletions llvm/include/llvm/IR/Intrinsics.td
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,10 @@ def IIT_V1 : IIT_Vec<1, 28>;
def IIT_VARARG : IIT_VT<isVoid, 29>;
def IIT_HALF_VEC_ARG : IIT_Base<30>;
def IIT_SAME_VEC_WIDTH_ARG : IIT_Base<31>;
#ifndef INTEL_SYCL_OPAQUEPOINTER_READY
def IIT_PTR_TO_ARG : IIT_Base<32>;
def IIT_PTR_TO_ELT : IIT_Base<33>;
#endif // INTEL_SYCL_OPAQUEPOINTER_READY
def IIT_VEC_OF_ANYPTRS_TO_ELT : IIT_Base<34>;
def IIT_I128 : IIT_Int<128, 35>;
def IIT_V512 : IIT_Vec<512, 36>;
Expand All @@ -316,6 +320,9 @@ def IIT_PPCF128 : IIT_VT<ppcf128, 52>;
def IIT_V3 : IIT_Vec<3, 53>;
def IIT_EXTERNREF : IIT_VT<externref, 54>;
def IIT_FUNCREF : IIT_VT<funcref, 55>;
#ifndef INTEL_SYCL_OPAQUEPOINTER_READY
def IIT_ANYPTR_TO_ELT : IIT_Base<56>;
#endif // INTEL_SYCL_OPAQUEPOINTER_READY
def IIT_I2 : IIT_Int<2, 57>;
def IIT_I4 : IIT_Int<4, 58>;
def IIT_AARCH64_SVCOUNT : IIT_VT<aarch64svcount, 59>;
Expand Down Expand Up @@ -446,6 +453,12 @@ class LLVMScalarOrSameVectorWidth<int idx, LLVMType elty>
], elty.Sig);
}

#ifndef INTEL_SYCL_OPAQUEPOINTER_READY
class LLVMPointerTo<int num> : LLVMMatchType<num, IIT_PTR_TO_ARG>;
class LLVMPointerToElt<int num> : LLVMMatchType<num, IIT_PTR_TO_ELT>;
class LLVMAnyPointerToElt<int num>
: LLVMMatchTypeNextArg<num, IIT_ANYPTR_TO_ELT>;
#endif // INTEL_SYCL_OPAQUEPOINTER_READY
class LLVMVectorOfAnyPointersToElt<int num>
: LLVMMatchTypeNextArg<num, IIT_VEC_OF_ANYPTRS_TO_ELT>;
class LLVMVectorElementType<int num> : LLVMMatchType<num, IIT_VEC_ELEMENT>;
Expand Down Expand Up @@ -1872,14 +1885,22 @@ def int_vp_scatter: DefaultAttrsIntrinsic<[],
// Experimental strided memory accesses
def int_experimental_vp_strided_store : DefaultAttrsIntrinsic<[],
[ llvm_anyvector_ty,
#ifdef INTEL_SYCL_OPAQUEPOINTER_READY
llvm_anyptr_ty,
#else
LLVMAnyPointerToElt<0>,
#endif
llvm_anyint_ty, // Stride in bytes
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
llvm_i32_ty],
[ NoCapture<ArgIndex<1>>, IntrNoSync, IntrWriteMem, IntrArgMemOnly, IntrWillReturn ]>;

def int_experimental_vp_strided_load : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
#ifdef INTEL_SYCL_OPAQUEPOINTER_READY
[ llvm_anyptr_ty,
#else
[ LLVMAnyPointerToElt<0>,
#endif
llvm_anyint_ty, // Stride in bytes
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
llvm_i32_ty],
Expand Down Expand Up @@ -2299,13 +2320,21 @@ def int_masked_scatter:

def int_masked_expandload:
DefaultAttrsIntrinsic<[llvm_anyvector_ty],
#ifdef INTEL_SYCL_OPAQUEPOINTER_READY
[llvm_ptr_ty, LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
#else
[LLVMPointerToElt<0>, LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
#endif
LLVMMatchType<0>],
[IntrReadMem, IntrWillReturn, NoCapture<ArgIndex<0>>]>;

def int_masked_compressstore:
DefaultAttrsIntrinsic<[],
#ifdef INTEL_SYCL_OPAQUEPOINTER_READY
[llvm_anyvector_ty, llvm_ptr_ty,
#else
[llvm_anyvector_ty, LLVMPointerToElt<0>,
#endif
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>],
[IntrWriteMem, IntrArgMemOnly, IntrWillReturn,
NoCapture<ArgIndex<1>>]>;
Expand Down Expand Up @@ -2444,15 +2473,23 @@ def int_matrix_multiply

def int_matrix_column_major_load
: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
#ifdef INTEL_SYCL_OPAQUEPOINTER_READY
[llvm_ptr_ty, llvm_anyint_ty, llvm_i1_ty,
#else
[LLVMPointerToElt<0>, llvm_anyint_ty, llvm_i1_ty,
#endif
llvm_i32_ty, llvm_i32_ty],
[IntrNoSync, IntrWillReturn, IntrArgMemOnly, IntrReadMem,
NoCapture<ArgIndex<0>>, ImmArg<ArgIndex<2>>, ImmArg<ArgIndex<3>>,
ImmArg<ArgIndex<4>>]>;

def int_matrix_column_major_store
: DefaultAttrsIntrinsic<[],
#ifdef INTEL_SYCL_OPAQUEPOINTER_READY
[llvm_anyvector_ty, llvm_ptr_ty,
#else
[llvm_anyvector_ty, LLVMPointerToElt<0>,
#endif
llvm_anyint_ty, llvm_i1_ty, llvm_i32_ty, llvm_i32_ty],
[IntrNoSync, IntrWillReturn, IntrArgMemOnly, IntrWriteMem,
WriteOnly<ArgIndex<1>>, NoCapture<ArgIndex<1>>,
Expand Down
85 changes: 85 additions & 0 deletions llvm/lib/IR/Function.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1209,6 +1209,26 @@ static void DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> Infos,
ArgInfo));
return;
}
#ifndef INTEL_SYCL_OPAQUEPOINTER_READY
case IIT_PTR_TO_ARG: {
unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]);
OutputTable.push_back(IITDescriptor::get(IITDescriptor::PtrToArgument,
ArgInfo));
return;
}
case IIT_PTR_TO_ELT: {
unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]);
OutputTable.push_back(IITDescriptor::get(IITDescriptor::PtrToElt, ArgInfo));
return;
}
case IIT_ANYPTR_TO_ELT: {
unsigned short ArgNo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]);
unsigned short RefNo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]);
OutputTable.push_back(
IITDescriptor::get(IITDescriptor::AnyPtrToElt, ArgNo, RefNo));
return;
}
#endif // INTEL_SYCL_OPAQUEPOINTER_READY
case IIT_VEC_OF_ANYPTRS_TO_ELT: {
unsigned short ArgNo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]);
unsigned short RefNo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]);
Expand Down Expand Up @@ -1374,6 +1394,20 @@ static Type *DecodeFixedType(ArrayRef<Intrinsic::IITDescriptor> &Infos,
return VectorType::get(EltTy, VTy->getElementCount());
return EltTy;
}
#ifndef INTEL_SYCL_OPAQUEPOINTER_READY
case IITDescriptor::PtrToArgument: {
Type *Ty = Tys[D.getArgumentNumber()];
return PointerType::getUnqual(Ty);
}
case IITDescriptor::PtrToElt: {
Type *Ty = Tys[D.getArgumentNumber()];
VectorType *VTy = dyn_cast<VectorType>(Ty);
if (!VTy)
llvm_unreachable("Expected an argument of Vector Type");
Type *EltTy = VTy->getElementType();
return PointerType::getUnqual(EltTy);
}
#endif // INTEL_SYCL_OPAQUEPOINTER_READY
case IITDescriptor::VecElementArgument: {
Type *Ty = Tys[D.getArgumentNumber()];
if (VectorType *VTy = dyn_cast<VectorType>(Ty))
Expand All @@ -1389,6 +1423,11 @@ static Type *DecodeFixedType(ArrayRef<Intrinsic::IITDescriptor> &Infos,
case IITDescriptor::VecOfAnyPtrsToElt:
// Return the overloaded type (which determines the pointers address space)
return Tys[D.getOverloadArgNumber()];
#ifndef INTEL_SYCL_OPAQUEPOINTER_READY
case IITDescriptor::AnyPtrToElt:
// Return the overloaded type (which determines the pointers address space)
return Tys[D.getOverloadArgNumber()];
#endif // INTEL_SYCL_OPAQUEPOINTER_READY
}
llvm_unreachable("unhandled");
}
Expand Down Expand Up @@ -1591,6 +1630,52 @@ static bool matchIntrinsicType(
return matchIntrinsicType(EltTy, Infos, ArgTys, DeferredChecks,
IsDeferredCheck);
}
#ifndef INTEL_SYCL_OPAQUEPOINTER_READY
case IITDescriptor::PtrToArgument: {
if (D.getArgumentNumber() >= ArgTys.size())
return IsDeferredCheck || DeferCheck(Ty);
Type * ReferenceType = ArgTys[D.getArgumentNumber()];
PointerType *ThisArgType = dyn_cast<PointerType>(Ty);
return (!ThisArgType ||
!ThisArgType->isOpaqueOrPointeeTypeMatches(ReferenceType));
}
case IITDescriptor::PtrToElt: {
if (D.getArgumentNumber() >= ArgTys.size())
return IsDeferredCheck || DeferCheck(Ty);
VectorType * ReferenceType =
dyn_cast<VectorType> (ArgTys[D.getArgumentNumber()]);
PointerType *ThisArgType = dyn_cast<PointerType>(Ty);

if (!ThisArgType || !ReferenceType)
return true;
return !ThisArgType->isOpaqueOrPointeeTypeMatches(
ReferenceType->getElementType());
}
case IITDescriptor::AnyPtrToElt: {
unsigned RefArgNumber = D.getRefArgNumber();
if (RefArgNumber >= ArgTys.size()) {
if (IsDeferredCheck)
return true;
// If forward referencing, already add the pointer type and
// defer the checks for later.
ArgTys.push_back(Ty);
return DeferCheck(Ty);
}

if (!IsDeferredCheck) {
assert(D.getOverloadArgNumber() == ArgTys.size() &&
"Table consistency error");
ArgTys.push_back(Ty);
}

auto *ReferenceType = dyn_cast<VectorType>(ArgTys[RefArgNumber]);
auto *ThisArgType = dyn_cast<PointerType>(Ty);
if (!ThisArgType || !ReferenceType)
return true;
return !ThisArgType->isOpaqueOrPointeeTypeMatches(
ReferenceType->getElementType());
}
#endif // INTEL_SYCL_OPAQUEPOINTER_READY
case IITDescriptor::VecOfAnyPtrsToElt: {
unsigned RefArgNumber = D.getRefArgNumber();
if (RefArgNumber >= ArgTys.size()) {
Expand Down

0 comments on commit 3963ab4

Please sign in to comment.