1 // RUN: %clang -w -target x86_64-linux-gnu -S -emit-llvm -o - -fno-exceptions -O0 %s | \
2 // RUN:      FileCheck %s -check-prefixes=CHECK,CHECK-O0 --implicit-check-not=llvm.lifetime
3 // RUN: %clang -w -target x86_64-linux-gnu -S -emit-llvm -o - -fno-exceptions -O0 \
4 // RUN:     -fsanitize=address -fsanitize-address-use-after-scope %s | \
5 // RUN:     FileCheck %s -check-prefixes=CHECK,LIFETIME
6 // RUN: %clang -w -target x86_64-linux-gnu -S -emit-llvm -o - -fno-exceptions -O0 \
7 // RUN:     -fsanitize=memory %s | \
8 // RUN:     FileCheck %s -check-prefixes=CHECK,LIFETIME
9 // RUN: %clang -w -target aarch64-linux-gnu -S -emit-llvm -o - -fno-exceptions -O0 \
10 // RUN:     -fsanitize=hwaddress %s | \
11 // RUN:     FileCheck %s -check-prefixes=CHECK,LIFETIME
12 
13 extern int bar(char *A, int n);
14 
15 struct X {
16   X();
17   ~X();
18   int *p;
19 };
20 struct Y {
21   Y();
22   int *p;
23 };
24 
25 extern "C" void a(), b(), c(), d();
26 
27 // CHECK: define dso_local void @_Z3fooi(i32 %[[N:[^)]+]])
foo(int n)28 void foo(int n) {
29   // CHECK: store i32 %[[N]], i32* %[[NADDR:[^,]+]]
30   // CHECK-LABEL: call void @a()
31   a();
32 
33   // CHECK-LABEL: call void @b()
34   // CHECK: [[NARG:%[^ ]+]] = load i32, i32* %[[NADDR]]
35   // CHECK: [[BOOL:%[^ ]+]] = icmp ne i32 [[NARG]], 0
36   // CHECK: store i1 false
37   // CHECK: br i1 [[BOOL]], label %[[ONTRUE:[^,]+]], label %[[ONFALSE:[^,]+]]
38   //
39   // CHECK: [[ONTRUE]]:
40   // LIFETIME: @llvm.lifetime.start
41   // LIFETIME: store i1 true
42   // LIFETIME: call void @_ZN1XC
43   // CHECK: br label %[[END:[^,]+]]
44   //
45   // CHECK: [[ONFALSE]]:
46   // LIFETIME: @llvm.lifetime.start
47   // LIFETIME: store i1 true
48   // LIFETIME: call void @_ZN1YC
49   // CHECK: br label %[[END]]
50   //
51   // CHECK: [[END]]:
52   // CHECK: call void @c()
53   // LIFETIME: @llvm.lifetime.end
54   // LIFETIME: @llvm.lifetime.end
55   b(), (n ? X().p : Y().p), c();
56 
57   // CHECK: call void @d()
58   d();
59 }
60