aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2018-08-03 12:56:55 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2018-08-03 12:56:55 +0000
commit0246112a9d59b22cc06165b6586b8dc0d76b72a1 (patch)
treec5cea056f707c9b77bae206e6dad99911f65d947 /gcc/ada
parentd7487e2ae8666f071cb841a845e1e8770b4f9f67 (diff)
downloadgcc-0246112a9d59b22cc06165b6586b8dc0d76b72a1.zip
gcc-0246112a9d59b22cc06165b6586b8dc0d76b72a1.tar.gz
gcc-0246112a9d59b22cc06165b6586b8dc0d76b72a1.tar.bz2
Handle SLP of call pattern statements
We couldn't vectorise: for (int j = 0; j < n; ++j) { for (int i = 0; i < 16; ++i) a[i] = (b[i] + c[i]) >> 1; a += step; b += step; c += step; } at -O3 because cunrolli unrolled the inner loop and SLP couldn't handle AVG_FLOOR patterns (see also PR86504). The problem was some overly strict checking of pattern statements compared to normal statements in vect_get_and_check_slp_defs: switch (gimple_code (def_stmt)) { case GIMPLE_PHI: case GIMPLE_ASSIGN: break; default: if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "unsupported defining stmt:\n"); return -1; } The easy fix would have been to add GIMPLE_CALL to the switch, but I don't think the switch is doing anything useful. We only create pattern statements that the rest of the vectoriser can handle, and the other checks in this function and elsewhere check whether SLP is possible. I'm also not sure why: if (!first && !oprnd_info->first_pattern /* Allow different pattern state for the defs of the first stmt in reduction chains. */ && (oprnd_info->first_dt != vect_reduction_def is necessary. All that should matter is that the statements in the node are "similar enough". It turned out to be quite hard to find a convincing example that used a mixture of pattern and non-pattern statements, so bb-slp-pow-1.c is the best I could come up with. But it does show that the combination of "xi * xi" statements and "pow (xj, 2) -> xj * xj" patterns are handled correctly. The patch therefore just removes the whole if block. The loop also needed commutative swapping to be extended to at least AVG_FLOOR. This gives +3.9% on 525.x264_r at -O3. 2018-08-03 Richard Sandiford <richard.sandiford@arm.com> gcc/ * internal-fn.h (first_commutative_argument): Declare. * internal-fn.c (first_commutative_argument): New function. * tree-vect-slp.c (vect_get_and_check_slp_defs): Remove extra restrictions for pattern statements. Use first_commutative_argument to look for commutative operands in calls to internal functions. gcc/testsuite/ * gcc.dg/vect/bb-slp-over-widen-1.c: Expect AVG_FLOOR to be used on vect_avg_qi targets. * gcc.dg/vect/bb-slp-over-widen-2.c: Likewise. * gcc.dg/vect/bb-slp-pow-1.c: New test. * gcc.dg/vect/vect-avg-15.c: Likewise. From-SVN: r263290
Diffstat (limited to 'gcc/ada')
0 files changed, 0 insertions, 0 deletions