]> git.ipfire.org Git - thirdparty/gcc.git/commit
isel: Fold more in gimple_expand_vec_cond_expr with andc and iorc [PR115659]
authorKewen Lin <linkw@linux.ibm.com>
Mon, 8 Jul 2024 05:14:59 +0000 (00:14 -0500)
committerKewen Lin <linkw@gcc.gnu.org>
Mon, 8 Jul 2024 05:14:59 +0000 (00:14 -0500)
commitf379596e0ba99df249d6e8b3f2e66edfcea916fe
tree6c0b6ed81566f0f0f0c9be59077e472357b732a1
parentf90ca62566c1d20da585d95ced99f6a1903fc2cc
isel: Fold more in gimple_expand_vec_cond_expr with andc and iorc [PR115659]

As PR115659 shows, assuming c = x CMP y, there are some
folding chances for patterns r = c ? 0/z : z/-1:
  - for r = c ? 0 : z, it can be folded into r = ~c & z.
  - for r = c ? z : -1, it can be folded into r = ~c | z.

But BIT_AND/BIT_IOR applied on one BIT_NOT operand is a
compound operation, it's arguable to consider it beats
vector selection.  So this patch is to introduce new
optabs andc, iorc and its corresponding internal functions
BIT_{ANDC,IORC}, and if targets defines such optabs for
vector modes, it means targets support these hardware
insns and should be not worse than vector selection.

PR tree-optimization/115659

gcc/ChangeLog:

* doc/md.texi: Document andcm3 and iorcm3.
* gimple-isel.cc (gimple_expand_vec_cond_expr): Add more foldings for
patterns x CMP y ? 0 : z and x CMP y ? z : -1.
* internal-fn.def (BIT_ANDC): New internal function.
(BIT_IORC): Likewise.
* optabs.def (andc, iorc): New optab.
gcc/doc/md.texi
gcc/gimple-isel.cc
gcc/internal-fn.def
gcc/optabs.def