llvm/test
Mehdi Amini 5eed637b34 Improve DAG combine pass on certain IR vector patterns
Loading 2 2x32-bit float vectors into the bottom half of a 256-bit vector
produced suboptimal code in AVX2 mode with certain IR combinations.

In particular, the IR optimizer folded 2f32 + 2f32 -> 4f32, 4f32 + 4f32
(undef) -> 8f32 into a 2f32 + 2f32 -> 8f32, which seems more canonical,
but then mysteriously generated rather bad code; the movq/movhpd combination
didn't match.

The problem lay in the BUILD_VECTOR optimization path. The 2f32 inputs
would get promoted to 4f32 by the type legalizer, eventually resulting
in a BUILD_VECTOR on two 4f32 into an 8f32. The BUILD_VECTOR then, recognizing
these were both half the output size, concatted them and then produced
a shuffle. However, the resulting concat + shuffle was more complex than
it should be; in the case where the upper half of the output is undef, we
probably want to generate shuffle + concat instead.

This enhancement causes the vector_shuffle combine step to recognize this
suboptimal pattern and correct it. I included it there instead of in BUILD_VECTOR
in case the same suboptimal pattern occurs for other reasons.

This results in the optimizer correctly producing the optimal movq + movhpd
sequence for all three variations on this IR, even with AVX2.

I've included a test case.

Radar link: rdar://problem/19287012
Fix for PR 21943.

From: Fiona Glaser <fglaser@apple.com>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@226360 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-17 01:35:56 +00:00
..
Analysis [PM] Port domtree to the new pass manager (at last). 2015-01-14 10:19:28 +00:00
Assembler IR: Allow 16-bits for column info 2015-01-16 17:33:08 +00:00
Bindings IR: Move MDLocation into place 2015-01-14 22:27:36 +00:00
Bitcode Revert r226242 - Revert Revert Don't create new comdats in CodeGen 2015-01-16 08:38:45 +00:00
BugPoint IR: Move MDLocation into place 2015-01-14 22:27:36 +00:00
CodeGen Improve DAG combine pass on certain IR vector patterns 2015-01-17 01:35:56 +00:00
DebugInfo IR: Move MDLocation into place 2015-01-14 22:27:36 +00:00
ExecutionEngine [MCJIT] Remove a few redundant MCJIT tests, and drop the extraneous datalayout 2015-01-08 18:52:15 +00:00
Feature IR: Move MDLocation into place 2015-01-14 22:27:36 +00:00
FileCheck
Instrumentation IR: Move MDLocation into place 2015-01-14 22:27:36 +00:00
Integer
JitListener IR: Move MDLocation into place 2015-01-14 22:27:36 +00:00
Linker IR: Move MDLocation into place 2015-01-14 22:27:36 +00:00
LTO Put this test's input in the Inputs directory where it belongs, rather than 2015-01-12 08:50:47 +00:00
MC Revert r226242 - Revert Revert Don't create new comdats in CodeGen 2015-01-16 08:38:45 +00:00
Object Fix edge case when Start overflowed in 32 bit mode 2015-01-15 23:50:44 +00:00
Other [PM] Port TargetLibraryInfo to the new pass manager, provided by the 2015-01-15 11:39:46 +00:00
SymbolRewriter Transform: add SymbolRewriter pass 2014-11-07 21:32:08 +00:00
TableGen [AVX512] Added intrinsics for VPCMPEQB and VPCMPEQW. 2014-09-30 11:32:22 +00:00
tools Change the test case for llvm-objdump’s -archive-headers option to not check the size 2015-01-16 23:29:07 +00:00
Transforms Fix Reassociate handling of constant in presence of undef float 2015-01-16 03:00:58 +00:00
Unit
Verifier Rename llvm.recoverframeallocation to llvm.framerecover 2015-01-13 01:51:34 +00:00
YAMLParser
.clang-format
CMakeLists.txt Revert r224149, llvm-dsymutil was already here. 2014-12-12 21:25:07 +00:00
lit.cfg llvm/test/lit.cfg: have_ld_plugin_support(): Use decode() for stdout. 2015-01-05 14:18:04 +00:00
lit.site.cfg.in [lit] Make config.llvm_lib_dir available on cmake, too. 2014-12-30 03:24:11 +00:00
Makefile [lit] Make config.llvm_lib_dir available on cmake, too. 2014-12-30 03:24:11 +00:00
Makefile.tests
TestRunner.sh