Clang Project

clang_source_code/test/CodeGen/pragma-do-while.cpp
1// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s
2
3// We expect to get a loop structure like this:
4//    do.body:                                       ; preds = %do.cond, ...
5//      ...
6//      br label %do.cond
7//    do.cond:                                       ; preds = %do.body
8//      ...
9//      br i1 %cmp, label %do.body, label %do.end
10//    do.end:                                        ; preds = %do.cond
11//      ...
12//
13// Verify that the loop metadata only is put on the backedge.
14//
15// CHECK-NOT: llvm.loop
16// CHECK-LABEL: do.cond:
17// CHECK: br {{.*}}, label %do.body, label %do.end, !llvm.loop ![[LMD1:[0-9]+]]
18// CHECK-LABEL: do.end:
19// CHECK-NOT: llvm.loop
20// CHECK: ![[LMD1]] = distinct !{![[LMD1]], ![[LMD2:[0-9]+]]}
21// CHECK: ![[LMD2]] = !{!"llvm.loop.unroll.count", i32 4}
22
23int test(int a[], int n) {
24  int i = 0;
25  int sum = 0;
26
27#pragma unroll 4
28  do
29  {
30    a[i] = a[i] + 1;
31    sum = sum + a[i];
32    i++;
33  } while (i < n);
34
35  return sum;
36}
37