------- 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

Reply via email to