This patch recognizes (+ (+ v0, v1) (+ v2, v3)), reorders them for bundling into...
authorSuyog Sarda <suyog.sarda@samsung.com>
Fri, 12 Dec 2014 12:53:44 +0000 (12:53 +0000)
committerSuyog Sarda <suyog.sarda@samsung.com>
Fri, 12 Dec 2014 12:53:44 +0000 (12:53 +0000)
commit1dea0dc279b7c22e24599bbccbcf1131fe7f591d
tree06546b6da1f019cb796585dc99c581ed702408f6
parentc15d82e2590fc76e11f0bff891b89259b9c056d2
This patch recognizes (+ (+ v0, v1) (+ v2, v3)), reorders them for bundling into vector of loads,
and vectorizes it.

 Test case :

       float hadd(float* a) {
           return (a[0] + a[1]) + (a[2] + a[3]);
        }

 AArch64 assembly before patch :

        ldp s0, s1, [x0]
  ldp s2, s3, [x0, #8]
  fadd s0, s0, s1
  fadd s1, s2, s3
  fadd s0, s0, s1
  ret

 AArch64 assembly after patch :

        ldp d0, d1, [x0]
  fadd v0.2s, v0.2s, v1.2s
  faddp s0, v0.2s
  ret

Reviewed Link : http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20141208/248531.html

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@224119 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/Vectorize/SLPVectorizer.cpp
test/Transforms/SLPVectorizer/AArch64/horizontaladd.ll [new file with mode: 0644]