Richard Biener <rguent...@suse.de> writes:
> On Wed, 24 Mar 2021, Stam Markianos-Wright wrote:
>
>> Hi all,
>> 
>> This patch resolves bug:
>> 
>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96974
>> 
>> This is achieved by forcing a re-calculation of *stmt_vectype_out if an
>> incompatible combination of TYPE_VECTOR_SUBPARTS is detected, but with an
>> extra introduced max_nunits ceiling.
>> 
>> I am not 100% sure if this is the best way to go about fixing this, because
>> this is my first look at the vectorizer and I lack knowledge of the wider
>> context, so do let me know if you see a better way to do this!
>> 
>> I have added the previously ICE-ing reproducer as a new test.
>> 
>> This is compiled as "g++ -Ofast -march=armv8.2-a+sve -fdisable-tree-fre4" for
>> GCC11 and "g++ -Ofast -march=armv8.2-a+sve" for GCC10.
>> 
>> (the non-fdisable-tree-fre4 version has gone latent on GCC11)
>> 
>> Bootstrapped and reg-tested on aarch64-linux-gnu.
>> Also reg-tested on aarch64-none-elf.
>
> I don't think this is going to work well given uses will expect
> a vector type that's consistent here.
>
> I think giving up is for the moment the best choice, thus replacing
> the assert with vectorization failure.
>
> In the end we shouldn't require those nunits vectypes to be
> separately computed - we compute the vector type of the defs
> anyway and in case they're invariant the vectorizable_* function
> either can deal with the type mix or not anyway.

I agree this area needs simplification, but I think the direction of
travel should be to make the assert valid.  I agree this is probably
the pragmatic fix for GCC 11 and earlier though.

Also, IMO it's a bug that we use OImode, CImode or XImode for plain
vectors.  We should only need to use them for LD[234] and ST[234] arrays.

Thanks,
Richard

>
> That said, the goal should be to simplify things here.
>
> Richard.
>
>> 
>> gcc/ChangeLog:
>> 
>>         * tree-vect-stmts.c (get_vectype_for_scalar_type): Add new
>>         parameter to core function and add new function overload.
>>         (vect_get_vector_types_for_stmt): Add re-calculation logic.
>> 
>> gcc/testsuite/ChangeLog:
>> 
>>         * g++.target/aarch64/sve/pr96974.C: New test.
>> 

Reply via email to