// 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( }