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