38 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
// This tests loop unrolling and loop deletion (enabled under -O1)
 | 
						|
// RUN: %clang_cc1 -std=c11 -O1 -fno-unroll-loops -S -o - %s -emit-llvm | FileCheck %s
 | 
						|
// RUN: %clang_cc1 -std=c99 -O1 -fno-unroll-loops -S -o - %s -emit-llvm | FileCheck %s --check-prefix C99
 | 
						|
 | 
						|
extern int a[16];
 | 
						|
int b = 0;
 | 
						|
int foo(void) {
 | 
						|
#pragma unroll
 | 
						|
  for (int i = 0; i < 16; ++i)
 | 
						|
    a[i] = b += 2;
 | 
						|
  return b;
 | 
						|
}
 | 
						|
// Check br i1 to make sure that the loop is fully unrolled
 | 
						|
// CHECK-LABEL: foo
 | 
						|
// CHECK-NOT: br i1
 | 
						|
 | 
						|
void Helper() {
 | 
						|
  const int *nodes[5];
 | 
						|
  int num_active = 5;
 | 
						|
 | 
						|
  while (num_active)
 | 
						|
#pragma clang loop unroll(full)
 | 
						|
    for (int i = 0; i < 5; ++i)
 | 
						|
      if (nodes[i])
 | 
						|
        --num_active;
 | 
						|
}
 | 
						|
 | 
						|
// Check br i1 to make sure the loop is gone, there will still be a label branch for the infinite loop.
 | 
						|
// In C99, there was no forward progress requirement, so we expect the infinite loop to still exist,
 | 
						|
// but for C11 and onwards, the infinite loop can be deleted.
 | 
						|
// CHECK-LABEL: Helper
 | 
						|
// C99: br label
 | 
						|
// C99-NOT: br i1
 | 
						|
// C99: br label
 | 
						|
// CHECK: entry:
 | 
						|
// CHECK-NOT: br i1
 | 
						|
// CHECK-NEXT: ret void
 |