xref: /aosp_15_r20/external/clang/test/CodeGenCXX/pragma-loop-safety.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm -o - %s | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li // Verify assume_safety vectorization is recognized.
vectorize_test(int * List,int Length)4*67e74705SXin Li void vectorize_test(int *List, int Length) {
5*67e74705SXin Li // CHECK: define {{.*}} @_Z14vectorize_test
6*67e74705SXin Li // CHECK: [[LOAD1_IV:.+]] = load i32, i32* [[IV1:[^,]+]], {{.*}}!llvm.mem.parallel_loop_access ![[LOOP1_ID:[0-9]+]]
7*67e74705SXin Li // CHECK-NEXT: [[LOAD1_LEN:.+]] = load i32, i32* [[LEN1:.+]], {{.*}}!llvm.mem.parallel_loop_access ![[LOOP1_ID]]
8*67e74705SXin Li // CHECK-NEXT: [[CMP1:.+]] = icmp slt i32[[LOAD1_IV]],[[LOAD1_LEN]]
9*67e74705SXin Li // CHECK-NEXT: br i1[[CMP1]], label %[[LOOP1_BODY:[^,]+]], label %[[LOOP1_END:[^,]+]]
10*67e74705SXin Li #pragma clang loop vectorize(assume_safety) interleave(disable) unroll(disable)
11*67e74705SXin Li   for (int i = 0; i < Length; i++) {
12*67e74705SXin Li     // CHECK: [[RHIV1:.+]] = load i32, i32* [[IV1]], {{.*}}!llvm.mem.parallel_loop_access ![[LOOP1_ID]]
13*67e74705SXin Li     // CHECK-NEXT: [[CALC1:.+]] = mul nsw i32[[RHIV1]], 2
14*67e74705SXin Li     // CHECK-NEXT: [[SIV1:.+]] = load i32, i32* [[IV1]]{{.*}}!llvm.mem.parallel_loop_access ![[LOOP1_ID]]
15*67e74705SXin Li     // CHECK-NEXT: [[INDEX1:.+]] = sext i32[[SIV1]] to i64
16*67e74705SXin Li     // CHECK-NEXT: [[ARRAY1:.+]] = load i32*, i32** [[LIST1:.*]], {{.*}}!llvm.mem.parallel_loop_access ![[LOOP1_ID]]
17*67e74705SXin Li     // CHECK-NEXT: [[PTR1:.+]] = getelementptr inbounds i32, i32*[[ARRAY1]], i64[[INDEX1]]
18*67e74705SXin Li     // CHECK-NEXT: store i32[[CALC1]], i32*[[PTR1]], {{.*}}!llvm.mem.parallel_loop_access ![[LOOP1_ID]]
19*67e74705SXin Li     // CHECK-NEXT: br label [[LOOP1_INC:[^,]+]]
20*67e74705SXin Li     List[i] = i * 2;
21*67e74705SXin Li 
22*67e74705SXin Li     // CHECK: br label [[LOOP1_COND:[^,]+]], !llvm.loop ![[LOOP1_HINTS:[0-9]+]]
23*67e74705SXin Li   }
24*67e74705SXin Li }
25*67e74705SXin Li 
26*67e74705SXin Li // Verify assume_safety interleaving is recognized.
interleave_test(int * List,int Length)27*67e74705SXin Li void interleave_test(int *List, int Length) {
28*67e74705SXin Li // CHECK: define {{.*}} @_Z15interleave_test
29*67e74705SXin Li // CHECK: [[LOAD2_IV:.+]] = load i32, i32* [[IV2:[^,]+]], {{.*}}!llvm.mem.parallel_loop_access ![[LOOP2_ID:[0-9]+]]
30*67e74705SXin Li // CHECK-NEXT: [[LOAD2_LEN:.+]] = load i32, i32* [[LEN2:.+]], {{.*}}!llvm.mem.parallel_loop_access ![[LOOP2_ID]]
31*67e74705SXin Li // CHECK-NEXT: [[CMP2:.+]] = icmp slt i32[[LOAD2_IV]],[[LOAD2_LEN]]
32*67e74705SXin Li // CHECK-NEXT: br i1[[CMP2]], label %[[LOOP2_BODY:[^,]+]], label %[[LOOP2_END:[^,]+]]
33*67e74705SXin Li #pragma clang loop interleave(assume_safety) vectorize(disable) unroll(disable)
34*67e74705SXin Li   for (int i = 0; i < Length; i++) {
35*67e74705SXin Li     // CHECK: [[RHIV2:.+]] = load i32, i32* [[IV2]], {{.*}}!llvm.mem.parallel_loop_access ![[LOOP2_ID]]
36*67e74705SXin Li     // CHECK-NEXT: [[CALC2:.+]] = mul nsw i32[[RHIV2]], 2
37*67e74705SXin Li     // CHECK-NEXT: [[SIV2:.+]] = load i32, i32* [[IV2]]{{.*}}!llvm.mem.parallel_loop_access ![[LOOP2_ID]]
38*67e74705SXin Li     // CHECK-NEXT: [[INDEX2:.+]] = sext i32[[SIV2]] to i64
39*67e74705SXin Li     // CHECK-NEXT: [[ARRAY2:.+]] = load i32*, i32** [[LIST2:.*]], {{.*}}!llvm.mem.parallel_loop_access ![[LOOP2_ID]]
40*67e74705SXin Li     // CHECK-NEXT: [[PTR2:.+]] = getelementptr inbounds i32, i32*[[ARRAY2]], i64[[INDEX2]]
41*67e74705SXin Li     // CHECK-NEXT: store i32[[CALC2]], i32*[[PTR2]], {{.*}}!llvm.mem.parallel_loop_access ![[LOOP2_ID]]
42*67e74705SXin Li     // CHECK-NEXT: br label [[LOOP2_INC:[^,]+]]
43*67e74705SXin Li     List[i] = i * 2;
44*67e74705SXin Li 
45*67e74705SXin Li     // CHECK: br label [[LOOP2_COND:[^,]+]], !llvm.loop ![[LOOP2_HINTS:[0-9]+]]
46*67e74705SXin Li   }
47*67e74705SXin Li }
48*67e74705SXin Li 
49*67e74705SXin Li // CHECK: ![[LOOP1_HINTS]] = distinct !{![[LOOP1_HINTS]], ![[INTERLEAVE_1:[0-9]+]], ![[INTENABLE_1:[0-9]+]], ![[UNROLL_DISABLE:[0-9]+]]}
50*67e74705SXin Li // CHECK: ![[INTERLEAVE_1]] = !{!"llvm.loop.interleave.count", i32 1}
51*67e74705SXin Li // CHCCK: ![[INTENABLE_1]] = !{!"llvm.loop.vectorize.enable", i1 true}
52*67e74705SXin Li // CHECK: ![[UNROLL_DISABLE]] = !{!"llvm.loop.unroll.disable"}
53*67e74705SXin Li // CHECK: ![[LOOP2_HINTS]] = distinct !{![[LOOP2_HINTS]], ![[WIDTH_1:[0-9]+]], ![[INTENABLE_1]], ![[UNROLL_DISABLE]]}
54*67e74705SXin Li // CHECK: ![[WIDTH_1]] = !{!"llvm.loop.vectorize.width", i32 1}
55