summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGExprAgg.cpp
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2008-11-30 02:11:09 +0000
committerEli Friedman <eli.friedman@gmail.com>2008-11-30 02:11:09 +0000
commitc59bb48e80cd83b6fdd8429ab6c43fb6526ab254 (patch)
tree65db88378c903a2aeaaee159398789d59df52c14 /clang/lib/CodeGen/CGExprAgg.cpp
parent79ceb0947b3ea8e3b2553633bbffb6e2d7614095 (diff)
downloadbcm5719-llvm-c59bb48e80cd83b6fdd8429ab6c43fb6526ab254.tar.gz
bcm5719-llvm-c59bb48e80cd83b6fdd8429ab6c43fb6526ab254.zip
Fix for PR2969: generate a memcpy from a constant for constant
initializers. llvm-gcc appears to be more aggressive, but incorrect, for constructs like "const int a[] = {1,2,3};"; that said, current optimizers will do the appropriate optimizations when safe. llvm-svn: 60270
Diffstat (limited to 'clang/lib/CodeGen/CGExprAgg.cpp')
-rw-r--r--clang/lib/CodeGen/CGExprAgg.cpp25
1 files changed, 17 insertions, 8 deletions
diff --git a/clang/lib/CodeGen/CGExprAgg.cpp b/clang/lib/CodeGen/CGExprAgg.cpp
index a06d3b63c16..39c3b499545 100644
--- a/clang/lib/CodeGen/CGExprAgg.cpp
+++ b/clang/lib/CodeGen/CGExprAgg.cpp
@@ -368,14 +368,23 @@ void AggExprEmitter::VisitInitListExpr(InitListExpr *E) {
CGF.ErrorUnsupported(E, "initializer list with designators");
return;
}
-
- // FIXME: For constant expressions, call into const expr emitter so
- // that we can emit a memcpy instead of storing the individual
- // members. This is purely for perf; both codepaths lead to
- // equivalent (although not necessarily identical) code. It's worth
- // noting that LLVM keeps on getting smarter, though, so it might
- // not be worth bothering.
-
+
+ // If we can, prefer a copy from a global; this is a lot less
+ // code for long globals, and it's easier for the current optimizers
+ // to analyze.
+ // FIXME: Should we really be doing this? Should we try to avoid
+ // cases where we emit a global with a lot of zeros? Should
+ // we try to avoid short globals?
+ if (E->isConstantExpr(CGF.getContext(), 0)) {
+ llvm::Constant* C = CGF.CGM.EmitConstantExpr(E, &CGF);
+ llvm::GlobalVariable* GV =
+ new llvm::GlobalVariable(C->getType(), true,
+ llvm::GlobalValue::InternalLinkage,
+ C, "", &CGF.CGM.getModule(), 0);
+ CGF.EmitAggregateCopy(DestPtr, GV, E->getType());
+ return;
+ }
+
// Handle initialization of an array.
if (E->getType()->isArrayType()) {
const llvm::PointerType *APType =
OpenPOWER on IntegriCloud