diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-05-15 06:46:45 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-05-15 06:46:45 +0000 |
commit | d86c477fb5d3fc34864afecbbb5443da9355e8fb (patch) | |
tree | 43c06bb0a10f4cce71fbd57c3b2d8d97e7acae20 /test/CodeGenCXX/nrvo.cpp | |
parent | 5077c3876beeaed32280af88244e8050078619a8 (diff) |
Implement a simple form of the C++ named return value optimization for
return statements. We perform NRVO only when all of the return
statements in the function return the same variable. Fixes some link
failures in Boost.Interprocess (which is relying on NRVO), and
probably improves performance for some C++ applications.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@103867 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGenCXX/nrvo.cpp')
-rw-r--r-- | test/CodeGenCXX/nrvo.cpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/test/CodeGenCXX/nrvo.cpp b/test/CodeGenCXX/nrvo.cpp new file mode 100644 index 0000000000..7b4f20398d --- /dev/null +++ b/test/CodeGenCXX/nrvo.cpp @@ -0,0 +1,55 @@ +// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s + +// Test code generation for the named return value optimization. +class X { +public: + X(); + X(const X&); + ~X(); +}; + +// CHECK: define void @_Z5test0v +X test0() { + X x; + // CHECK-NOT: call void @_ZN1XD1Ev + // CHECK: ret void + return x; +} + +// CHECK: define void @_Z5test1b( +X test1(bool B) { + // CHECK: call void @_ZN1XC1Ev + X x; + // CHECK-NOT: call void @_ZN1XD1Ev + // CHECK: ret void + if (B) + return (x); + return x; +} + +// CHECK: define void @_Z5test2b +X test2(bool B) { + // No NRVO + // CHECK: call void @_ZN1XC1Ev + X x; + // CHECK: call void @_ZN1XC1Ev + X y; + // CHECK: call void @_ZN1XC1ERKS_ + if (B) + return y; + // CHECK: call void @_ZN1XC1ERKS_ + return x; + // CHECK: call void @_ZN1XD1Ev + // CHECK: call void @_ZN1XD1Ev + // CHECK: ret void +} + +X test3(bool B) { + // FIXME: We don't manage to apply NRVO here, although we could. + { + X y; + return y; + } + X x; + return x; +} |