summaryrefslogtreecommitdiff
path: root/test/CodeGenCXX/conditional-temporaries.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/CodeGenCXX/conditional-temporaries.cpp')
-rw-r--r--test/CodeGenCXX/conditional-temporaries.cpp164
1 files changed, 156 insertions, 8 deletions
diff --git a/test/CodeGenCXX/conditional-temporaries.cpp b/test/CodeGenCXX/conditional-temporaries.cpp
index e08de61f9d41d..48c9117882659 100644
--- a/test/CodeGenCXX/conditional-temporaries.cpp
+++ b/test/CodeGenCXX/conditional-temporaries.cpp
@@ -1,6 +1,7 @@
// REQUIRES: amdgpu-registered-target
-// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -O3 | FileCheck %s
-// RUN: %clang_cc1 -emit-llvm %s -o - -triple=amdgcn-amd-amdhsa -O3 | FileCheck %s
+// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -O2 -disable-llvm-passes | FileCheck %s --check-prefixes=CHECK,CHECK-NOOPT
+// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -O2 | FileCheck %s --check-prefixes=CHECK,CHECK-OPT
+// RUN: %clang_cc1 -emit-llvm %s -o - -triple=amdgcn-amd-amdhsa -O2 | FileCheck %s --check-prefixes=CHECK,CHECK-OPT
namespace {
@@ -38,20 +39,167 @@ Checker c;
}
-// CHECK-LABEL: define i32 @_Z12getCtorCallsv()
+// CHECK-OPT-LABEL: define i32 @_Z12getCtorCallsv()
int getCtorCalls() {
- // CHECK: ret i32 5
+ // CHECK-OPT: ret i32 5
return ctorcalls;
}
-// CHECK-LABEL: define i32 @_Z12getDtorCallsv()
+// CHECK-OPT-LABEL: define i32 @_Z12getDtorCallsv()
int getDtorCalls() {
- // CHECK: ret i32 5
+ // CHECK-OPT: ret i32 5
return dtorcalls;
}
-// CHECK-LABEL: define zeroext i1 @_Z7successv()
+// CHECK-OPT-LABEL: define zeroext i1 @_Z7successv()
bool success() {
- // CHECK: ret i1 true
+ // CHECK-OPT: ret i1 true
return ctorcalls == dtorcalls;
}
+
+struct X { ~X(); int f(); };
+int g(int, int, int);
+// CHECK-LABEL: @_Z16lifetime_nontriv
+int lifetime_nontriv(bool cond) {
+ // CHECK-NOOPT: store i1 false,
+ // CHECK-NOOPT: store i1 false,
+ // CHECK-NOOPT: store i1 false,
+ // CHECK-NOOPT: store i1 false,
+ // CHECK-NOOPT: store i1 false,
+ // CHECK-NOOPT: store i1 false,
+ // CHECK-NOOPT: br i1
+ //
+ // CHECK-NOOPT: call void @llvm.lifetime.start
+ // CHECK-NOOPT: store i1 true,
+ // CHECK-NOOPT: store i1 true,
+ // CHECK-NOOPT: call i32 @_ZN1X1fEv(
+ // CHECK-NOOPT: call void @llvm.lifetime.start
+ // CHECK-NOOPT: store i1 true,
+ // CHECK-NOOPT: store i1 true,
+ // CHECK-NOOPT: call i32 @_ZN1X1fEv(
+ // CHECK-NOOPT: call void @llvm.lifetime.start
+ // CHECK-NOOPT: store i1 true,
+ // CHECK-NOOPT: store i1 true,
+ // CHECK-NOOPT: call i32 @_ZN1X1fEv(
+ // CHECK-NOOPT: call i32 @_Z1giii(
+ // CHECK-NOOPT: br label
+ //
+ // CHECK-NOOPT: call i32 @_Z1giii(i32 1, i32 2, i32 3)
+ // CHECK-NOOPT: br label
+ //
+ // CHECK-NOOPT: load i1,
+ // CHECK-NOOPT: br i1
+ // CHECK-NOOPT: call void @_ZN1XD1Ev(
+ // CHECK-NOOPT: br label
+ //
+ // CHECK-NOOPT: load i1,
+ // CHECK-NOOPT: br i1
+ // CHECK-NOOPT: call void @llvm.lifetime.end
+ // CHECK-NOOPT: br label
+ //
+ // CHECK-NOOPT: load i1,
+ // CHECK-NOOPT: br i1
+ // CHECK-NOOPT: call void @_ZN1XD1Ev(
+ // CHECK-NOOPT: br label
+ //
+ // CHECK-NOOPT: load i1,
+ // CHECK-NOOPT: br i1
+ // CHECK-NOOPT: call void @llvm.lifetime.end
+ // CHECK-NOOPT: br label
+ //
+ // CHECK-NOOPT: load i1,
+ // CHECK-NOOPT: br i1
+ // CHECK-NOOPT: call void @_ZN1XD1Ev(
+ // CHECK-NOOPT: br label
+ //
+ // CHECK-NOOPT: load i1,
+ // CHECK-NOOPT: br i1
+ // CHECK-NOOPT: call void @llvm.lifetime.end
+ // CHECK-NOOPT: br label
+ //
+ // CHECK-NOOPT: ret
+
+ // CHECK-OPT: br i1
+ //
+ // CHECK-OPT: call void @llvm.lifetime.start
+ // CHECK-OPT: call i32 @_ZN1X1fEv(
+ // CHECK-OPT: call void @llvm.lifetime.start
+ // CHECK-OPT: call i32 @_ZN1X1fEv(
+ // CHECK-OPT: call void @llvm.lifetime.start
+ // CHECK-OPT: call i32 @_ZN1X1fEv(
+ // CHECK-OPT: call i32 @_Z1giii(
+ // CHECK-OPT: call void @_ZN1XD1Ev(
+ // CHECK-OPT: call void @llvm.lifetime.end
+ // CHECK-OPT: call void @_ZN1XD1Ev(
+ // CHECK-OPT: call void @llvm.lifetime.end
+ // CHECK-OPT: call void @_ZN1XD1Ev(
+ // CHECK-OPT: call void @llvm.lifetime.end
+ // CHECK-OPT: br label
+ return cond ? g(X().f(), X().f(), X().f()) : g(1, 2, 3);
+}
+
+struct Y { int f(); };
+int g(int, int, int);
+// CHECK-LABEL: @_Z13lifetime_triv
+int lifetime_triv(bool cond) {
+ // CHECK-NOOPT: call void @llvm.lifetime.start
+ // CHECK-NOOPT: call void @llvm.lifetime.start
+ // CHECK-NOOPT: call void @llvm.lifetime.start
+ // CHECK-NOOPT: br i1
+ //
+ // CHECK-NOOPT: call i32 @_ZN1Y1fEv(
+ // CHECK-NOOPT: call i32 @_ZN1Y1fEv(
+ // CHECK-NOOPT: call i32 @_ZN1Y1fEv(
+ // CHECK-NOOPT: call i32 @_Z1giii(
+ // CHECK-NOOPT: br label
+ //
+ // CHECK-NOOPT: call i32 @_Z1giii(i32 1, i32 2, i32 3)
+ // CHECK-NOOPT: br label
+ //
+ // CHECK-NOOPT: call void @llvm.lifetime.end
+ // CHECK-NOOPT-NOT: br
+ // CHECK-NOOPT: call void @llvm.lifetime.end
+ // CHECK-NOOPT-NOT: br
+ // CHECK-NOOPT: call void @llvm.lifetime.end
+ //
+ // CHECK-NOOPT: ret
+
+ // FIXME: LLVM isn't smart enough to remove the lifetime markers from the
+ // g(1, 2, 3) path here.
+
+ // CHECK-OPT: call void @llvm.lifetime.start
+ // CHECK-OPT: call void @llvm.lifetime.start
+ // CHECK-OPT: call void @llvm.lifetime.start
+ // CHECK-OPT: br i1
+ //
+ // CHECK-OPT: call i32 @_ZN1Y1fEv(
+ // CHECK-OPT: call i32 @_ZN1Y1fEv(
+ // CHECK-OPT: call i32 @_ZN1Y1fEv(
+ // CHECK-OPT: call i32 @_Z1giii(
+ // CHECK-OPT: br label
+ //
+ // CHECK-OPT: call void @llvm.lifetime.end
+ // CHECK-OPT: call void @llvm.lifetime.end
+ // CHECK-OPT: call void @llvm.lifetime.end
+ return cond ? g(Y().f(), Y().f(), Y().f()) : g(1, 2, 3);
+}
+
+struct Z { ~Z() {} int f(); };
+int g(int, int, int);
+// CHECK-LABEL: @_Z22lifetime_nontriv_empty
+int lifetime_nontriv_empty(bool cond) {
+ // CHECK-OPT: br i1
+ //
+ // CHECK-OPT: call void @llvm.lifetime.start
+ // CHECK-OPT: call i32 @_ZN1Z1fEv(
+ // CHECK-OPT: call void @llvm.lifetime.start
+ // CHECK-OPT: call i32 @_ZN1Z1fEv(
+ // CHECK-OPT: call void @llvm.lifetime.start
+ // CHECK-OPT: call i32 @_ZN1Z1fEv(
+ // CHECK-OPT: call i32 @_Z1giii(
+ // CHECK-OPT: call void @llvm.lifetime.end
+ // CHECK-OPT: call void @llvm.lifetime.end
+ // CHECK-OPT: call void @llvm.lifetime.end
+ // CHECK-OPT: br label
+ return cond ? g(Z().f(), Z().f(), Z().f()) : g(1, 2, 3);
+}