1 // RUN: %clang_cc1 -S -emit-llvm -o - -O2 -disable-llvm-passes %s | FileCheck %s -check-prefixes=CHECK,O2
2 // RUN: %clang_cc1 -S -emit-llvm -o - -O2 -disable-lifetime-markers %s \
3 // RUN: | FileCheck %s -check-prefixes=CHECK,O0
4 // RUN: %clang_cc1 -S -emit-llvm -o - -O0 %s | FileCheck %s -check-prefixes=CHECK,O0
5
6 extern int bar(char *A, int n);
7
8 // CHECK-LABEL: @foo
9 // O0-NOT: @llvm.lifetime.start.p0i8
foo(int n)10 int foo (int n) {
11 if (n) {
12 // O2: @llvm.lifetime.start.p0i8
13 char A[100];
14 return bar(A, 1);
15 } else {
16 // O2: @llvm.lifetime.start.p0i8
17 char A[100];
18 return bar(A, 2);
19 }
20 }
21
22 // CHECK-LABEL: @no_goto_bypass
no_goto_bypass()23 void no_goto_bypass() {
24 // O2: @llvm.lifetime.start.p0i8(i64 1
25 char x;
26 l1:
27 bar(&x, 1);
28 char y[5];
29 bar(y, 5);
30 goto l1;
31 // Infinite loop
32 // O2-NOT: @llvm.lifetime.end.p0i8(
33 }
34
35 // CHECK-LABEL: @goto_bypass
goto_bypass()36 void goto_bypass() {
37 {
38 // O2-NOT: @llvm.lifetime.start.p0i8(i64 1
39 // O2-NOT: @llvm.lifetime.end.p0i8(i64 1
40 char x;
41 l1:
42 bar(&x, 1);
43 }
44 goto l1;
45 }
46
47 // CHECK-LABEL: @no_switch_bypass
no_switch_bypass(int n)48 void no_switch_bypass(int n) {
49 switch (n) {
50 case 1: {
51 // O2: @llvm.lifetime.start.p0i8(i64 1
52 // O2: @llvm.lifetime.end.p0i8(i64 1
53 char x;
54 bar(&x, 1);
55 break;
56 }
57 case 2:
58 n = n;
59 // O2: @llvm.lifetime.start.p0i8(i64 5
60 // O2: @llvm.lifetime.end.p0i8(i64 5
61 char y[5];
62 bar(y, 5);
63 break;
64 }
65 }
66
67 // CHECK-LABEL: @switch_bypass
switch_bypass(int n)68 void switch_bypass(int n) {
69 switch (n) {
70 case 1:
71 n = n;
72 // O2-NOT: @llvm.lifetime.start.p0i8(i64 1
73 // O2-NOT: @llvm.lifetime.end.p0i8(i64 1
74 char x;
75 bar(&x, 1);
76 break;
77 case 2:
78 bar(&x, 1);
79 break;
80 }
81 }
82
83 // CHECK-LABEL: @indirect_jump
indirect_jump(int n)84 void indirect_jump(int n) {
85 char x;
86 // O2-NOT: @llvm.lifetime
87 void *T[] = {&&L};
88 goto *T[n];
89 L:
90 bar(&x, 1);
91 }
92
93 // O2-LABEL: @jump_backward_over_declaration(
94 // O2: %[[p:.*]] = alloca i32*
95 // O2: %[[v0:.*]] = bitcast i32** %[[p]] to i8*
96 // O2: call void @llvm.lifetime.start.p0i8(i64 {{.*}}, i8* %[[v0]])
97 // O2-NOT: call void @llvm.lifetime.start.p0i8(
98
99 extern void foo2(int p);
100
jump_backward_over_declaration(int a)101 int jump_backward_over_declaration(int a) {
102 int *p = 0;
103 label1:
104 if (p) {
105 foo2(*p);
106 return 0;
107 }
108
109 int i = 999;
110 if (a != 2) {
111 p = &i;
112 goto label1;
113 }
114 return -1;
115 }
116