xref: /llvm-project/llvm/test/CodeGen/AArch64/arm64-prefetch-new.ll (revision 82b51a14280414a53413ed62c001d2c589c649c3)
1; RUN: llc -mtriple=aarch64 -mattr=+v8.9a --global-isel=0 < %s | FileCheck %s
2; RUN: llc -mtriple=aarch64 -mattr=+v8.9a --global-isel=1 --global-isel-abort=1 < %s | FileCheck %s
3
4@a = internal global ptr null, align 8
5@b = external global ptr, align 8
6
7define void @test(ptr %i, i32 %j) nounwind ssp {
8entry:
9  ; CHECK-LABEL: @test
10  %j.addr = alloca i32, align 4
11  store i32 %j, ptr %j.addr, align 4, !tbaa !0
12  %tmp = bitcast ptr %j.addr to ptr
13
14  %i.next = getelementptr i8, ptr %i, i64 2
15
16  ; Verify prefetching works for all the different kinds of pointers we might
17  ; want to prefetch.
18
19  ; CHECK: prfm pldl1keep,
20  call void @llvm.aarch64.prefetch(ptr null, i32 0, i32 0, i32 0, i32 1)
21
22  ; CHECK: prfum pldl1keep,
23  call void @llvm.aarch64.prefetch(ptr %tmp, i32 0, i32 0, i32 0, i32 1)
24
25  ; CHECK: prfm pldl1keep,
26  call void @llvm.aarch64.prefetch(ptr %i, i32 0, i32 0, i32 0, i32 1)
27
28  ; CHECK: prfum pldl1keep,
29  call void @llvm.aarch64.prefetch(ptr %i.next, i32 0, i32 0, i32 0, i32 1)
30
31  ; CHECK: prfm pldl1keep,
32  call void @llvm.aarch64.prefetch(ptr @a, i32 0, i32 0, i32 0, i32 1)
33
34  ; CHECK: prfm pldl1keep,
35  call void @llvm.aarch64.prefetch(ptr @b, i32 0, i32 0, i32 0, i32 1)
36
37  ; Verify that we can generate every single valid prefetch value.
38
39  ; CHECK: prfm pstl1keep,
40  call void @llvm.aarch64.prefetch(ptr null, i32 1, i32 0, i32 0, i32 1)
41
42  ; CHECK: prfm pldl2keep,
43  call void @llvm.aarch64.prefetch(ptr null, i32 0, i32 1, i32 0, i32 1)
44
45  ; CHECK: prfm pldl3keep,
46  call void @llvm.aarch64.prefetch(ptr null, i32 0, i32 2, i32 0, i32 1)
47
48  ; CHECK: prfm pldslckeep,
49  call void @llvm.aarch64.prefetch(ptr null, i32 0, i32 3, i32 0, i32 1)
50
51  ; CHECK: prfm pldl1strm,
52  call void @llvm.aarch64.prefetch(ptr null, i32 0, i32 0, i32 1, i32 1)
53
54  ; CHECK: prfm plil1keep,
55  call void @llvm.aarch64.prefetch(ptr null, i32 0, i32 0, i32 0, i32 0)
56
57  ret void
58}
59
60declare void @llvm.aarch64.prefetch(ptr readonly, i32 immarg, i32 immarg, i32 immarg, i32 immarg) #0
61
62attributes #0 = { inaccessiblemem_or_argmemonly nounwind willreturn }
63
64!0 = !{!"int", !1}
65!1 = !{!"omnipotent char", !2}
66!2 = !{!"Simple C/C++ TBAA"}
67!3 = !{!"any pointer", !1}
68