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 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.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 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 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 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 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 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