[InterleavedAccess] Add a pass InterleavedAccess to identify interleaved memory acces...
authorHao Liu <Hao.Liu@arm.com>
Fri, 26 Jun 2015 02:10:27 +0000 (02:10 +0000)
committerHao Liu <Hao.Liu@arm.com>
Fri, 26 Jun 2015 02:10:27 +0000 (02:10 +0000)
commit41b3fe53bab20b1098f1cfa69149116dbb4dfd98
treee5ed2f52a04eeb8da29e69e2fbbf81776b09efc8
parent544a31ea34350e9e1ac5d39a686019962048f17a
[InterleavedAccess] Add a pass InterleavedAccess to identify interleaved memory accesses and transform into target specific intrinsics.

E.g. An interleaved load (Factor = 2):
        %wide.vec = load <8 x i32>, <8 x i32>* %ptr
        %v0 = shuffle <8 x i32> %wide.vec, <8 x i32> undef, <0, 2, 4, 6>
        %v1 = shuffle <8 x i32> %wide.vec, <8 x i32> undef, <1, 3, 5, 7>
It can be transformed into a ld2 intrinsic in AArch64 backend or a vld2 intrinsic in ARM backend.

E.g. An interleaved store (Factor = 3):
        %i.vec = shuffle <8 x i32> %v0, <8 x i32> %v1, <0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11>
        store <12 x i32> %i.vec, <12 x i32>* %ptr
It can be transformed into a st3 intrinsic in AArch64 backend or a vst3 intrinsic in ARM backend.

Differential Revision: http://reviews.llvm.org/D10533

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240751 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/CodeGen/Passes.h
include/llvm/Target/TargetLowering.h
lib/CodeGen/CMakeLists.txt
lib/CodeGen/InterleavedAccessPass.cpp [new file with mode: 0644]