From 0a376b9c713a6b29131b14f66bf66ab3cb0210cd Mon Sep 17 00:00:00 2001 From: David Nadlinger Date: Sat, 4 May 2013 21:20:09 +0200 Subject: [PATCH] Avoid unnecessary memset when allocating array literals. This completes the merge of pull request #294. Thanks a lot to Chris Holdsworth who originally wrote the patch! GitHub: Fixes #294. GitHub: Fixes #141. --- gen/arrays.cpp | 4 +++- gen/passes/GarbageCollect2Stack.cpp | 2 +- gen/runtime.cpp | 3 +++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/gen/arrays.cpp b/gen/arrays.cpp index 854ec972..53daa91d 100644 --- a/gen/arrays.cpp +++ b/gen/arrays.cpp @@ -583,7 +583,9 @@ DSliceValue* DtoNewDynArray(Loc& loc, Type* arrayType, DValue* dim, bool default defaultInit = false; bool zeroInit = eltType->isZeroInit(); - const char* fnname = zeroInit ? "_d_newarrayT" : "_d_newarrayiT"; + const char* fnname = defaultInit ? + (zeroInit ? "_d_newarrayT" : "_d_newarrayiT") : + "_d_newarrayvT"; LLFunction* fn = LLVM_D_GetRuntimeFunction(gIR->module, fnname); // call allocator diff --git a/gen/passes/GarbageCollect2Stack.cpp b/gen/passes/GarbageCollect2Stack.cpp index a14c5679..70e520a9 100644 --- a/gen/passes/GarbageCollect2Stack.cpp +++ b/gen/passes/GarbageCollect2Stack.cpp @@ -358,7 +358,7 @@ FunctionPass *createGarbageCollect2Stack() { GarbageCollect2Stack::GarbageCollect2Stack() : FunctionPass(ID), AllocMemoryT(0, true, false), - NewArrayVT(0, true, false, false, 1), + NewArrayVT(0, true, true, false, 1), NewArrayT(0, true, true, true, 1) { KnownFunctions["_d_allocmemoryT"] = &AllocMemoryT; diff --git a/gen/runtime.cpp b/gen/runtime.cpp index ddee7b7e..3b2f3371 100644 --- a/gen/runtime.cpp +++ b/gen/runtime.cpp @@ -342,13 +342,16 @@ static void LLVM_D_BuildRuntimeModule() } // void[] _d_newarrayT(TypeInfo ti, size_t length) // void[] _d_newarrayiT(TypeInfo ti, size_t length) + // void[] _d_newarrayvT(TypeInfo ti, size_t length) { llvm::StringRef fname("_d_newarrayT"); llvm::StringRef fname2("_d_newarrayiT"); + llvm::StringRef fname3("_d_newarrayvT"); LLType *types[] = { typeInfoTy, sizeTy }; LLFunctionType* fty = llvm::FunctionType::get(voidArrayTy, types, false); llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M); + llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname3, M); } // void[] _d_newarraymT(TypeInfo ti, size_t length, size_t* dims) // void[] _d_newarraymiT(TypeInfo ti, size_t length, size_t* dims)