llvm-project/llvm/lib/CodeGen/SelectionDAG
Manman Ren 413a6cb42b This patch teaches the DAGCombiner how to fold insert_subvector nodes
when the input is a concat_vectors and the insert replaces one of the
concat halves:

Lower half: fold (insert_subvector (concat_vectors X, Y), Z) ->
(concat_vectors Z, Y)
Upper half: fold (insert_subvector (concat_vectors X, Y), Z) ->
(concat_vectors X, Z)

This can be seen with the following IR:

define <8 x float> @lower_half(<4 x float> %v1, <4 x float> %v2, <4 x
float> %v3) {
  %1 = shufflevector <4 x float> %v1, <4 x float> %v2, <8 x i32> <i32
0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
  %2 = tail call <8 x float> @llvm.x86.avx.vinsertf128.ps.256(<8 x
float> %1, <4 x float> %v3, i8 0)

The vinsertf128 intrinsic is converted into an insert_subvector node
in SelectionDAGBuilder.cpp.

Using AVX, without the patch this generates two vinsertf128 instructions:

vinsertf128 $1, %xmm1, %ymm0, %ymm0
vinsertf128 $0, %xmm2, %ymm0, %ymm0

With the patch this is optimized into:

vinsertf128 $1, %xmm1, %ymm2, %ymm0

Patch by Robert Lougher.

llvm-svn: 200506
2014-01-31 01:10:35 +00:00
..
CMakeLists.txt llvm/lib: [CMake] Add explicit dependency to intrinsics_gen. 2012-06-24 13:32:01 +00:00
DAGCombiner.cpp This patch teaches the DAGCombiner how to fold insert_subvector nodes 2014-01-31 01:10:35 +00:00
FastISel.cpp Avoid illegal integer promotion in fastisel 2013-11-15 19:09:27 +00:00
FunctionLoweringInfo.cpp [stackprotector] Use analysis from the StackProtector pass for stack layout in PEI a nd LocalStackSlot passes. 2013-12-19 03:17:11 +00:00
InstrEmitter.cpp Always let value types influence register classes. 2014-01-14 06:18:38 +00:00
InstrEmitter.h Revert "Give internal classes hidden visibility." 2013-09-11 18:05:11 +00:00
LLVMBuild.txt
LegalizeDAG.cpp Add support for legalizing SETNE/SETEQ by inverting the condition code and the result of the comparison. 2013-11-21 13:24:49 +00:00
LegalizeFloatTypes.cpp Keep TBAA info when rewriting SelectionDAG loads and stores 2013-10-28 11:17:59 +00:00
LegalizeIntegerTypes.cpp Revert r162101 and replace it with a solution that works for targets where the pointer type is illegal. 2014-01-22 22:34:17 +00:00
LegalizeTypes.cpp [DAG] Refactor vector splitting code in SelectionDAG. No functional change intended. 2013-11-19 21:20:17 +00:00
LegalizeTypes.h [AArch64 NEON] Fix pattern match failed on FP_ROUND from v1f128 to v1f64. 2014-01-26 02:19:35 +00:00
LegalizeTypesGeneric.cpp SelectionDAG: Optimize expansion of vec_type = BITCAST scalar_type 2013-11-22 00:41:05 +00:00
LegalizeVectorOps.cpp Keep TBAA info when rewriting SelectionDAG loads and stores 2013-10-28 11:17:59 +00:00
LegalizeVectorTypes.cpp [AArch64 NEON] Fix pattern match failed on FP_ROUND from v1f128 to v1f64. 2014-01-26 02:19:35 +00:00
Makefile
ResourcePriorityQueue.cpp Rename variables for consistency. 2013-09-11 00:41:02 +00:00
SDNodeDbgValue.h Revert "Give internal classes hidden visibility." 2013-09-11 18:05:11 +00:00
ScheduleDAGFast.cpp Use SmallVectorImpl& instead of SmallVector to avoid repeating small vector size. 2013-07-14 04:42:23 +00:00
ScheduleDAGRRList.cpp Fix spelling intruction -> instruction. 2013-09-28 11:46:15 +00:00
ScheduleDAGSDNodes.cpp [PATCH] Fix PR17168 (DAG scheduler inserts DBG_VALUE before PHI with fast-isel) 2013-10-18 14:20:11 +00:00
ScheduleDAGSDNodes.h Revert "Give internal classes hidden visibility." 2013-09-11 18:05:11 +00:00
ScheduleDAGVLIW.cpp Move all of the header files which are involved in modelling the LLVM IR 2013-01-02 11:36:10 +00:00
SelectionDAG.cpp [TLI] Add a new hook to TargetLowering to query the target if a load of a constant should be converted to simply the constant itself. 2014-01-28 01:20:14 +00:00
SelectionDAGBuilder.cpp PGO branch weight: update edge weights in SelectionDAGBuilder. 2014-01-31 00:42:44 +00:00
SelectionDAGBuilder.h PGO branch weight: update edge weights in SelectionDAGBuilder. 2014-01-31 00:42:44 +00:00
SelectionDAGDumper.cpp Revert "Revert "Add Constant Hoisting Pass" (r200034)" 2014-01-25 02:02:55 +00:00
SelectionDAGISel.cpp [TLI] Add a new hook to TargetLowering to query the target if a load of a constant should be converted to simply the constant itself. 2014-01-28 01:20:14 +00:00
SelectionDAGPrinter.cpp Put the functionality for printing a value to a raw_ostream as an 2014-01-09 02:29:41 +00:00
TargetLowering.cpp Revert "Revert "Add Constant Hoisting Pass" (r200034)" 2014-01-25 02:02:55 +00:00
TargetSelectionDAGInfo.cpp Move TargetData to DataLayout. 2012-10-08 16:38:25 +00:00