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