1 ; RUN: llc %s -march arm64 -o - | FileCheck %s
3 @a = common global i32* null, align 8
5 define void @test(i32 %i, i32 %j) nounwind ssp {
8 %j.addr = alloca i32, align 4
9 store i32 %j, i32* %j.addr, align 4, !tbaa !0
10 %tmp = bitcast i32* %j.addr to i8*
11 ; CHECK: prfum pldl1strm
12 call void @llvm.prefetch(i8* %tmp, i32 0, i32 0, i32 1)
13 ; CHECK: prfum pldl3keep
14 call void @llvm.prefetch(i8* %tmp, i32 0, i32 1, i32 1)
15 ; CHECK: prfum pldl2keep
16 call void @llvm.prefetch(i8* %tmp, i32 0, i32 2, i32 1)
17 ; CHECK: prfum pldl1keep
18 call void @llvm.prefetch(i8* %tmp, i32 0, i32 3, i32 1)
20 ; CHECK: prfum pstl1strm
21 call void @llvm.prefetch(i8* %tmp, i32 1, i32 0, i32 1)
22 ; CHECK: prfum pstl3keep
23 call void @llvm.prefetch(i8* %tmp, i32 1, i32 1, i32 1)
24 ; CHECK: prfum pstl2keep
25 call void @llvm.prefetch(i8* %tmp, i32 1, i32 2, i32 1)
26 ; CHECK: prfum pstl1keep
27 call void @llvm.prefetch(i8* %tmp, i32 1, i32 3, i32 1)
29 %tmp1 = load i32* %j.addr, align 4, !tbaa !0
30 %add = add nsw i32 %tmp1, %i
31 %idxprom = sext i32 %add to i64
32 %tmp2 = load i32** @a, align 8, !tbaa !3
33 %arrayidx = getelementptr inbounds i32* %tmp2, i64 %idxprom
34 %tmp3 = bitcast i32* %arrayidx to i8*
36 ; CHECK: prfm pldl1strm
37 call void @llvm.prefetch(i8* %tmp3, i32 0, i32 0, i32 1)
38 %tmp4 = load i32** @a, align 8, !tbaa !3
39 %arrayidx3 = getelementptr inbounds i32* %tmp4, i64 %idxprom
40 %tmp5 = bitcast i32* %arrayidx3 to i8*
42 ; CHECK: prfm pldl3keep
43 call void @llvm.prefetch(i8* %tmp5, i32 0, i32 1, i32 1)
44 %tmp6 = load i32** @a, align 8, !tbaa !3
45 %arrayidx6 = getelementptr inbounds i32* %tmp6, i64 %idxprom
46 %tmp7 = bitcast i32* %arrayidx6 to i8*
48 ; CHECK: prfm pldl2keep
49 call void @llvm.prefetch(i8* %tmp7, i32 0, i32 2, i32 1)
50 %tmp8 = load i32** @a, align 8, !tbaa !3
51 %arrayidx9 = getelementptr inbounds i32* %tmp8, i64 %idxprom
52 %tmp9 = bitcast i32* %arrayidx9 to i8*
54 ; CHECK: prfm pldl1keep
55 call void @llvm.prefetch(i8* %tmp9, i32 0, i32 3, i32 1)
56 %tmp10 = load i32** @a, align 8, !tbaa !3
57 %arrayidx12 = getelementptr inbounds i32* %tmp10, i64 %idxprom
58 %tmp11 = bitcast i32* %arrayidx12 to i8*
60 ; CHECK: prfm pstl1strm
61 call void @llvm.prefetch(i8* %tmp11, i32 1, i32 0, i32 1)
62 %tmp12 = load i32** @a, align 8, !tbaa !3
63 %arrayidx15 = getelementptr inbounds i32* %tmp12, i64 %idxprom
64 %tmp13 = bitcast i32* %arrayidx15 to i8*
66 ; CHECK: prfm pstl3keep
67 call void @llvm.prefetch(i8* %tmp13, i32 1, i32 1, i32 1)
68 %tmp14 = load i32** @a, align 8, !tbaa !3
69 %arrayidx18 = getelementptr inbounds i32* %tmp14, i64 %idxprom
70 %tmp15 = bitcast i32* %arrayidx18 to i8*
72 ; CHECK: prfm pstl2keep
73 call void @llvm.prefetch(i8* %tmp15, i32 1, i32 2, i32 1)
74 %tmp16 = load i32** @a, align 8, !tbaa !3
75 %arrayidx21 = getelementptr inbounds i32* %tmp16, i64 %idxprom
76 %tmp17 = bitcast i32* %arrayidx21 to i8*
78 ; CHECK: prfm pstl1keep
79 call void @llvm.prefetch(i8* %tmp17, i32 1, i32 3, i32 1)
83 declare void @llvm.prefetch(i8* nocapture, i32, i32, i32) nounwind
85 !0 = metadata !{metadata !"int", metadata !1}
86 !1 = metadata !{metadata !"omnipotent char", metadata !2}
87 !2 = metadata !{metadata !"Simple C/C++ TBAA"}
88 !3 = metadata !{metadata !"any pointer", metadata !1}