[DAG] Teach how to combine a pair of shuffles into a single shuffle if the resulting...
authorAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Tue, 8 Jul 2014 15:22:29 +0000 (15:22 +0000)
committerAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Tue, 8 Jul 2014 15:22:29 +0000 (15:22 +0000)
commitd261e98f3db16c0ba257878d2662d6e39e9bfa0f
treec1ca1b9b71a078684878ec39ad550ae67584de12
parent56cca89fc3aefa73e0da3e5bd10b9c85209a726a
[DAG] Teach how to combine a pair of shuffles into a single shuffle if the resulting mask is legal.

This patch teaches how to fold a shuffle according to rule:
  shuffle (shuffle (x, undef, M0), undef, M1) -> shuffle(x, undef, M2)

We do this only if the resulting mask M2 is legal; this is to avoid introducing
illegal shuffles that are potentially expanded into a sub-optimal sequence
of target specific dag nodes.

This patch has the advantage of being target independent, since it works on ISD
nodes. Therefore, all targets (not only x86) can take advantage of this rule.
The idea behind this patch is that most shuffle pairs can be safely combined
before we run the legalizer on vector operations. This allows us to
combine/simplify dag nodes earlier in the process and not only immediately
before instruction selection stage.

That said. This patch is not meant to replace any existing target specific
combine rules; backends might still introduce new shuffles during legalization
stage. Also, this rule is very simple and avoids to aggressively optimize
shuffles.

llvm-svn: 212539
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
llvm/test/CodeGen/X86/swizzle-2.ll [new file with mode: 0644]
llvm/test/CodeGen/X86/swizzle-avx2.ll [new file with mode: 0644]