------- Comment #16 from law at redhat dot com 2010-02-09 23:49 -------
Subject: Re: vectorizer created unaligned vector
insns
On 02/09/10 16:11, rguenth at gcc dot gnu dot org wrote:
> ------- Comment #15 from rguenth at gcc dot gnu dot org 2010-02-09 23:11
> -------
> (In reply to comment #14)
>
>> Subject: Re: vectorizer created unaligned vector
>> insns
>>
>> On 01/18/10 05:17, irar at il dot ibm dot com wrote:
>>
>>> ------- Comment #13 from irar at il dot ibm dot com 2010-01-18 12:17
>>> -------
>>> Does something like this make sense? (With this patch we will never use
>>> peeling
>>> for function parameters, unless the builtin returns OK to peel for packed
>>> types).
>>>
>>> Index: tree-vect-data-refs.c
>>> ===================================================================
>>> --- tree-vect-data-refs.c (revision 155880)
>>> +++ tree-vect-data-refs.c (working copy)
>>> @@ -1010,10 +1010,29 @@ vector_alignment_reachable_p (struct dat
>>> tree type = (TREE_TYPE (DR_REF (dr)));
>>> tree ba = DR_BASE_OBJECT (dr);
>>> bool is_packed = false;
>>> + tree tmp = TREE_TYPE (DR_BASE_ADDRESS (dr));
>>>
>>> if (ba)
>>> is_packed = contains_packed_reference (ba);
>>>
>>> + is_packed = is_packed || contains_packed_reference (DR_BASE_ADDRESS
>>> (dr));
>>> +
>>> + if (!is_packed)
>>> + {
>>> + while (tmp)
>>> + {
>>> + is_packed = TYPE_PACKED (tmp);
>>> + if (is_packed)
>>> + break;
>>> +
>>> + tmp = TREE_TYPE (tmp);
>>> + }
>>> + }
>>> +
>>> + if (TREE_CODE (DR_BASE_ADDRESS (dr)) == SSA_NAME
>>> +&& TREE_CODE (SSA_NAME_VAR (DR_BASE_ADDRESS (dr))) == PARM_DECL)
>>> + is_packed = true;
>>> +
>>> if (vect_print_dump_info (REPORT_DETAILS))
>>> fprintf (vect_dump, "Unknown misalignment, is_packed =
>>> %d",is_packed);
>>> if (targetm.vectorize.vector_alignment_reachable (type, is_packed))
>>>
>>>
>>>
>> I still don't see how this can be conservatively correct. The
>> fundamental problem is the code assumes that if it doesn't find a packed
>> attribute or the DR_BASE_ADDRESS isn't directly derived from a PARM_DECL
>> then it's safe to vectorize. Instead the code really needs to operate
>> by proving suitable alignment and if suitable alignment can't be proven,
>> then vectorization is not possible without runtime alignment guards.
>>
>> As an example, consider the case where an unaligned packed address is
>> passed as a parameter, but the target function does somethign like
>>
>> fubar (int *p, bool condition ) // where P is potentially unaligned
>>
> A pointer of type int * which is not aligned properly invokes undefined
> behavior.
>
Unaligned in the sense that the alignment is not suitable for
vectorization, but still has suitable alignment for natural integer
loads & stores on the target processor.
jeff
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42652