summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-08-06 01:02:49 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-08-06 01:02:49 +0000
commiteb869768f98e32a65f98de019780bc1a24e622bd (patch)
treefb0a5333572c752e554650e8c3c0e5e16fe5d3ea /clang/lib
parent9de556c8b6c3f66cd21157754029c3ea13c9d7e5 (diff)
downloadbcm5719-llvm-eb869768f98e32a65f98de019780bc1a24e622bd.tar.gz
bcm5719-llvm-eb869768f98e32a65f98de019780bc1a24e622bd.zip
Patch to optimize away copy constructor call when
appropriate. llvm-svn: 78267
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/CodeGen/CGCXX.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGCXX.cpp b/clang/lib/CodeGen/CGCXX.cpp
index 5324cc622f7..0f76266acc2 100644
--- a/clang/lib/CodeGen/CGCXX.cpp
+++ b/clang/lib/CodeGen/CGCXX.cpp
@@ -255,7 +255,20 @@ CodeGenFunction::EmitCXXConstructExpr(llvm::Value *Dest,
cast<CXXRecordDecl>(E->getType()->getAs<RecordType>()->getDecl());
if (RD->hasTrivialConstructor())
return;
-
+
+ // Code gen optimization to eliminate copy constructor and return
+ // its first argument instead.
+ const CXXConstructorDecl *CDecl = E->getConstructor();
+ if (E->getNumArgs() == 1 &&
+ CDecl->isCopyConstructor(getContext())) {
+ CXXConstructExpr::const_arg_iterator i = E->arg_begin();
+ const Expr *SubExpr = (*i);
+ // FIXME. Any other cases can be optimized away?
+ if (isa<CallExpr>(SubExpr) || isa<CXXTemporaryObjectExpr>(SubExpr)) {
+ EmitAggExpr(SubExpr, Dest, false);
+ return;
+ }
+ }
// Call the constructor.
EmitCXXConstructorCall(E->getConstructor(), Ctor_Complete, Dest,
E->arg_begin(), E->arg_end());
OpenPOWER on IntegriCloud