1 // RUN: %clang -S -emit-llvm -o - -O2 %s | FileCheck %s -check-prefixes=CHECK,O2 2 // RUN: %clang -S -emit-llvm -o - -O0 %s | FileCheck %s -check-prefixes=CHECK,O0 3 4 extern int bar(char *A, int n); 5 6 // CHECK-LABEL: @foo 7 // O0-NOT: @llvm.lifetime.start 8 int foo (int n) { 9 if (n) { 10 // O2: @llvm.lifetime.start 11 char A[100]; 12 return bar(A, 1); 13 } else { 14 // O2: @llvm.lifetime.start 15 char A[100]; 16 return bar(A, 2); 17 } 18 } 19 20 // CHECK-LABEL: @no_goto_bypass 21 void no_goto_bypass() { 22 // O2: @llvm.lifetime.start(i64 1 23 char x; 24 l1: 25 bar(&x, 1); 26 // O2: @llvm.lifetime.start(i64 5 27 // O2: @llvm.lifetime.end(i64 5 28 char y[5]; 29 bar(y, 5); 30 goto l1; 31 // Infinite loop 32 // O2-NOT: @llvm.lifetime.end(i64 1 33 } 34 35 // CHECK-LABEL: @goto_bypass 36 void goto_bypass() { 37 { 38 // O2-NOT: @llvm.lifetime.start(i64 1 39 // O2-NOT: @llvm.lifetime.end(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(i64 1 52 // O2: @llvm.lifetime.end(i64 1 53 char x; 54 bar(&x, 1); 55 break; 56 } 57 case 2: 58 n = n; 59 // O2: @llvm.lifetime.start(i64 5 60 // O2: @llvm.lifetime.end(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(i64 1 73 // O2-NOT: @llvm.lifetime.end(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