r324776 - [CodeGen] Use the zero initializer instead of storing an all zero representation.
Matt Davis via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 9 14:10:09 PST 2018
Author: mattd
Date: Fri Feb 9 14:10:09 2018
New Revision: 324776
URL: http://llvm.org/viewvc/llvm-project?rev=324776&view=rev
Log:
[CodeGen] Use the zero initializer instead of storing an all zero representation.
Summary:
This change avoids the overhead of storing, and later crawling,
an initializer list of all zeros for arrays. When LLVM
visits this (llvm/IR/Constants.cpp) ConstantArray::getImpl()
it will scan the list looking for an array of all zero.
We can avoid the store, and short-cut the scan, by detecting
all zeros when clang builds-up the initialization representation.
This was brought to my attention when investigating PR36030
Reviewers: majnemer, rjmccall
Reviewed By: rjmccall
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D42549
Added:
cfe/trunk/test/CodeGen/array-init.c
Modified:
cfe/trunk/lib/CodeGen/CGExprConstant.cpp
Modified: cfe/trunk/lib/CodeGen/CGExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprConstant.cpp?rev=324776&r1=324775&r2=324776&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExprConstant.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExprConstant.cpp Fri Feb 9 14:10:09 2018
@@ -859,9 +859,10 @@ public:
// Copy initializer elements.
SmallVector<llvm::Constant*, 16> Elts;
- Elts.reserve(NumInitableElts + NumElements);
+ Elts.reserve(std::max(NumInitableElts, NumElements));
bool RewriteType = false;
+ bool AllNullValues = true;
for (unsigned i = 0; i < NumInitableElts; ++i) {
Expr *Init = ILE->getInit(i);
llvm::Constant *C = Emitter.tryEmitPrivateForMemory(Init, EltType);
@@ -869,15 +870,22 @@ public:
return nullptr;
RewriteType |= (C->getType() != ElemTy);
Elts.push_back(C);
+ if (AllNullValues && !C->isNullValue())
+ AllNullValues = false;
}
+ // If all initializer elements are "zero," then avoid storing NumElements
+ // instances of the zero representation.
+ if (AllNullValues)
+ return llvm::ConstantAggregateZero::get(AType);
+
RewriteType |= (fillC->getType() != ElemTy);
Elts.resize(NumElements, fillC);
if (RewriteType) {
// FIXME: Try to avoid packing the array
std::vector<llvm::Type*> Types;
- Types.reserve(NumInitableElts + NumElements);
+ Types.reserve(Elts.size());
for (unsigned i = 0, e = Elts.size(); i < e; ++i)
Types.push_back(Elts[i]->getType());
llvm::StructType *SType = llvm::StructType::get(AType->getContext(),
Added: cfe/trunk/test/CodeGen/array-init.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/array-init.c?rev=324776&view=auto
==============================================================================
--- cfe/trunk/test/CodeGen/array-init.c (added)
+++ cfe/trunk/test/CodeGen/array-init.c Fri Feb 9 14:10:09 2018
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 %s -O0 -triple x86_64-unknown-linux-gnu -emit-llvm -o - | FileCheck %s
+
+// CHECK: @{{.*}}.a1 = internal constant [5 x i32] [i32 0, i32 1, i32 2, i32 0, i32 0]
+// CHECK: @{{.*}}.a2 = internal constant [5 x i32] zeroinitializer
+// CHECK: @{{.*}}.a3 = internal constant [5 x i32] zeroinitializer
+
+void testConstArrayInits(void)
+{
+ const int a1[5] = {0,1,2};
+ const int a2[5] = {0,0,0};
+ const int a3[5] = {0};
+}
More information about the cfe-commits
mailing list