auto-vectorization analysis/__builtin_assume_aligned on gcc-4.7-20120114
Alexander Herz
alexander.herz@mytum.de
Thu Jan 19 13:38:00 GMT 2012
The generated non-vectorized assembly is simply the unrolled loop with
>8 iterations, so loop structure is pretty much intact (except for
unrolling).
Does the vectorizer fail on unrolled loops?
I can compile some assembly dumps showing both the vectorized and the
unvectorized loop?
Alex
On 01/19/2012 11:29 AM, Richard Guenther wrote:
> On Wed, Jan 18, 2012 at 6:37 PM, Alexander Herz<alexander.herz@mytum.de> wrote:
>> Given this piece of code (gcc-4.7-20120114):
>>
>> static void Test(Batch* block,Batch* new_block,const uint32 offs)
>> {
>>
>> T* __restrict old_values
>> =(T*)__builtin_assume_aligned(block->items,16);
>> T* __restrict new_values
>> =(T*)__builtin_assume_aligned(new_block->items,16);
>>
>> //assert(((uint64)(&block->items)%16)==0); //OK!!
>> //assert(((uint64)(&new_block->items)%16)==0);
>>
>> for(uint32 c=0;c<(BS<<1);c++) //hopefully compiler applies SIMD here
>> {
>> new_values[c]=old_values[c]*old_values[c];
>> }
>>
>> }
>>
>> I would assume that the loop is always vectorized (pointers tagged as
>> restricted and aligned, loop
>> over fixed iteration space even a power of 2, so most likely dividable by
>> 4), it is quite similar to vectorization example22
>> (http://gcc.gnu.org/projects/tree-ssa/vectorization.html#vectorizab).
>>
>> I run the previously mentioned g++ version with this command line:
>> -std=c++0x -g -O3 -msse -msse2 -msse3 -msse4.1 -Wall -Wstrict-aliasing=2
>> -ftree-vectorizer-verbose=2
>>
>> Looking at the vectorizer output (and at the generated assembly) it looks as
>> if the loop given above
>> is indeed vectorized if Test() is called from main() (vectorized 1 loop).
>>
>> When the function Test() is called nested inside some complex code, it looks
>> as if the vectorization analysis gives up because the code is too complex to
>> analyze and never considers the loop inside Test() in this context even
>> though it should be easily vectorizeable in any context given the hints
>> inside Test().
>>
>> Is there anything I can do, so that Test() is analyzed in all contexts? I
>> guess all methods that contain the
>> __builtin_assume_aligned hint should be considered for vectorization,
>> independent of their context.
> Without a concrete example it is impossible to say. I suppose earlier
> optimizations destroy loop structure too much?
>
>> Thx for your help,
>> Alex
>>
>>
More information about the Gcc
mailing list