2016-05-30 14:04 GMT+03:00 Richard Biener <rguent...@suse.de>:
>
> The following patch removes the restriction on seeing a tree of stmts
> in vectorizer bool pattern detection (aka single-use).  With this
> it is no longer necessary to unshare DEFs in ifcvt_repair_bool_pattern
> and that compile-time hog can go (it's now enabled unconditionally for GCC 7).
>
> Instead the pattern detection code will now "unshare" the condition tree
> for each bool pattern root my means of adding all pattern stmts of the
> condition tree to its pattern def sequence (so we still get some
> unnecessary copying, worst-case quadratic rather than exponential).
>
> Ilja - I had to disable the
>
>           tree mask_type = get_mask_type_for_scalar_type (TREE_TYPE
> (rhs1));
>           if (mask_type
>               && expand_vec_cmp_expr_p (comp_vectype, mask_type))
>             return false;
>
> check you added to check_bool_pattern to get any coverage for bool
> patterns on x86_64.  Doing that regresses
>
> FAIL: gcc.target/i386/mask-pack.c scan-tree-dump-times vect "vectorized 1
> loops" 10
> FAIL: gcc.target/i386/mask-unpack.c scan-tree-dump-times vect "vectorized
> 1 loops" 10
> FAIL: gcc.target/i386/pr70021.c scan-tree-dump-times vect "vectorized 1
> loops" 2
>
> so somehow bool patterns mess up things here (I didn't investigate).
> The final patch will enable the above path again, avoiding the regression.

Mask conversion patterns handle some cases bool patterns don't.  So it's
expected we can't vectorize some loops if bool patterns are enforced.

Thanks,
Ilya

>
> Yuri - I suppose you have a larger set of testcases using OMP simd
> or other forced vectorization you added ifcvt_repair_bool_pattern for.
> I'd appreciate testing (and testcases if anything fails unexpectedly).
>
> Testing on other targets is of course appreciated as well.
>
> Bootstrapped and tested on x86_64-unknown-linux-gnu (with the #if 0).
>
> Comments?
>
> I agree with Ilya elsewhere to remove bool patterns completely
> (as a first step making them apply to individual stmts).  We do
> currently not support mixed cond/non-cond uses anyway, like
>
> _Bool a[64];
> unsigned char b[64];
>
> void foo (void)
> {
>   for (int i = 0; i < 64; ++i)
>     {
>       _Bool x = a[i] && b[i] < 10;
>       a[i] = x;
>     }
> }
>
> and stmt-local "patterns" can be added when vectorizing the stmt
> (like in the above case a tem = a[i] != 0 ? -1 : 0).  Doing
> bool "promotion" optimally requires a better vectorizer IL
> (similar to placing of shuffles).
>
> Thanks,
> Richard.
>

Reply via email to