[DAGCombiner] reduce insert+bitcast+extract vector ops to truncate (PR39016)
authorSanjay Patel <spatel@rotateright.com>
Sun, 21 Oct 2018 20:13:29 +0000 (20:13 +0000)
committerSanjay Patel <spatel@rotateright.com>
Sun, 21 Oct 2018 20:13:29 +0000 (20:13 +0000)
commite439cc2745323d2ac0e61de1e04efa0098f4b1a8
tree6365076050c6dc131a967da4aec0508cd91b0f4b
parente967a12733565fff0beb16865bd21e381b75b250
[DAGCombiner] reduce insert+bitcast+extract vector ops to truncate (PR39016)

This is a late backend subset of the IR transform added with:
D52439

We can confirm that the conversion to a 'trunc' is correct by running:
$ opt -instcombine -data-layout="e"
(assuming the IR transforms are correct; change "e" to "E" for big-endian)

As discussed in PR39016:
https://bugs.llvm.org/show_bug.cgi?id=39016
...the pattern may emerge during legalization, so that's we are waiting for an
insertelement to become a scalar_to_vector in the pattern matching here.

The DAG allows for fun variations that are not possible in IR. Result types for
extracts and scalar_to_vector don't necessarily match input types, so that means
we have to be a bit more careful in the transform (see code comments).

The tests show that we don't handle cases that require a shift (as we did in the
IR version). I've left that as a potential follow-up because I'm not sure if
that's a real concern at this late stage.

Differential Revision: https://reviews.llvm.org/D53201

llvm-svn: 344872
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
llvm/test/CodeGen/AArch64/extract-insert.ll
llvm/test/CodeGen/X86/extract-insert.ll
llvm/test/CodeGen/X86/mmx-coalescing.ll