This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [patch] Another enhancement of widen-mult in the vectorizer
- From: Richard Guenther <richard dot guenther at gmail dot com>
- To: Ira Rosen <ira dot rosen at linaro dot org>
- Cc: gcc-patches at gcc dot gnu dot org, Patch Tracking <patches at linaro dot org>, irar at il dot ibm dot com
- Date: Thu, 16 Jun 2011 10:00:25 +0200
- Subject: Re: [patch] Another enhancement of widen-mult in the vectorizer
- References: <BANLkTikfguxDi6kcpf0xUGzJa+=DckArqQ@mail.gmail.com>
On Thu, Jun 16, 2011 at 8:54 AM, Ira Rosen <ira.rosen@linaro.org> wrote:
> Hi,
>
> For
>
> unsigned char in[N];
> int out[N];
> for (i = 0; i < N; i++)
> ? ?out[i] = in[i] * 300;
>
> in[i] is first promoted to int and then multiplied by 300. This
> over-promotion prevents the vectorizer from using the widen-mult
> pattern here.
>
> This patch checks if a constant fits an intermediate type (short in
> this example) and generates widen-mult operation on that type. I.e.,
> the following sequence:
>
> ? ? type a_t;
> ? ? TYPE a_T, prod_T;
>
> ? ? S1 ?a_t = ;
> ? ? S3 ?a_T = (TYPE) a_t;
> ? ? S5 ?prod_T = a_T * CONST;
>
> is marked as:
>
> ? ? type a_t;
> ? ? interm_type a_it;
> ? ? TYPE a_T, prod_T, ?prod_T';
>
> ? ? S1 ?a_t = ;
> ? ? S3 ?a_T = (TYPE) a_t;
> ? ? ? ? ? '--> a_it = (interm_type) a_t;
> ? ? S5 ?prod_T = a_T * CONST;
> ? ? ? ? ? '--> prod_T' = a_it w* CONST;
>
>
> by the pattern detection (and later vectorized using the new statements).
>
> Bootstrapped and tested on powerpc64-suse-linux.
> Comments are welcome.
+ && TREE_CODE (half_type1) == INTEGER_TYPE)
+ {
+ if (int_fits_type_p (oprnd0, half_type1))
I believe you need to check that oprnd0 is a INTEGER_CST before calling
int_fits_type_p.
+ {
+ /* OPRND0 is a constant of HALF_TYPE1. */
The whole following block is repeated twice, nearly identical - that asks
for factoring it out.
Otherwise the patch looks reasonable.
Thanks,
Richard.
> Thanks,
> Ira
>
>
> ChangeLog:
>
> ? ? ? ?* tree-vectorizer.h (vect_recog_func_ptr): Change the first
> ? ? ? ?argument to be a VEC of statements.
> ? ? ? ?* tree-vect-loop.c (vect_determine_vectorization_factor):
> ? ? ? ?Remove the assert that pattern statements have to have their
> ? ? ? ?vector type set.
> ? ? ? ?* tree-vect-patterns.c (langhooks.h): Include.
> ? ? ? ?(vect_recog_widen_sum_pattern): Change the first argument
> ? ? ? ?to be a VEC of statements. ?Update documentation.
> ? ? ? ?(vect_recog_dot_prod_pattern, vect_recog_pow_pattern):
> ? ? ? ?Likewise.
> ? ? ? ?(vect_recog_widen_mult_pattern): Likewise and support
> ? ? ? ?multiplication by a constant that fits an intermediate type.
> ? ? ? ?Use int_fits_type_p ?instead of comparing to types max and
> ? ? ? ?min values.
> ? ? ? ?(vect_pattern_recog_1): Update vect_recog_func_ptr and its
> ? ? ? ?call. ?Handle additional pattern statements if necessary.
> ? ? ? ?* Makefile.in (tree-vect-patterns.c): Add dependency on
> ? ? ? ?langhooks.h.
>
> testsuite/ChangeLog:
>
> ? ? ? ?* gcc.dg/vect/vect-widen-mult-half-u8.c: New test.
>