blob: ab42381c0ae08176fba4dd80405f7b2e3ef2c595 [file]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt -mtriple=amdgpu12.50-amd-amdhsa -passes=load-store-vectorizer -S < %s | FileCheck %s
; A prefetch does not write the memory it prefetches, so loads on both sides
; of it can be vectorized.
define i32 @global_prefetch(ptr addrspace(1) %p) {
; CHECK-LABEL: define i32 @global_prefetch(
; CHECK-SAME: ptr addrspace(1) [[P:%.*]]) {
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i32>, ptr addrspace(1) [[P]], align 8
; CHECK-NEXT: [[A1:%.*]] = extractelement <2 x i32> [[TMP1]], i64 0
; CHECK-NEXT: [[B2:%.*]] = extractelement <2 x i32> [[TMP1]], i64 1
; CHECK-NEXT: call void @llvm.amdgcn.global.prefetch(ptr addrspace(1) [[P]], i32 8)
; CHECK-NEXT: [[S:%.*]] = add i32 [[A1]], [[B2]]
; CHECK-NEXT: ret i32 [[S]]
;
%p1 = getelementptr inbounds i32, ptr addrspace(1) %p, i64 1
%a = load i32, ptr addrspace(1) %p, align 8
call void @llvm.amdgcn.global.prefetch(ptr addrspace(1) %p, i32 8)
%b = load i32, ptr addrspace(1) %p1, align 4
%s = add i32 %a, %b
ret i32 %s
}