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

> {
>     int *addr;
>    if (condition)
>      temp = malloc (whatever)
>    addr = (condition ? temp : p);
> 
>    // addr used as base address in vectorizable loop here
> }
> 
> Jeff
> 


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42652

Reply via email to