1338be9c5SFlorian Hahn // RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm -o - %s -O0 -disable-llvm-optzns -fno-unroll-loops | FileCheck --check-prefix=NO_UNROLL_MD %s
2338be9c5SFlorian Hahn // RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm -o - %s -O1 -disable-llvm-optzns -fno-unroll-loops | FileCheck --check-prefix=UNROLL_DISABLED_MD %s
3338be9c5SFlorian Hahn // RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm -o - %s -O2 -disable-llvm-optzns -fno-unroll-loops | FileCheck --check-prefix=UNROLL_DISABLED_MD %s
4338be9c5SFlorian Hahn // RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm -o - %s -O3 -disable-llvm-optzns -fno-unroll-loops | FileCheck --check-prefix=UNROLL_DISABLED_MD %s
5338be9c5SFlorian Hahn // RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm -o - %s -O3 -disable-llvm-optzns | FileCheck --check-prefix=NO_UNROLL_MD %s
6338be9c5SFlorian Hahn
7*ac73b73cSAtmn Patel // NO_UNROLL_MD-NOT: llvm.loop.unroll.disable
8338be9c5SFlorian Hahn
9338be9c5SFlorian Hahn // Verify unroll.disable metadata is added to while loop with -fno-unroll-loops
10338be9c5SFlorian Hahn // and optlevel > 0.
while_test(int * List,int Length)11338be9c5SFlorian Hahn void while_test(int *List, int Length) {
12338be9c5SFlorian Hahn // UNROLL_DISABLED_MD: define {{.*}} @_Z10while_test
13338be9c5SFlorian Hahn int i = 0;
14338be9c5SFlorian Hahn
15338be9c5SFlorian Hahn while (i < Length) {
16*ac73b73cSAtmn Patel // UNROLL_DISABLED_MD: br label {{.*}}, !llvm.loop [[LOOP_1:![0-9]+]]
17338be9c5SFlorian Hahn List[i] = i * 2;
18338be9c5SFlorian Hahn i++;
19338be9c5SFlorian Hahn }
20338be9c5SFlorian Hahn }
21338be9c5SFlorian Hahn
22338be9c5SFlorian Hahn // Verify unroll.disable metadata is added to do-while loop with
23338be9c5SFlorian Hahn // -fno-unroll-loops and optlevel > 0.
do_test(int * List,int Length)24338be9c5SFlorian Hahn void do_test(int *List, int Length) {
25338be9c5SFlorian Hahn // UNROLL_DISABLED_MD: define {{.*}} @_Z7do_test
26338be9c5SFlorian Hahn int i = 0;
27338be9c5SFlorian Hahn
28338be9c5SFlorian Hahn do {
29*ac73b73cSAtmn Patel // UNROLL_DISABLED_MD: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop [[LOOP_2:![0-9]+]]
30338be9c5SFlorian Hahn List[i] = i * 2;
31338be9c5SFlorian Hahn i++;
32338be9c5SFlorian Hahn } while (i < Length);
33338be9c5SFlorian Hahn }
34338be9c5SFlorian Hahn
35338be9c5SFlorian Hahn // Verify unroll.disable metadata is added to while loop with -fno-unroll-loops
36338be9c5SFlorian Hahn // and optlevel > 0.
for_test(int * List,int Length)37338be9c5SFlorian Hahn void for_test(int *List, int Length) {
38338be9c5SFlorian Hahn // UNROLL_DISABLED_MD: define {{.*}} @_Z8for_test
39338be9c5SFlorian Hahn for (int i = 0; i < Length; i++) {
40*ac73b73cSAtmn Patel // UNROLL_DISABLED_MD: br label {{.*}}, !llvm.loop [[LOOP_3:![0-9]+]]
41338be9c5SFlorian Hahn List[i] = i * 2;
42338be9c5SFlorian Hahn }
43338be9c5SFlorian Hahn }
44338be9c5SFlorian Hahn
45*ac73b73cSAtmn Patel // UNROLL_DISABLED_MD: [[LOOP_1]] = distinct !{[[LOOP_1]], [[MP:![0-9]+]], [[UNROLL_DISABLE:![0-9]+]]}
46*ac73b73cSAtmn Patel // UNROLL_DISABLED_MD: [[MP]] = !{!"llvm.loop.mustprogress"}
47*ac73b73cSAtmn Patel // UNROLL_DISABLED_MD: [[UNROLL_DISABLE]] = !{!"llvm.loop.unroll.disable"}
48*ac73b73cSAtmn Patel // UNROLL_DISABLED_MD: [[LOOP_2]] = distinct !{[[LOOP_2]], [[MP]], [[UNROLL_DISABLE]]}
49*ac73b73cSAtmn Patel // UNROLL_DISABLED_MD: [[LOOP_3]] = distinct !{[[LOOP_3]], [[MP]], [[UNROLL_DISABLE]]}
50