Richard,

I built compiler with your patch and did not find out any issues with
vectorization of loops marked with pragma simd. I also noticed that
the size of the vectorized loop looks smaller (I can't tell you exact
numbers since the fresh compiler performs fool unroll even if
"-funroll-loops" option was not passed).

2016-05-30 15:55 GMT+03:00 Ilya Enkovich <enkovich....@gmail.com>:
> 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