1 // RUN: %clang -S -emit-llvm -o - -O2 %s | FileCheck %s -check-prefixes=CHECK,O2
2 // RUN: %clang -S -emit-llvm -o - -O2 -Xclang -disable-lifetime-markers %s \
3 // RUN:       | FileCheck %s -check-prefixes=CHECK,O0
4 // RUN: %clang -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
10 int foo (int n) {
11   if (n) {
12 // O2: @llvm.lifetime.start
13     char A[100];
14     return bar(A, 1);
15   } else {
16 // O2: @llvm.lifetime.start
17     char A[100];
18     return bar(A, 2);
19   }
20 }
21 
22 // CHECK-LABEL: @no_goto_bypass
23 void no_goto_bypass() {
24   // O2: @llvm.lifetime.start(i64 1
25   char x;
26 l1:
27   bar(&x, 1);
28   // O2: @llvm.lifetime.start(i64 5
29   // O2: @llvm.lifetime.end(i64 5
30   char y[5];
31   bar(y, 5);
32   goto l1;
33   // Infinite loop
34   // O2-NOT: @llvm.lifetime.end(i64 1
35 }
36 
37 // CHECK-LABEL: @goto_bypass
38 void goto_bypass() {
39   {
40     // O2-NOT: @llvm.lifetime.start(i64 1
41     // O2-NOT: @llvm.lifetime.end(i64 1
42     char x;
43   l1:
44     bar(&x, 1);
45   }
46   goto l1;
47 }
48 
49 // CHECK-LABEL: @no_switch_bypass
50 void no_switch_bypass(int n) {
51   switch (n) {
52   case 1: {
53     // O2: @llvm.lifetime.start(i64 1
54     // O2: @llvm.lifetime.end(i64 1
55     char x;
56     bar(&x, 1);
57     break;
58   }
59   case 2:
60     n = n;
61     // O2: @llvm.lifetime.start(i64 5
62     // O2: @llvm.lifetime.end(i64 5
63     char y[5];
64     bar(y, 5);
65     break;
66   }
67 }
68 
69 // CHECK-LABEL: @switch_bypass
70 void switch_bypass(int n) {
71   switch (n) {
72   case 1:
73     n = n;
74     // O2-NOT: @llvm.lifetime.start(i64 1
75     // O2-NOT: @llvm.lifetime.end(i64 1
76     char x;
77     bar(&x, 1);
78     break;
79   case 2:
80     bar(&x, 1);
81     break;
82   }
83 }
84 
85 // CHECK-LABEL: @indirect_jump
86 void indirect_jump(int n) {
87   char x;
88   // O2-NOT: @llvm.lifetime
89   void *T[] = {&&L};
90   goto *T[n];
91 L:
92   bar(&x, 1);
93 }
94