diff --git a/clang/test/CodeGen/lifetime3.cpp b/clang/test/CodeGen/lifetime3.cpp new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/lifetime3.cpp @@ -0,0 +1,43 @@ +// 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: @no_switch_bypass +extern "C" void no_switch_bypass(int n) { + // O2: call void @llvm.lifetime.start.p0(i64 4, + switch (n += 1; int b=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; + } + // O2: call void @llvm.lifetime.end.p0(i64 4, +} + +// CHECK-LABEL: @switch_bypass +extern "C" void switch_bypass(int n) { + // O2: call void @llvm.lifetime.start.p0(i64 4, + // O2: call void @llvm.lifetime.end.p0(i64 4, + switch (n += 1; int b=n) { + case 1: + n = n; + char x; + bar(&x, 1); + break; + case 2: + bar(&x, 1); + break; + } +}