This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Optimize certain end of loop conditions into min/max operation
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Michael Collison <michael dot collison at linaro dot org>
- Cc: gcc Patches <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 27 Jul 2015 11:25:57 +0200
- Subject: Re: [PATCH] Optimize certain end of loop conditions into min/max operation
- Authentication-results: sourceware.org; auth=none
- References: <55B5A884 dot 4060105 at linaro dot org>
On Mon, Jul 27, 2015 at 5:41 AM, Michael Collison
<michael.collison@linaro.org> wrote:
> This patch is designed to optimize end of loop conditions involving of the
> form
> i < x && i < y into i < min (x, y). Loop condition involving '>' are
> handled similarly using max(x,y).
> As an example:
>
> #define N 1024
>
> int a[N], b[N], c[N];
>
> void add (unsignedint m, unsignedint n)
> {
> unsignedint i, bound = (m < n) ? m : n;
> for (i = 0; i < m && i < n; ++i)
> a[i] = b[i] + c[i];
> }
>
>
> Performed bootstrap and make check on: x86_64_unknown-linux-gnu,
> arm-linux-gnueabihf, and aarch64-linux-gnu.
> Okay for trunk?
So this works only for && that has been lowered to non-CFG form
(I suppose phiopt would catch that? If not, ifcombine would be the
place to implement it I guess).
Furthermore it doesn't work for three such ops which would require
an additional pattern like
(simplfiy
(bit_and:c (op @0 (min @1 @2)) (op @0 @3))
(op @0 (min (min @1 @2) @3))))
if that's profitable?
Richard.
> 2015-07-24 Michael Collison <michael.collison@linaro.org>
> Andrew Pinski <andrew.pinski@caviumnetworks.com>
>
> * match.pd ((x < y) && (x < z) -> x < min (y,z),
> (x > y) and (x > z) -> x > max (y,z))
>
> diff --git a/gcc/match.pd b/gcc/match.pd
> index 5e8fd32..8691710 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -1793,3 +1793,17 @@ along with GCC; see the file COPYING3. If not see
> (convert (bit_and (op (convert:utype @0) (convert:utype @1))
> (convert:utype @4)))))))
>
> +
> +/* Transform (@0 < @1 and @0 < @2) to use min */
> +(for op (lt le)
> +(simplify
> +(bit_and:c (op @0 @1) (op @0 @2))
> +(if (INTEGRAL_TYPE_P (TREE_TYPE (@0)))
> +(op @0 (min @1 @2)))))
> +
> +/* Transform (@0 > @1 and @0 > @2) to use max */
> +(for op (gt ge)
> +(simplify
> +(bit_and:c (op @0 @1) (op @0 @2))
> +(if (INTEGRAL_TYPE_P (TREE_TYPE (@0)))
> +(op @0 (max @1 @2)))))
> --
>
> --
> Michael Collison
> Linaro Toolchain Working Group
> michael.collison@linaro.org
>