tree-optimization/97832 - handle associatable chains in SLP discovery
authorRichard Biener <rguenther@suse.de>
Wed, 18 Nov 2020 13:17:34 +0000 (14:17 +0100)
committerRichard Biener <rguenther@suse.de>
Wed, 9 Jun 2021 12:41:42 +0000 (14:41 +0200)
commitce670e4faafb296d1f1a7828d20f8c8ba4686797
tree32e1806d019c44ba59b0fef020ccd2c661ce69d0
parent13a39886940331149173b25d6ebde0850668d8b9
tree-optimization/97832 - handle associatable chains in SLP discovery

This makes SLP discovery handle associatable (including mixed
plus/minus) chains better by swapping operands across the whole
chain.  To work this adds caching of the 'matches' lanes for
failed SLP discovery attempts, thereby fixing a failed SLP
discovery for the slp-pr98855.cc testcase which results in
building an operand from scalars as expected.  Unfortunately
this makes us trip over the cost threshold so I'm XFAILing the
testcase for now.

For BB vectorization all this doesn't work because we have no way
to distinguish good from bad associations as we eventually build
operands from scalars and thus not fail in the classical sense.

2021-05-31  Richard Biener  <rguenther@suse.de>

PR tree-optimization/97832
* tree-vectorizer.h (_slp_tree::failed): New.
* tree-vect-slp.c (_slp_tree::_slp_tree): Initialize
failed member.
(_slp_tree::~_slp_tree): Free failed.
(vect_build_slp_tree): Retain failed nodes and record
matches in them, copying that back out when running
into a cached fail.  Dump start and end of discovery.
(dt_sort_cmp): New.
(vect_build_slp_tree_2): Handle associatable chains
together doing more aggressive operand swapping.

* gcc.dg/vect/pr97832-1.c: New testcase.
* gcc.dg/vect/pr97832-2.c: Likewise.
* gcc.dg/vect/pr97832-3.c: Likewise.
* g++.dg/vect/slp-pr98855.cc: XFAIL.
gcc/testsuite/g++.dg/vect/slp-pr98855.cc
gcc/testsuite/gcc.dg/vect/pr97832-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/pr97832-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/pr97832-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/slp-50.c [new file with mode: 0644]
gcc/tree-vect-slp.c
gcc/tree-vectorizer.h