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