Skip to content

Commit fda0dbe

Browse files
committed
Add additional invoke test in C
1 parent daba106 commit fda0dbe

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// RUN: %clang_cc1 -emit-llvm -o - %s -O1 -disable-llvm-passes -fexceptions | FileCheck %s
2+
3+
struct Trivial {
4+
int x[100];
5+
};
6+
7+
void cleanup(int *p) {}
8+
void func(struct Trivial t);
9+
struct Trivial gen(void);
10+
11+
// CHECK-LABEL: define dso_local void @test()
12+
void test() {
13+
int x __attribute__((cleanup(cleanup)));
14+
15+
// CHECK: %[[AGG1:.*]] = alloca %struct.Trivial
16+
// CHECK: %[[AGG2:.*]] = alloca %struct.Trivial
17+
18+
// CHECK: call void @llvm.lifetime.start.p0(ptr %[[AGG1]])
19+
// CHECK: invoke void @gen(ptr{{.*}} sret(%struct.Trivial){{.*}} %[[AGG1]])
20+
21+
// CHECK: invoke void @func(ptr{{.*}} byval(%struct.Trivial) align 8 %[[AGG1]])
22+
// CHECK-NEXT: to label %[[CONT1:.*]] unwind label %[[LPAD1:.*]]
23+
24+
// CHECK: [[CONT1]]:
25+
// CHECK-NOT: call void @llvm.lifetime.end.p0(ptr %[[AGG1]])
26+
27+
// CHECK: call void @llvm.lifetime.start.p0(ptr %[[AGG2]])
28+
// CHECK: invoke void @gen(ptr{{.*}} sret(%struct.Trivial) align 4 %[[AGG2]])
29+
// CHECK: invoke void @func(ptr{{.*}} byval(%struct.Trivial) align 8 %[[AGG2]])
30+
// CHECK-NEXT: to label %[[CONT2:.*]] unwind label %[[LPAD2:.*]]
31+
32+
// CHECK: [[CONT2]]:
33+
// CHECK-DAG: call void @llvm.lifetime.end.p0(ptr %[[AGG2]])
34+
// CHECK-DAG: call void @llvm.lifetime.end.p0(ptr %[[AGG1]])
35+
36+
// CHECK: [[LPAD1]]:
37+
// CHECK: landingpad
38+
// CHECK: br label %[[EHCLEANUP:.*]]
39+
40+
// CHECK: [[LPAD2]]:
41+
// CHECK: landingpad
42+
// CHECK: call void @llvm.lifetime.end.p0(ptr %[[AGG2]])
43+
// CHECK: br label %[[EHCLEANUP]]
44+
45+
// CHECK: [[EHCLEANUP]]:
46+
// CHECK: call void @llvm.lifetime.end.p0(ptr %[[AGG1]])
47+
// CHECK: call void @cleanup
48+
func(gen());
49+
func(gen());
50+
}

clang/test/CodeGenCXX/aggregate-lifetime-invoke.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ void test() {
1414
// CHECK: call void @llvm.lifetime.start.p0(ptr nonnull %[[AGG1]])
1515
// CHECK: invoke void @_Z16func_that_throws7Trivial(ptr noundef nonnull byval(%struct.Trivial) align 8 %[[AGG1]])
1616
// CHECK-NEXT: to label %[[CONT1:.*]] unwind label %[[LPAD1:.*]]
17-
17+
1818
// CHECK: [[CONT1]]:
1919
// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull %[[AGG2]])
2020
// CHECK: invoke void @_Z16func_that_throws7Trivial(ptr noundef nonnull byval(%struct.Trivial) align 8 %[[AGG2]])

0 commit comments

Comments
 (0)