> When we are unlucky operand canonicalization can end up presenting > us with different order, making a possible SLP reduction group > not match up. The following allows swapping operands in this case. > > Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed. > > * tree-vect-slp.cc (vect_get_operand_map): Handle commutative > operands when swapping is requested. > (vect_build_slp_tree_1): Allow STMT_VINFO_REDUC_IDX differences > when operand swapping makes them match and request swapping. > (vect_build_slp_instance): Indicate we have successfully > discovered a SLP reduction group. > > * gcc.dg/vect/slp-reduc-13.c: New testcase.
Thanks for looking into this! I was planning to get back to it after having sufficiently delved into the SLP-based vectorization scheme, but quickly got side tracked... I did see the operand swapping mechanism when I was investigating the issue but got the impression that, as long as STMT_VINFO_REDUC_IDX is tracked for each statement, swapping the operands to have it uniform across the whole group would be superfluous for a commutative operation. Obviously I totally missed vect_get_operand_map and its implications. I can confirm that the patch enables loop vectorization for the Ada testcase compiled for x86_64-w64-mingw32 in 64-bit mode. From the outside, it looks like a straightforward extension to the operand swapping mechanism, so do you plan to install it in GCC 16? -- Eric Botcazou
