Clang Project

clang_source_code/test/CodeGen/lifetime2.c
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
6extern int bar(char *A, int n);
7
8// CHECK-LABEL: @foo
9// O0-NOT: @llvm.lifetime.start
10int 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
23void no_goto_bypass() {
24  // O2: @llvm.lifetime.start.p0i8(i64 1
25  char x;
26l1:
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
36void 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
48void 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
68void 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
84void indirect_jump(int n) {
85  char x;
86  // O2-NOT: @llvm.lifetime
87  void *T[] = {&&L};
88  goto *T[n];
89L:
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
99extern void foo2(int p);
100
101int jump_backward_over_declaration(int a) {
102  int *p = 0;
103label1:
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