|  | // RUN: %clang_cc1 -S -emit-llvm -o - -O2 -disable-llvm-passes %s      | FileCheck %s --implicit-check-not="call void @llvm.lifetime" --check-prefixes=CHECK,O2 | 
|  | // RUN: %clang_cc1 -S -emit-llvm -o - -O2 -disable-lifetime-markers %s | FileCheck %s --implicit-check-not="call void @llvm.lifetime" --check-prefixes=CHECK | 
|  | // RUN: %clang_cc1 -S -emit-llvm -o - -O0 %s                           | FileCheck %s --implicit-check-not="call void @llvm.lifetime" --check-prefixes=CHECK | 
|  |  | 
|  | extern int bar(char *A, int n); | 
|  |  | 
|  | // CHECK-LABEL: @foo | 
|  | int foo (int n) { | 
|  | if (n) { | 
|  | // O2: call void @llvm.lifetime.start.p0(i64 100, | 
|  | char A[100]; | 
|  | return bar(A, 1); | 
|  | // O2: call void @llvm.lifetime.end.p0(i64 100, | 
|  | } else { | 
|  | // O2: call void @llvm.lifetime.start.p0(i64 100, | 
|  | char A[100]; | 
|  | return bar(A, 2); | 
|  | // O2: call void @llvm.lifetime.end.p0(i64 100, | 
|  | } | 
|  | } | 
|  |  | 
|  | // CHECK-LABEL: @no_goto_bypass | 
|  | void no_goto_bypass(void) { | 
|  | // O2: call void @llvm.lifetime.start.p0(i64 1, | 
|  | char x; | 
|  | l1: | 
|  | bar(&x, 1); | 
|  | char y[5]; | 
|  | bar(y, 5); | 
|  | goto l1; | 
|  | // Infinite loop | 
|  | } | 
|  |  | 
|  | // CHECK-LABEL: @goto_bypass | 
|  | void goto_bypass(void) { | 
|  | { | 
|  | char x; | 
|  | l1: | 
|  | bar(&x, 1); | 
|  | } | 
|  | goto l1; | 
|  | } | 
|  |  | 
|  | // CHECK-LABEL: @no_switch_bypass | 
|  | void no_switch_bypass(int n) { | 
|  | switch (n) { | 
|  | case 1: { | 
|  | // O2: call void @llvm.lifetime.start.p0(i64 1, | 
|  | // O2: call void @llvm.lifetime.end.p0(i64 1, | 
|  | char x; | 
|  | bar(&x, 1); | 
|  | break; | 
|  | } | 
|  | case 2: | 
|  | n = n; | 
|  | // O2: call void @llvm.lifetime.start.p0(i64 5, | 
|  | // O2: call void @llvm.lifetime.end.p0(i64 5, | 
|  | char y[5]; | 
|  | bar(y, 5); | 
|  | break; | 
|  | } | 
|  | } | 
|  |  | 
|  | // CHECK-LABEL: @switch_bypass | 
|  | void switch_bypass(int n) { | 
|  | switch (n) { | 
|  | case 1: | 
|  | n = n; | 
|  | char x; | 
|  | bar(&x, 1); | 
|  | break; | 
|  | case 2: | 
|  | bar(&x, 1); | 
|  | break; | 
|  | } | 
|  | } | 
|  |  | 
|  | // CHECK-LABEL: @indirect_jump | 
|  | void indirect_jump(int n) { | 
|  | char x; | 
|  | void *T[] = {&&L}; | 
|  | goto *T[n]; | 
|  | L: | 
|  | bar(&x, 1); | 
|  | } | 
|  |  | 
|  | extern void foo2(int p); | 
|  |  | 
|  | // O2-LABEL: @jump_backward_over_declaration( | 
|  | int jump_backward_over_declaration(int a) { | 
|  | int *p = 0; | 
|  | // O2: call void @llvm.lifetime.start.p0( | 
|  | label1: | 
|  | if (p) { | 
|  | foo2(*p); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | int i = 999; | 
|  | if (a != 2) { | 
|  | p = &i; | 
|  | goto label1; | 
|  | } | 
|  | return -1; | 
|  | // O2: call void @llvm.lifetime.end.p0( | 
|  | } |