1 // RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm -o - %s | FileCheck %s 2 3 // Verify while loop is recognized after unroll pragma. 4 void while_test(int *List, int Length) { 5 // CHECK: define {{.*}} @_Z10while_test 6 int i = 0; 7 8 #pragma unroll 9 while (i < Length) { 10 // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_1:.*]] 11 List[i] = i * 2; 12 i++; 13 } 14 } 15 16 // Verify do loop is recognized after multi-option pragma clang loop directive. 17 void do_test(int *List, int Length) { 18 int i = 0; 19 20 #pragma nounroll 21 do { 22 // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_2:.*]] 23 List[i] = i * 2; 24 i++; 25 } while (i < Length); 26 } 27 28 // Verify for loop is recognized after unroll pragma. 29 void for_test(int *List, int Length) { 30 #pragma unroll 8 31 for (int i = 0; i < Length; i++) { 32 // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_3:.*]] 33 List[i] = i * 2; 34 } 35 } 36 37 // Verify c++11 for range loop is recognized after unroll pragma. 38 void for_range_test() { 39 double List[100]; 40 41 #pragma unroll(4) 42 for (int i : List) { 43 // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_4:.*]] 44 List[i] = i; 45 } 46 } 47 48 #define UNROLLCOUNT 8 49 50 // Verify defines are correctly resolved in unroll pragmas. 51 void for_define_test(int *List, int Length, int Value) { 52 #pragma unroll(UNROLLCOUNT) 53 for (int i = 0; i < Length; i++) { 54 // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_5:.*]] 55 List[i] = i * Value; 56 } 57 } 58 59 // Verify metadata is generated when template is used. 60 template <typename A> 61 void for_template_test(A *List, int Length, A Value) { 62 #pragma unroll 8 63 for (int i = 0; i < Length; i++) { 64 // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_6:.*]] 65 List[i] = i * Value; 66 } 67 } 68 69 // Verify define is resolved correctly when template is used. 70 template <typename A> 71 void for_template_define_test(A *List, int Length, A Value) { 72 #pragma unroll(UNROLLCOUNT) 73 for (int i = 0; i < Length; i++) { 74 // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_7:.*]] 75 List[i] = i * Value; 76 } 77 } 78 79 #undef UNROLLCOUNT 80 81 // Use templates defined above. Test verifies metadata is generated correctly. 82 void template_test(double *List, int Length) { 83 double Value = 10; 84 85 for_template_test<double>(List, Length, Value); 86 for_template_define_test<double>(List, Length, Value); 87 } 88 89 // CHECK: ![[LOOP_1]] = distinct !{![[LOOP_1]], ![[UNROLL_FULL:.*]]} 90 // CHECK: ![[UNROLL_FULL]] = !{!"llvm.loop.unroll.full"} 91 // CHECK: ![[LOOP_2]] = distinct !{![[LOOP_2:.*]], ![[UNROLL_DISABLE:.*]]} 92 // CHECK: ![[UNROLL_DISABLE]] = !{!"llvm.loop.unroll.disable"} 93 // CHECK: ![[LOOP_3]] = distinct !{![[LOOP_3]], ![[UNROLL_8:.*]]} 94 // CHECK: ![[UNROLL_8]] = !{!"llvm.loop.unroll.count", i32 8} 95 // CHECK: ![[LOOP_4]] = distinct !{![[LOOP_4]], ![[UNROLL_4:.*]]} 96 // CHECK: ![[UNROLL_4]] = !{!"llvm.loop.unroll.count", i32 4} 97 // CHECK: ![[LOOP_5]] = distinct !{![[LOOP_5]], ![[UNROLL_8:.*]]} 98 // CHECK: ![[LOOP_6]] = distinct !{![[LOOP_6]], ![[UNROLL_8:.*]]} 99 // CHECK: ![[LOOP_7]] = distinct !{![[LOOP_7]], ![[UNROLL_8:.*]]} 100