diff options
Diffstat (limited to 'llvm/lib/IR/Function.cpp')
-rw-r--r-- | llvm/lib/IR/Function.cpp | 231 |
1 files changed, 39 insertions, 192 deletions
diff --git a/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp index 677db46124e4..27219e89dc5f 100644 --- a/llvm/lib/IR/Function.cpp +++ b/llvm/lib/IR/Function.cpp @@ -229,6 +229,10 @@ uint64_t Argument::getDereferenceableOrNullBytes() const { return getParent()->getParamDereferenceableOrNullBytes(getArgNo()); } +FPClassTest Argument::getNoFPClass() const { + return getParent()->getParamNoFPClass(getArgNo()); +} + bool Argument::hasNestAttr() const { if (!getType()->isPointerTy()) return false; return hasAttribute(Attribute::Nest); @@ -698,17 +702,30 @@ void Function::addDereferenceableOrNullParamAttr(unsigned ArgNo, DenormalMode Function::getDenormalMode(const fltSemantics &FPType) const { if (&FPType == &APFloat::IEEEsingle()) { - Attribute Attr = getFnAttribute("denormal-fp-math-f32"); - StringRef Val = Attr.getValueAsString(); - if (!Val.empty()) - return parseDenormalFPAttribute(Val); - + DenormalMode Mode = getDenormalModeF32Raw(); // If the f32 variant of the attribute isn't specified, try to use the // generic one. + if (Mode.isValid()) + return Mode; } + return getDenormalModeRaw(); +} + +DenormalMode Function::getDenormalModeRaw() const { Attribute Attr = getFnAttribute("denormal-fp-math"); - return parseDenormalFPAttribute(Attr.getValueAsString()); + StringRef Val = Attr.getValueAsString(); + return parseDenormalFPAttribute(Val); +} + +DenormalMode Function::getDenormalModeF32Raw() const { + Attribute Attr = getFnAttribute("denormal-fp-math-f32"); + if (Attr.isValid()) { + StringRef Val = Attr.getValueAsString(); + return parseDenormalFPAttribute(Val); + } + + return DenormalMode::getInvalid(); } const std::string &Function::getGC() const { @@ -900,11 +917,6 @@ static std::string getMangledTypeStr(Type *Ty, bool &HasUnnamedType) { std::string Result; if (PointerType *PTyp = dyn_cast<PointerType>(Ty)) { Result += "p" + utostr(PTyp->getAddressSpace()); - // Opaque pointer doesn't have pointee type information, so we just mangle - // address space for opaque pointer. - if (!PTyp->isOpaque()) - Result += getMangledTypeStr(PTyp->getNonOpaquePointerElementType(), - HasUnnamedType); } else if (ArrayType *ATyp = dyn_cast<ArrayType>(Ty)) { Result += "a" + utostr(ATyp->getNumElements()) + getMangledTypeStr(ATyp->getElementType(), HasUnnamedType); @@ -1019,70 +1031,11 @@ std::string Intrinsic::getNameNoUnnamedTypes(ID Id, ArrayRef<Type *> Tys) { /// IIT_Info - These are enumerators that describe the entries returned by the /// getIntrinsicInfoTableEntries function. /// -/// NOTE: This must be kept in synch with the copy in TblGen/IntrinsicEmitter! +/// Defined in Intrinsics.td. enum IIT_Info { - // Common values should be encoded with 0-15. - IIT_Done = 0, - IIT_I1 = 1, - IIT_I8 = 2, - IIT_I16 = 3, - IIT_I32 = 4, - IIT_I64 = 5, - IIT_F16 = 6, - IIT_F32 = 7, - IIT_F64 = 8, - IIT_V2 = 9, - IIT_V4 = 10, - IIT_V8 = 11, - IIT_V16 = 12, - IIT_V32 = 13, - IIT_PTR = 14, - IIT_ARG = 15, - - // Values from 16+ are only encodable with the inefficient encoding. - IIT_V64 = 16, - IIT_MMX = 17, - IIT_TOKEN = 18, - IIT_METADATA = 19, - IIT_EMPTYSTRUCT = 20, - IIT_STRUCT2 = 21, - IIT_STRUCT3 = 22, - IIT_STRUCT4 = 23, - IIT_STRUCT5 = 24, - IIT_EXTEND_ARG = 25, - IIT_TRUNC_ARG = 26, - IIT_ANYPTR = 27, - IIT_V1 = 28, - IIT_VARARG = 29, - IIT_HALF_VEC_ARG = 30, - IIT_SAME_VEC_WIDTH_ARG = 31, - IIT_PTR_TO_ARG = 32, - IIT_PTR_TO_ELT = 33, - IIT_VEC_OF_ANYPTRS_TO_ELT = 34, - IIT_I128 = 35, - IIT_V512 = 36, - IIT_V1024 = 37, - IIT_STRUCT6 = 38, - IIT_STRUCT7 = 39, - IIT_STRUCT8 = 40, - IIT_F128 = 41, - IIT_VEC_ELEMENT = 42, - IIT_SCALABLE_VEC = 43, - IIT_SUBDIVIDE2_ARG = 44, - IIT_SUBDIVIDE4_ARG = 45, - IIT_VEC_OF_BITCASTS_TO_INT = 46, - IIT_V128 = 47, - IIT_BF16 = 48, - IIT_STRUCT9 = 49, - IIT_V256 = 50, - IIT_AMX = 51, - IIT_PPCF128 = 52, - IIT_V3 = 53, - IIT_EXTERNREF = 54, - IIT_FUNCREF = 55, - IIT_ANYPTR_TO_ELT = 56, - IIT_I2 = 57, - IIT_I4 = 58, +#define GET_INTRINSIC_IITINFO +#include "llvm/IR/IntrinsicImpl.inc" +#undef GET_INTRINSIC_IITINFO }; static void DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> Infos, @@ -1141,6 +1094,9 @@ static void DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> Infos, case IIT_I4: OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer, 4)); return; + case IIT_AARCH64_SVCOUNT: + OutputTable.push_back(IITDescriptor::get(IITDescriptor::AArch64Svcount, 0)); + return; case IIT_I8: OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer, 8)); return; @@ -1206,22 +1162,17 @@ static void DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> Infos, return; case IIT_EXTERNREF: OutputTable.push_back(IITDescriptor::get(IITDescriptor::Pointer, 10)); - OutputTable.push_back(IITDescriptor::get(IITDescriptor::Struct, 0)); return; case IIT_FUNCREF: OutputTable.push_back(IITDescriptor::get(IITDescriptor::Pointer, 20)); - OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer, 8)); return; case IIT_PTR: OutputTable.push_back(IITDescriptor::get(IITDescriptor::Pointer, 0)); - DecodeIITType(NextElt, Infos, Info, OutputTable); return; - case IIT_ANYPTR: { // [ANYPTR addrspace, subtype] + case IIT_ANYPTR: // [ANYPTR addrspace] OutputTable.push_back(IITDescriptor::get(IITDescriptor::Pointer, Infos[NextElt++])); - DecodeIITType(NextElt, Infos, Info, OutputTable); return; - } case IIT_ARG: { unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]); OutputTable.push_back(IITDescriptor::get(IITDescriptor::Argument, ArgInfo)); @@ -1251,24 +1202,6 @@ static void DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> Infos, ArgInfo)); return; } - 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; - } 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++]); @@ -1382,6 +1315,8 @@ static Type *DecodeFixedType(ArrayRef<Intrinsic::IITDescriptor> &Infos, case IITDescriptor::Double: return Type::getDoubleTy(Context); case IITDescriptor::Quad: return Type::getFP128Ty(Context); case IITDescriptor::PPCQuad: return Type::getPPC_FP128Ty(Context); + case IITDescriptor::AArch64Svcount: + return TargetExtType::get(Context, "aarch64.svcount"); case IITDescriptor::Integer: return IntegerType::get(Context, D.Integer_Width); @@ -1389,8 +1324,7 @@ static Type *DecodeFixedType(ArrayRef<Intrinsic::IITDescriptor> &Infos, return VectorType::get(DecodeFixedType(Infos, Tys, Context), D.Vector_Width); case IITDescriptor::Pointer: - return PointerType::get(DecodeFixedType(Infos, Tys, Context), - D.Pointer_AddressSpace); + 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) @@ -1433,18 +1367,6 @@ static Type *DecodeFixedType(ArrayRef<Intrinsic::IITDescriptor> &Infos, return VectorType::get(EltTy, VTy->getElementCount()); return EltTy; } - 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); - } case IITDescriptor::VecElementArgument: { Type *Ty = Tys[D.getArgumentNumber()]; if (VectorType *VTy = dyn_cast<VectorType>(Ty)) @@ -1460,9 +1382,6 @@ static Type *DecodeFixedType(ArrayRef<Intrinsic::IITDescriptor> &Infos, case IITDescriptor::VecOfAnyPtrsToElt: // Return the overloaded type (which determines the pointers address space) return Tys[D.getOverloadArgNumber()]; - case IITDescriptor::AnyPtrToElt: - // Return the overloaded type (which determines the pointers address space) - return Tys[D.getOverloadArgNumber()]; } llvm_unreachable("unhandled"); } @@ -1556,6 +1475,9 @@ static bool matchIntrinsicType( case IITDescriptor::Quad: return !Ty->isFP128Ty(); case IITDescriptor::PPCQuad: return !Ty->isPPC_FP128Ty(); case IITDescriptor::Integer: return !Ty->isIntegerTy(D.Integer_Width); + case IITDescriptor::AArch64Svcount: + return !isa<TargetExtType>(Ty) || + cast<TargetExtType>(Ty)->getName() != "aarch64.svcount"; case IITDescriptor::Vector: { VectorType *VT = dyn_cast<VectorType>(Ty); return !VT || VT->getElementCount() != D.Vector_Width || @@ -1564,33 +1486,7 @@ static bool matchIntrinsicType( } case IITDescriptor::Pointer: { PointerType *PT = dyn_cast<PointerType>(Ty); - if (!PT || PT->getAddressSpace() != D.Pointer_AddressSpace) - return true; - if (!PT->isOpaque()) { - /* Manually consume a pointer to empty struct descriptor, which is - * used for externref. We don't want to enforce that the struct is - * anonymous in this case. (This renders externref intrinsics - * non-unique, but this will go away with opaque pointers anyway.) */ - if (Infos.front().Kind == IITDescriptor::Struct && - Infos.front().Struct_NumElements == 0) { - Infos = Infos.slice(1); - return false; - } - return matchIntrinsicType(PT->getNonOpaquePointerElementType(), Infos, - ArgTys, DeferredChecks, IsDeferredCheck); - } - // Consume IIT descriptors relating to the pointer element type. - // FIXME: Intrinsic type matching of nested single value types or even - // aggregates doesn't work properly with opaque pointers but hopefully - // doesn't happen in practice. - while (Infos.front().Kind == IITDescriptor::Pointer || - Infos.front().Kind == IITDescriptor::Vector) - Infos = Infos.slice(1); - assert((Infos.front().Kind != IITDescriptor::Argument || - Infos.front().getArgumentKind() == IITDescriptor::AK_MatchType) && - "Unsupported polymorphic pointer type with opaque pointer"); - Infos = Infos.slice(1); - return false; + return !PT || PT->getAddressSpace() != D.Pointer_AddressSpace; } case IITDescriptor::Struct: { @@ -1688,50 +1584,6 @@ static bool matchIntrinsicType( return matchIntrinsicType(EltTy, Infos, ArgTys, DeferredChecks, IsDeferredCheck); } - 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()); - } case IITDescriptor::VecOfAnyPtrsToElt: { unsigned RefArgNumber = D.getRefArgNumber(); if (RefArgNumber >= ArgTys.size()) { @@ -1757,12 +1609,7 @@ static bool matchIntrinsicType( if (!ThisArgVecTy || !ReferenceType || (ReferenceType->getElementCount() != ThisArgVecTy->getElementCount())) return true; - PointerType *ThisArgEltTy = - dyn_cast<PointerType>(ThisArgVecTy->getElementType()); - if (!ThisArgEltTy) - return true; - return !ThisArgEltTy->isOpaqueOrPointeeTypeMatches( - ReferenceType->getElementType()); + return !ThisArgVecTy->getElementType()->isPointerTy(); } case IITDescriptor::VecElementArgument: { if (D.getArgumentNumber() >= ArgTys.size()) |