diff --git a/clang/test/CodeGen/lifetime.c b/clang/test/CodeGen/lifetime.c --- a/clang/test/CodeGen/lifetime.c +++ b/clang/test/CodeGen/lifetime.c @@ -1,13 +1,19 @@ -// RUN: %clang -S -emit-llvm -o - -O0 %s | FileCheck %s -check-prefix=O0 -// RUN: %clang -S -emit-llvm -o - -O1 %s | FileCheck %s -check-prefix=O1 -// RUN: %clang -S -emit-llvm -o - -O2 %s | FileCheck %s -check-prefix=O2 -// RUN: %clang -S -emit-llvm -o - -O3 %s | FileCheck %s -check-prefix=O3 +// RUN: %clang -S -emit-llvm -o - -O0 %s | FileCheck %s --implicit-check-not="call void @llvm.lifetime" -check-prefix=O0 +// RUN: %clang -S -emit-llvm -o - -O1 %s | FileCheck %s --implicit-check-not="call void @llvm.lifetime" -check-prefix=O1 +// RUN: %clang -S -emit-llvm -o - -O2 %s | FileCheck %s --implicit-check-not="call void @llvm.lifetime" -check-prefix=O2 +// RUN: %clang -S -emit-llvm -o - -O3 %s | FileCheck %s --implicit-check-not="call void @llvm.lifetime" -check-prefix=O3 extern void use(char *a); __attribute__((always_inline)) void helper_no_markers(void) { char a; + // O1: call void @llvm.lifetime.start.p0(i64 1, + // O2: call void @llvm.lifetime.start.p0(i64 1, + // O3: call void @llvm.lifetime.start.p0(i64 1, use(&a); + // O1: call void @llvm.lifetime.end.p0(i64 1, + // O2: call void @llvm.lifetime.end.p0(i64 1, + // O3: call void @llvm.lifetime.end.p0(i64 1, } void lifetime_test(void) { @@ -15,9 +21,11 @@ // O1: lifetime_test // O2: lifetime_test // O3: lifetime_test -// O0-NOT: @llvm.lifetime.start -// O1: @llvm.lifetime.start -// O2: @llvm.lifetime.start -// O3: @llvm.lifetime.start +// O1: call void @llvm.lifetime.start.p0(i64 1, +// O2: call void @llvm.lifetime.start.p0(i64 1, +// O3: call void @llvm.lifetime.start.p0(i64 1, helper_no_markers(); +// O1: call void @llvm.lifetime.end.p0(i64 1, +// O2: call void @llvm.lifetime.end.p0(i64 1, +// O3: call void @llvm.lifetime.end.p0(i64 1, } diff --git a/clang/test/CodeGen/lifetime2.c b/clang/test/CodeGen/lifetime2.c --- a/clang/test/CodeGen/lifetime2.c +++ b/clang/test/CodeGen/lifetime2.c @@ -1,27 +1,27 @@ -// RUN: %clang_cc1 -no-opaque-pointers -S -emit-llvm -o - -O2 -disable-llvm-passes %s | FileCheck %s -check-prefixes=CHECK,O2 -// RUN: %clang_cc1 -no-opaque-pointers -S -emit-llvm -o - -O2 -disable-lifetime-markers %s \ -// RUN: | FileCheck %s -check-prefixes=CHECK,O0 -// RUN: %clang_cc1 -no-opaque-pointers -S -emit-llvm -o - -O0 %s | FileCheck %s -check-prefixes=CHECK,O0 +// RUN: %clang_cc1 -no-opaque-pointers -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 -no-opaque-pointers -S -emit-llvm -o - -O2 -disable-lifetime-markers %s | FileCheck %s --implicit-check-not="call void @llvm.lifetime" --check-prefixes=CHECK +// RUN: %clang_cc1 -no-opaque-pointers -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 -// O0-NOT: @llvm.lifetime.start int foo (int n) { if (n) { -// O2: @llvm.lifetime.start +// O2: call void @llvm.lifetime.start.p0i8(i64 100, char A[100]; return bar(A, 1); +// O2: call void @llvm.lifetime.end.p0i8(i64 100, } else { -// O2: @llvm.lifetime.start +// O2: call void @llvm.lifetime.start.p0i8(i64 100, char A[100]; return bar(A, 2); +// O2: call void @llvm.lifetime.end.p0i8(i64 100, } } // CHECK-LABEL: @no_goto_bypass void no_goto_bypass(void) { - // O2: @llvm.lifetime.start.p0i8(i64 1 + // O2: call void @llvm.lifetime.start.p0i8(i64 1, char x; l1: bar(&x, 1); @@ -29,14 +29,11 @@ bar(y, 5); goto l1; // Infinite loop - // O2-NOT: @llvm.lifetime.end.p0i8( } // CHECK-LABEL: @goto_bypass void goto_bypass(void) { { - // O2-NOT: @llvm.lifetime.start.p0i8(i64 1 - // O2-NOT: @llvm.lifetime.end.p0i8(i64 1 char x; l1: bar(&x, 1); @@ -48,16 +45,16 @@ void no_switch_bypass(int n) { switch (n) { case 1: { - // O2: @llvm.lifetime.start.p0i8(i64 1 - // O2: @llvm.lifetime.end.p0i8(i64 1 + // O2: call void @llvm.lifetime.start.p0i8(i64 1, + // O2: call void @llvm.lifetime.end.p0i8(i64 1, char x; bar(&x, 1); break; } case 2: n = n; - // O2: @llvm.lifetime.start.p0i8(i64 5 - // O2: @llvm.lifetime.end.p0i8(i64 5 + // O2: call void @llvm.lifetime.start.p0i8(i64 5, + // O2: call void @llvm.lifetime.end.p0i8(i64 5, char y[5]; bar(y, 5); break; @@ -69,8 +66,6 @@ switch (n) { case 1: n = n; - // O2-NOT: @llvm.lifetime.start.p0i8(i64 1 - // O2-NOT: @llvm.lifetime.end.p0i8(i64 1 char x; bar(&x, 1); break; @@ -83,23 +78,18 @@ // CHECK-LABEL: @indirect_jump void indirect_jump(int n) { char x; - // O2-NOT: @llvm.lifetime void *T[] = {&&L}; goto *T[n]; L: bar(&x, 1); } -// O2-LABEL: @jump_backward_over_declaration( -// O2: %[[p:.*]] = alloca i32* -// O2: %[[v0:.*]] = bitcast i32** %[[p]] to i8* -// O2: call void @llvm.lifetime.start.p0i8(i64 {{.*}}, i8* %[[v0]]) -// O2-NOT: call void @llvm.lifetime.start.p0i8( - 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.p0i8(i64 8, label1: if (p) { foo2(*p); @@ -112,4 +102,5 @@ goto label1; } return -1; +// O2: call void @llvm.lifetime.end.p0i8(i64 8, }