mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-25 21:18:19 +00:00
Cache the result of Function::getIntrinsicID() in a DenseMap attached to the LLVMContext.
This reduces the time actually spent doing string to ID conversion and shows a 10% improvement in compile time for a particularly bad case that involves ARM Neon intrinsics (these have many overloads). Patch by Jean-Luc Duprat! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@176365 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
+23
-1
@@ -12,6 +12,7 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "LLVMContextImpl.h"
|
||||
#include "SymbolTableListTraitsImpl.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
@@ -208,6 +209,10 @@ Function::~Function() {
|
||||
|
||||
// Remove the function from the on-the-side GC table.
|
||||
clearGC();
|
||||
|
||||
// Remove the intrinsicID from the Cache.
|
||||
if(getValueName() && isIntrinsic())
|
||||
getContext().pImpl->IntrinsicIDCache.erase(this);
|
||||
}
|
||||
|
||||
void Function::BuildLazyArguments() const {
|
||||
@@ -337,18 +342,35 @@ void Function::copyAttributesFrom(const GlobalValue *Src) {
|
||||
/// intrinsic, or if the pointer is null. This value is always defined to be
|
||||
/// zero to allow easy checking for whether a function is intrinsic or not. The
|
||||
/// particular intrinsic functions which correspond to this value are defined in
|
||||
/// llvm/Intrinsics.h.
|
||||
/// llvm/Intrinsics.h. Results are cached in the LLVM context, subsequent
|
||||
/// requests for the same ID return results much faster from the cache.
|
||||
///
|
||||
unsigned Function::getIntrinsicID() const {
|
||||
const ValueName *ValName = this->getValueName();
|
||||
if (!ValName || !isIntrinsic())
|
||||
return 0;
|
||||
|
||||
LLVMContextImpl::IntrinsicIDCacheTy &IntrinsicIDCache =
|
||||
getContext().pImpl->IntrinsicIDCache;
|
||||
if(!IntrinsicIDCache.count(this)) {
|
||||
unsigned Id = lookupIntrinsicID();
|
||||
IntrinsicIDCache[this]=Id;
|
||||
return Id;
|
||||
}
|
||||
return IntrinsicIDCache[this];
|
||||
}
|
||||
|
||||
/// This private method does the actual lookup of an intrinsic ID when the query
|
||||
/// could not be answered from the cache.
|
||||
unsigned Function::lookupIntrinsicID() const {
|
||||
const ValueName *ValName = this->getValueName();
|
||||
unsigned Len = ValName->getKeyLength();
|
||||
const char *Name = ValName->getKeyData();
|
||||
|
||||
#define GET_FUNCTION_RECOGNIZER
|
||||
#include "llvm/IR/Intrinsics.gen"
|
||||
#undef GET_FUNCTION_RECOGNIZER
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user