| // RUN: %clang_cc1 -S -emit-llvm -o - -O2 -disable-llvm-passes %s | FileCheck %s -check-prefixes=CHECK,O2 |
| // RUN: %clang_cc1 -S -emit-llvm -o - -O2 -disable-lifetime-markers %s \ |
| // RUN: | FileCheck %s -check-prefixes=CHECK,O0 |
| // RUN: %clang_cc1 -S -emit-llvm -o - -O0 %s | FileCheck %s -check-prefixes=CHECK,O0 |
| |
| 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 |
| char A[100]; |
| return bar(A, 1); |
| } else { |
| // O2: @llvm.lifetime.start |
| char A[100]; |
| return bar(A, 2); |
| } |
| } |
| |
| // CHECK-LABEL: @no_goto_bypass |
| void no_goto_bypass() { |
| // O2: @llvm.lifetime.start.p0i8(i64 1 |
| char x; |
| l1: |
| bar(&x, 1); |
| char y[5]; |
| bar(y, 5); |
| goto l1; |
| // Infinite loop |
| // O2-NOT: @llvm.lifetime.end.p0i8( |
| } |
| |
| // CHECK-LABEL: @goto_bypass |
| void goto_bypass() { |
| { |
| // O2-NOT: @llvm.lifetime.start.p0i8(i64 1 |
| // O2-NOT: @llvm.lifetime.end.p0i8(i64 1 |
| char x; |
| l1: |
| bar(&x, 1); |
| } |
| goto l1; |
| } |
| |
| // CHECK-LABEL: @no_switch_bypass |
| void no_switch_bypass(int n) { |
| switch (n) { |
| case 1: { |
| // O2: @llvm.lifetime.start.p0i8(i64 1 |
| // O2: @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 |
| char y[5]; |
| bar(y, 5); |
| break; |
| } |
| } |
| |
| // CHECK-LABEL: @switch_bypass |
| void switch_bypass(int n) { |
| 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; |
| case 2: |
| bar(&x, 1); |
| break; |
| } |
| } |
| |
| // 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); |
| |
| int jump_backward_over_declaration(int a) { |
| int *p = 0; |
| label1: |
| if (p) { |
| foo2(*p); |
| return 0; |
| } |
| |
| int i = 999; |
| if (a != 2) { |
| p = &i; |
| goto label1; |
| } |
| return -1; |
| } |