| ; Test data prefetching. | |
| ; | |
| ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s | |
| declare void @llvm.prefetch(ptr, i32, i32, i32) | |
| @g = dso_local global [4096 x i8] zeroinitializer | |
| ; Check that instruction read prefetches are ignored. | |
| define dso_local void @f1(ptr %ptr) { | |
| ; CHECK-LABEL: f1: | |
| ; CHECK-NOT: %r2 | |
| ; CHECK: br %r14 | |
| call void @llvm.prefetch(ptr %ptr, i32 0, i32 0, i32 0) | |
| ret void | |
| } | |
| ; Check that instruction write prefetches are ignored. | |
| define dso_local void @f2(ptr %ptr) { | |
| ; CHECK-LABEL: f2: | |
| ; CHECK-NOT: %r2 | |
| ; CHECK: br %r14 | |
| call void @llvm.prefetch(ptr %ptr, i32 1, i32 0, i32 0) | |
| ret void | |
| } | |
| ; Check data read prefetches. | |
| define dso_local void @f3(ptr %ptr) { | |
| ; CHECK-LABEL: f3: | |
| ; CHECK: pfd 1, 0(%r2) | |
| ; CHECK: br %r14 | |
| call void @llvm.prefetch(ptr %ptr, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| ; Check data write prefetches. | |
| define dso_local void @f4(ptr %ptr) { | |
| ; CHECK-LABEL: f4: | |
| ; CHECK: pfd 2, 0(%r2) | |
| ; CHECK: br %r14 | |
| call void @llvm.prefetch(ptr %ptr, i32 1, i32 0, i32 1) | |
| ret void | |
| } | |
| ; Check an address at the negative end of the range. | |
| define dso_local void @f5(ptr %base, i64 %index) { | |
| ; CHECK-LABEL: f5: | |
| ; CHECK: pfd 2, -524288({{%r2,%r3|%r3,%r2}}) | |
| ; CHECK: br %r14 | |
| %add = add i64 %index, -524288 | |
| %ptr = getelementptr i8, ptr %base, i64 %add | |
| call void @llvm.prefetch(ptr %ptr, i32 1, i32 0, i32 1) | |
| ret void | |
| } | |
| ; Check an address at the positive end of the range. | |
| define dso_local void @f6(ptr %base, i64 %index) { | |
| ; CHECK-LABEL: f6: | |
| ; CHECK: pfd 2, 524287({{%r2,%r3|%r3,%r2}}) | |
| ; CHECK: br %r14 | |
| %add = add i64 %index, 524287 | |
| %ptr = getelementptr i8, ptr %base, i64 %add | |
| call void @llvm.prefetch(ptr %ptr, i32 1, i32 0, i32 1) | |
| ret void | |
| } | |
| ; Check that the next address up still compiles. | |
| define dso_local void @f7(ptr %base, i64 %index) { | |
| ; CHECK-LABEL: f7: | |
| ; CHECK: 524288 | |
| ; CHECK: pfd 2, | |
| ; CHECK: br %r14 | |
| %add = add i64 %index, 524288 | |
| %ptr = getelementptr i8, ptr %base, i64 %add | |
| call void @llvm.prefetch(ptr %ptr, i32 1, i32 0, i32 1) | |
| ret void | |
| } | |
| ; Check pc-relative prefetches. | |
| define dso_local void @f8() { | |
| ; CHECK-LABEL: f8: | |
| ; CHECK: pfdrl 2, g | |
| ; CHECK: br %r14 | |
| %ptr = getelementptr [4096 x i8], ptr@g, i64 0, i64 0 | |
| call void @llvm.prefetch(ptr %ptr, i32 1, i32 0, i32 1) | |
| ret void | |
| } |