[SystemZ] Make more use of LTGFR
[oota-llvm.git] / test / CodeGen / SystemZ / prefetch-01.ll
1 ; Test data prefetching.
2 ;
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4
5 declare void @llvm.prefetch(i8*, i32, i32, i32)
6
7 @g = global [4096 x i8] zeroinitializer
8
9 ; Check that instruction read prefetches are ignored.
10 define void @f1(i8 *%ptr) {
11 ; CHECK-LABEL: f1:
12 ; CHECK-NOT: %r2
13 ; CHECK: br %r14
14   call void @llvm.prefetch(i8 *%ptr, i32 0, i32 0, i32 0)
15   ret void
16 }
17
18 ; Check that instruction write prefetches are ignored.
19 define void @f2(i8 *%ptr) {
20 ; CHECK-LABEL: f2:
21 ; CHECK-NOT: %r2
22 ; CHECK: br %r14
23   call void @llvm.prefetch(i8 *%ptr, i32 1, i32 0, i32 0)
24   ret void
25 }
26
27 ; Check data read prefetches.
28 define void @f3(i8 *%ptr) {
29 ; CHECK-LABEL: f3:
30 ; CHECK: pfd 1, 0(%r2)
31 ; CHECK: br %r14
32   call void @llvm.prefetch(i8 *%ptr, i32 0, i32 0, i32 1)
33   ret void
34 }
35
36 ; Check data write prefetches.
37 define void @f4(i8 *%ptr) {
38 ; CHECK-LABEL: f4:
39 ; CHECK: pfd 2, 0(%r2)
40 ; CHECK: br %r14
41   call void @llvm.prefetch(i8 *%ptr, i32 1, i32 0, i32 1)
42   ret void
43 }
44
45 ; Check an address at the negative end of the range.
46 define void @f5(i8 *%base, i64 %index) {
47 ; CHECK-LABEL: f5:
48 ; CHECK: pfd 2, -524288({{%r2,%r3|%r3,%r2}})
49 ; CHECK: br %r14
50   %add = add i64 %index, -524288
51   %ptr = getelementptr i8 *%base, i64 %add
52   call void @llvm.prefetch(i8 *%ptr, i32 1, i32 0, i32 1)
53   ret void
54 }
55
56 ; Check an address at the positive end of the range.
57 define void @f6(i8 *%base, i64 %index) {
58 ; CHECK-LABEL: f6:
59 ; CHECK: pfd 2, 524287({{%r2,%r3|%r3,%r2}})
60 ; CHECK: br %r14
61   %add = add i64 %index, 524287
62   %ptr = getelementptr i8 *%base, i64 %add
63   call void @llvm.prefetch(i8 *%ptr, i32 1, i32 0, i32 1)
64   ret void
65 }
66
67 ; Check that the next address up still compiles.
68 define void @f7(i8 *%base, i64 %index) {
69 ; CHECK-LABEL: f7:
70 ; CHECK: 524288
71 ; CHECK: pfd 2,
72 ; CHECK: br %r14
73   %add = add i64 %index, 524288
74   %ptr = getelementptr i8 *%base, i64 %add
75   call void @llvm.prefetch(i8 *%ptr, i32 1, i32 0, i32 1)
76   ret void
77 }
78
79 ; Check pc-relative prefetches.
80 define void @f8() {
81 ; CHECK-LABEL: f8:
82 ; CHECK: pfdrl 2, g
83 ; CHECK: br %r14
84   %ptr = getelementptr [4096 x i8] *@g, i64 0, i64 0
85   call void @llvm.prefetch(i8 *%ptr, i32 1, i32 0, i32 1)
86   ret void
87 }