Files
Benjamin Kramer 5b7ab74398 [LoadStoreVectorize] Ignore interleaved invariant loads.
The memory location an invariant load is using can never be clobbered by
any store, so it's safe to move the load ahead of the store.

Differential Revision: https://reviews.llvm.org/D46011

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@330725 91177308-0d34-0410-b5e6-96231b3b80d8
2018-04-24 15:28:47 +00:00

29 lines
1.2 KiB
LLVM

; RUN: opt -mtriple=amdgcn-amd-amdhsa -basicaa -load-store-vectorizer -S -o - %s | FileCheck %s
target datalayout = "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64"
; CHECK-LABEL: @interleave
; CHECK: load <2 x double>, <2 x double> addrspace(1)* %{{.}}, align 8{{$}}
; CHECK: store <2 x double> zeroinitializer
; CHECK: store double %add
define amdgpu_kernel void @interleave(double addrspace(1)* nocapture %a, double addrspace(1)* nocapture %b, double addrspace(1)* nocapture readonly %c) #0 {
entry:
%a.idx.1 = getelementptr inbounds double, double addrspace(1)* %a, i64 1
%c.idx.1 = getelementptr inbounds double, double addrspace(1)* %c, i64 1
%ld.c = load double, double addrspace(1)* %c, align 8
store double 0.0, double addrspace(1)* %a, align 8 ; Cannot alias invariant load
%ld.c.idx.1 = load double, double addrspace(1)* %c.idx.1, align 8, !invariant.load !0
store double 0.0, double addrspace(1)* %a.idx.1, align 8
%add = fadd double %ld.c, %ld.c.idx.1
store double %add, double addrspace(1)* %b
ret void
}
attributes #0 = { nounwind }
!0 = !{}