Index: llvm/trunk/include/llvm/IR/Function.h =================================================================== --- llvm/trunk/include/llvm/IR/Function.h +++ llvm/trunk/include/llvm/IR/Function.h @@ -137,7 +137,13 @@ /// The particular intrinsic functions which correspond to this value are /// defined in llvm/Intrinsics.h. Intrinsic::ID getIntrinsicID() const LLVM_READONLY { return IntID; } - bool isIntrinsic() const { return getName().startswith("llvm."); } + bool isIntrinsic() const { + // Intrinsic::not_intrinsic must be 0. + return IntID != 0; + } + /// Return true if the function's name starts with "llvm.". All intrinsics + /// have this prefix. + bool hasLLVMReservedName() const { return getName().startswith("llvm."); } /// \brief Recalculate the ID for this function if it is an Intrinsic defined /// in llvm/Intrinsics.h. Sets the intrinsic ID to Intrinsic::not_intrinsic Index: llvm/trunk/lib/CodeGen/WinEHPrepare.cpp =================================================================== --- llvm/trunk/lib/CodeGen/WinEHPrepare.cpp +++ llvm/trunk/lib/CodeGen/WinEHPrepare.cpp @@ -949,10 +949,14 @@ continue; // Skip call sites which are nounwind intrinsics or inline asm. + // + // FIXME: Should this check isIntrinsic() instead of + // hasLLVMReservedName? The latter is conservative. auto *CalledFn = dyn_cast(CS.getCalledValue()->stripPointerCasts()); - if (CalledFn && ((CalledFn->isIntrinsic() && CS.doesNotThrow()) || - CS.isInlineAsm())) + if (CalledFn && + ((CalledFn->hasLLVMReservedName() && CS.doesNotThrow()) || + CS.isInlineAsm())) continue; // This call site was not part of this funclet, remove it. Index: llvm/trunk/lib/IR/AsmWriter.cpp =================================================================== --- llvm/trunk/lib/IR/AsmWriter.cpp +++ llvm/trunk/lib/IR/AsmWriter.cpp @@ -905,7 +905,7 @@ // Process metadata used directly by intrinsics. if (const CallInst *CI = dyn_cast(&I)) if (Function *F = CI->getCalledFunction()) - if (F->isIntrinsic()) + if (F->hasLLVMReservedName()) for (auto &Op : I.operands()) if (auto *V = dyn_cast_or_null(Op)) if (MDNode *N = dyn_cast(V->getMetadata())) @@ -3378,7 +3378,7 @@ static bool isReferencingMDNode(const Instruction &I) { if (const auto *CI = dyn_cast(&I)) if (Function *F = CI->getCalledFunction()) - if (F->isIntrinsic()) + if (F->hasLLVMReservedName()) for (auto &Op : I.operands()) if (auto *V = dyn_cast_or_null(Op)) if (isa(V->getMetadata())) Index: llvm/trunk/lib/IR/Function.cpp =================================================================== --- llvm/trunk/lib/IR/Function.cpp +++ llvm/trunk/lib/IR/Function.cpp @@ -488,9 +488,7 @@ /// \brief This does the actual lookup of an intrinsic ID which /// matches the given function name. -static Intrinsic::ID lookupIntrinsicID(const ValueName *ValName) { - StringRef Name = ValName->getKey(); - +static Intrinsic::ID lookupIntrinsicID(StringRef Name) { ArrayRef NameTable = findTargetSubtable(Name); int Idx = Intrinsic::lookupLLVMIntrinsicByName(NameTable, Name); if (Idx == -1) @@ -508,12 +506,11 @@ } void Function::recalculateIntrinsicID() { - const ValueName *ValName = this->getValueName(); - if (!ValName || !isIntrinsic()) { + if (!hasLLVMReservedName()) { IntID = Intrinsic::not_intrinsic; return; } - IntID = lookupIntrinsicID(ValName); + IntID = lookupIntrinsicID(getName()); } /// Returns a stable mangling for the type specified for use in the name Index: llvm/trunk/lib/IR/Verifier.cpp =================================================================== --- llvm/trunk/lib/IR/Verifier.cpp +++ llvm/trunk/lib/IR/Verifier.cpp @@ -3647,7 +3647,7 @@ // Check to make sure that the "address of" an intrinsic function is never // taken. Assert( - !F->isIntrinsic() || + !F->hasLLVMReservedName() || i == (isa(I) ? e - 1 : isa(I) ? e - 3 : 0), "Cannot take the address of an intrinsic!", &I); Assert(