llvm-6502/include/llvm/Analysis
Arnold Schwaighofer 65457b679a Costmodel: Add support for horizontal vector reductions
Upcoming SLP vectorization improvements will want to be able to estimate costs
of horizontal reductions. Add infrastructure to support this.

We model reductions as a series of (shufflevector,add) tuples ultimately
followed by an extractelement. For example, for an add-reduction of <4 x float>
we could generate the following sequence:

 (v0, v1, v2, v3)
   \   \  /  /
     \  \  /
       +  +

 (v0+v2, v1+v3, undef, undef)
    \      /
 ((v0+v2) + (v1+v3), undef, undef)

 %rdx.shuf = shufflevector <4 x float> %rdx, <4 x float> undef,
                           <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>
 %bin.rdx = fadd <4 x float> %rdx, %rdx.shuf
 %rdx.shuf7 = shufflevector <4 x float> %bin.rdx, <4 x float> undef,
                          <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
 %bin.rdx8 = fadd <4 x float> %bin.rdx, %rdx.shuf7
 %r = extractelement <4 x float> %bin.rdx8, i32 0

This commit adds a cost model interface "getReductionCost(Opcode, Ty, Pairwise)"
that will allow clients to ask for the cost of such a reduction (as backends
might generate more efficient code than the cost of the individual instructions
summed up). This interface is excercised by the CostModel analysis pass which
looks for reduction patterns like the one above - starting at extractelements -
and if it sees a matching sequence will call the cost model interface.

We will also support a second form of pairwise reduction that is well supported
on common architectures (haddps, vpadd, faddp).

 (v0, v1, v2, v3)
  \   /    \  /
 (v0+v1, v2+v3, undef, undef)
    \     /
 ((v0+v1)+(v2+v3), undef, undef, undef)

  %rdx.shuf.0.0 = shufflevector <4 x float> %rdx, <4 x float> undef,
        <4 x i32> <i32 0, i32 2 , i32 undef, i32 undef>
  %rdx.shuf.0.1 = shufflevector <4 x float> %rdx, <4 x float> undef,
        <4 x i32> <i32 1, i32 3, i32 undef, i32 undef>
  %bin.rdx.0 = fadd <4 x float> %rdx.shuf.0.0, %rdx.shuf.0.1
  %rdx.shuf.1.0 = shufflevector <4 x float> %bin.rdx.0, <4 x float> undef,
        <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef>
  %rdx.shuf.1.1 = shufflevector <4 x float> %bin.rdx.0, <4 x float> undef,
        <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
  %bin.rdx.1 = fadd <4 x float> %rdx.shuf.1.0, %rdx.shuf.1.1
  %r = extractelement <4 x float> %bin.rdx.1, i32 0

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190876 91177308-0d34-0410-b5e6-96231b3b80d8
2013-09-17 18:06:50 +00:00
..
AliasAnalysis.h Make BasicAliasAnalysis recognize the fact a noalias argument cannot alias another argument, even if the other argument is not itself marked noalias. 2013-05-28 08:17:48 +00:00
AliasSetTracker.h Remove unneeded #includes. 2013-03-18 23:33:44 +00:00
BlockFrequencyImpl.h Add some constantness. 2013-08-20 23:04:15 +00:00
BlockFrequencyInfo.h Fixed 80+ violation and added C++ to header. 2013-07-12 23:09:43 +00:00
BranchProbabilityInfo.h Add a new function attribute 'cold' to functions. 2013-05-24 12:26:52 +00:00
CallGraph.h
CallGraphSCCPass.h
CallPrinter.h
CaptureTracking.h Remove unneeded #includes. Use forward declarations instead. 2013-03-10 00:34:01 +00:00
CFG.h Add some constantness. 2013-08-20 23:04:15 +00:00
CFGPrinter.h
CodeMetrics.h
ConstantFolding.h Add missing -*- C++ -*- to headers 2013-05-17 21:43:39 +00:00
ConstantsScanner.h
DependenceAnalysis.h Use SmallVectorImpl& instead of SmallVector to avoid repeating small vector size. 2013-07-14 04:42:23 +00:00
DominanceFrontier.h
DominatorInternals.h
Dominators.h Add some constantness. 2013-03-05 22:01:15 +00:00
DomPrinter.h
DOTGraphTraitsPass.h
FindUsedTypes.h
InlineCost.h Remove unneeded #include. 2013-06-06 23:34:11 +00:00
InstructionSimplify.h Fix missing -*- C++ -*-s 2013-08-06 00:16:21 +00:00
Interval.h
IntervalIterator.h Fix a few typos in comments. 2013-03-05 22:05:16 +00:00
IntervalPartition.h
IVUsers.h Remove duplicated forward declaration. 2013-03-06 00:04:32 +00:00
LazyValueInfo.h
LibCallAliasAnalysis.h
LibCallSemantics.h
Lint.h
Loads.h
LoopInfo.h Add support for llvm.vectorizer metadata 2013-05-28 20:00:34 +00:00
LoopInfoImpl.h
LoopIterator.h
LoopPass.h
MemoryBuiltins.h Fix typo (ponted -> pointed) 2013-07-22 23:52:23 +00:00
MemoryDependenceAnalysis.h Memory Dependence Analysis (not mem-dep test) take advantage of "invariant.load" metadata. 2013-03-06 17:48:48 +00:00
Passes.h Remove -print-dbginfo as it is unused & bitrotten. 2013-03-08 18:17:46 +00:00
PathNumbering.h
PathProfileInfo.h
PHITransAddr.h
PostDominators.h Add a const version of findNearestCommonDominator to PostDom for convenience. 2013-06-09 15:09:30 +00:00
ProfileDataLoader.h
ProfileDataTypes.h
ProfileInfo.h
ProfileInfoLoader.h
ProfileInfoTypes.h
PtrUseVisitor.h
RegionInfo.h RegionInfo: Add helpers to replace entry/exit recursively 2013-04-10 06:54:49 +00:00
RegionIterator.h
RegionPass.h Fix a typo (ouput => output) 2013-05-17 12:31:43 +00:00
RegionPrinter.h
ScalarEvolution.h Teach ScalarEvolution about pointer address spaces 2013-09-10 19:55:24 +00:00
ScalarEvolutionExpander.h
ScalarEvolutionExpressions.h
ScalarEvolutionNormalization.h
SparsePropagation.h
TargetTransformInfo.h Costmodel: Add support for horizontal vector reductions 2013-09-17 18:06:50 +00:00
Trace.h
ValueTracking.h
Verifier.h