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