148ff3541Ssmanna12 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -x c %s %s -o - | FileCheck -check-prefix=CHECK-C %s
2*7c1d9b15SFangrui Song // RUN: %clang_cc1 -emit-llvm -x c++ -std=c++11 %s -o - | FileCheck %s --check-prefixes CHECK-C,CHECK-CPP
348ff3541Ssmanna12
448ff3541Ssmanna12 // CHECK-C: br label %for.cond, !llvm.loop ![[MD_FP:[0-9]+]]
548ff3541Ssmanna12 // CHECK-C: br label %while.cond, !llvm.loop ![[MD_FP_1:[0-9]+]]
648ff3541Ssmanna12 // CHECK-C: br i1 %cmp3, label %do.body, label %do.end, !llvm.loop ![[MD_FP_2:[0-9]+]]
748ff3541Ssmanna12 // CHECK-C: br label %for.cond5, !llvm.loop ![[MD_FP_3:[0-9]+]]
848ff3541Ssmanna12
948ff3541Ssmanna12 // CHECK-CPP: br label %for.cond, !llvm.loop ![[MD_FP_4:[0-9]+]]
1048ff3541Ssmanna12 // CHECK-CPP: br label %for.cond2, !llvm.loop ![[MD_FP_5:[0-9]+]]
1148ff3541Ssmanna12
1248ff3541Ssmanna12 void bar(int);
code_align()1348ff3541Ssmanna12 void code_align() {
1448ff3541Ssmanna12 int a[10];
1548ff3541Ssmanna12 // CHECK-C: ![[MD_FP]] = distinct !{![[MD_FP]], ![[MP:[0-9]+]], ![[MD_code_align:[0-9]+]]}
1648ff3541Ssmanna12 // CHECK-C-NEXT: ![[MP]] = !{!"llvm.loop.mustprogress"}
1748ff3541Ssmanna12 // CHECK-C-NEXT: ![[MD_code_align]] = !{!"llvm.loop.align", i32 4}
1848ff3541Ssmanna12 [[clang::code_align(4)]]
1948ff3541Ssmanna12 for(int I=0; I<128; ++I) { bar(I); }
2048ff3541Ssmanna12
2148ff3541Ssmanna12 // CHECK-C: ![[MD_FP_1]] = distinct !{![[MD_FP_1]], ![[MP]], ![[MD_code_align_1:[0-9]+]]}
2248ff3541Ssmanna12 // CHECK-C-NEXT: ![[MD_code_align_1]] = !{!"llvm.loop.align", i32 16}
2348ff3541Ssmanna12 int i = 0;
2448ff3541Ssmanna12 [[clang::code_align(16)]] while (i < 60) {
2548ff3541Ssmanna12 a[i] += 3;
2648ff3541Ssmanna12 }
2748ff3541Ssmanna12
2848ff3541Ssmanna12 // CHECK-C: ![[MD_FP_2]] = distinct !{![[MD_FP_2]], ![[MP]], ![[MD_code_align_2:[0-9]+]]}
2948ff3541Ssmanna12 // CHECK-C-NEXT: ![[MD_code_align_2]] = !{!"llvm.loop.align", i32 8}
3048ff3541Ssmanna12 int b = 10;
3148ff3541Ssmanna12 [[clang::code_align(8)]] do {
3248ff3541Ssmanna12 b = b + 1;
3348ff3541Ssmanna12 } while (b < 20);
3448ff3541Ssmanna12
3548ff3541Ssmanna12 // CHECK-C: ![[MD_FP_3]] = distinct !{![[MD_FP_3]], ![[MP]], ![[MD_code_align_3:[0-9]+]]}
3648ff3541Ssmanna12 // CHECK-C-NEXT: ![[MD_code_align_3]] = !{!"llvm.loop.align", i32 64}
3748ff3541Ssmanna12 [[clang::code_align(64)]]
3848ff3541Ssmanna12 for(int I=0; I<128; ++I) { bar(I); }
3948ff3541Ssmanna12 }
4048ff3541Ssmanna12
4148ff3541Ssmanna12 #if __cplusplus >= 201103L
4248ff3541Ssmanna12 template <int A, int B>
code_align_cpp()4348ff3541Ssmanna12 void code_align_cpp() {
4448ff3541Ssmanna12 int a[10];
4548ff3541Ssmanna12 // CHECK-CPP: ![[MD_FP_4]] = distinct !{![[MD_FP_4]], ![[MP]], ![[MD_code_align_4:[0-9]+]]}
4648ff3541Ssmanna12 // CHECK-CPP-NEXT: ![[MD_code_align_4]] = !{!"llvm.loop.align", i32 32}
4748ff3541Ssmanna12 [[clang::code_align(A)]] for (int i = 0; i != 10; ++i)
4848ff3541Ssmanna12 a[i] = 0;
4948ff3541Ssmanna12
5048ff3541Ssmanna12 // CHECK-CPP: ![[MD_FP_5]] = distinct !{![[MD_FP_5]], ![[MD_code_align]]}
5148ff3541Ssmanna12 int c[] = {0, 1, 2, 3, 4, 5};
5248ff3541Ssmanna12 [[clang::code_align(B)]] for (int n : c) { n *= 2; }
5348ff3541Ssmanna12 }
5448ff3541Ssmanna12
main()5548ff3541Ssmanna12 int main() {
5648ff3541Ssmanna12 code_align_cpp<32, 4>();
5748ff3541Ssmanna12 return 0;
5848ff3541Ssmanna12 }
5948ff3541Ssmanna12 #endif
60