Hi, ifcvt transforms the following conditional operation reduction pattern:
if ( condition )
a = a OP b;
else
a = a OP c;
Into:
a_1 = a OP b;
a_2 = a OP c;
a = condition ? a_1 : a_2;
Where OP is one of { plus minus mult min max and ior eor }.
This patch further optimizes the above to:
a_0 = condition ? b : c;
a = a OP a_0;
Which enables vectorization on AArch64.
Also supported are permutations of the above operand ordering subject to
commutativity of OP.
Added new tests. Built and regression tested on aarch64-none-elf and
aarch64-linux-gnu.
Best Regards,
Yuliang Wang
gcc/ChangeLog:
2019-09-19 Yuliang Wang <[email protected]>
* match.pd (for cnd (cond vec_cond)): New match statements for the
above patterns.
* doc/sourcebuild.texi (vect_condred_si): Document new target selector.
gcc/testsuite/ChangeLog:
2019-09-19 Yuliang Wang <[email protected]>
* gcc.target/aarch64/sve2/condred_1.c: New test.
* gcc.dg/vect/vect-condred-1.c: As above.
* gcc.dg/vect/vect-condred-2.c: As above.
* gcc.dg/vect/vect-condred-3.c: As above.
* gcc.dg/vect/vect-condred-4.c: As above.
* gcc.dg/vect/vect-condred-5.c: As above.
* gcc.dg/vect/vect-condred-6.c: As above.
* gcc.dg/vect/vect-condred-7.c: As above.
* gcc.dg/vect/vect-condred-8.c: As above.
* lib/target-supports.exp (check_effective_target_vect_condred_si):
Return true for AArch64 without SVE.
rb11852.patch
Description: rb11852.patch
