1; Test data prefetching. 2; 3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4 5declare void @llvm.prefetch(i8*, i32, i32, i32) 6 7@g = global [4096 x i8] zeroinitializer 8 9; Check that instruction read prefetches are ignored. 10define 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. 19define 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. 28define 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. 37define 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. 46define 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, 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. 57define 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, 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. 68define 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, 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. 80define void @f8() { 81; CHECK-LABEL: f8: 82; CHECK: pfdrl 2, g 83; CHECK: br %r14 84 %ptr = getelementptr [4096 x i8], [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} 88