116 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
| // 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;
 | |
| }
 |