[LLVMdev] Limit loop vectorizer to SSE
Hal Finkel
hfinkel at anl.gov
Fri Nov 15 14:12:17 PST 2013
----- Original Message -----
> From: "Arnold Schwaighofer" <aschwaighofer at apple.com>
> To: "Joshua Klontz" <josh.klontz at gmail.com>
> Cc: "LLVM Dev" <llvmdev at cs.uiuc.edu>
> Sent: Friday, November 15, 2013 4:05:53 PM
> Subject: Re: [LLVMdev] Limit loop vectorizer to SSE
>
>
> Something like:
>
> index 6db7f68..68564cb 100644
> --- a/lib/Transforms/Vectorize/LoopVectorize.cpp
> +++ b/lib/Transforms/Vectorize/LoopVectorize.cpp
> @@ -1208,6 +1208,8 @@ void
> InnerLoopVectorizer::vectorizeMemoryInstruction(Instr
> Type *DataTy = VectorType::get(ScalarDataTy, VF);
> Value *Ptr = LI ? LI->getPointerOperand() :
> SI->getPointerOperand();
> unsigned Alignment = LI ? LI->getAlignment() : SI->getAlignment();
> + if (Alignment == 0)
> + Alignment = 1;
That may be conservatively correct, but I don't think it is really right. An alignment of 0 is supposed to mean the platform default alignment (IIRC, DataLayout::getPrefTypeAlignment tells you what it is).
-Hal
> unsigned AddressSpace = Ptr->getType()->getPointerAddressSpace();
> unsigned ScalarAllocatedSize = DL->getTypeAllocSize(ScalarDataTy);
> unsigned VectorElementSize = DL->getTypeStoreSize(DataTy)/VF;
>
> Should fix this.
>
> On Nov 15, 2013, at 3:49 PM, Joshua Klontz <josh.klontz at gmail.com>
> wrote:
>
> > Nadav,
> >
> > I believe aligned accesses to unaligned pointers is precisely the
> > issue. Consider the function `add_u8S` before[1] and after[2] the
> > loop vectorizer pass. There is no alignment assumption associated
> > with %kernel_data prior to vectorization. I can't tell if it's the
> > loop vectorizer or the codegen at fault, but the alignment
> > assumption seems to sneak in somewhere.
> >
> > v/r,
> > Josh
> >
> > [1] http://pastebin.com/kc95WtGG
> > [2] http://pastebin.com/VY3ZLVJK
> >
> >
> > On Fri, Nov 15, 2013 at 3:58 PM, Nadav Rotem <nrotem at apple.com>
> > wrote:
> >
> > On Nov 15, 2013, at 12:36 PM, Renato Golin
> > <renato.golin at linaro.org> wrote:
> >
> >> On 15 November 2013 20:24, Joshua Klontz <josh.klontz at gmail.com>
> >> wrote:
> >> Agreed, is there a pass that will insert a runtime alignment
> >> check? Also, what's the easiest way to get at
> >> TargetTransformInfo::getRegisterBitWidth() so I don't have to
> >> hard code 32? Thanks!
> >>
> >> I think that's a fair question, and it's about safety. If you're
> >> getting this on the JIT, means we may be generating unsafe
> >> transformations on the vectorizer.
> >>
> >> Arnold, Nadav, I don't remember seeing code to generate any
> >> run-time alignment checks on the incoming pointer, is there such
> >> a thing? If not, shouldn't we add one?
> >
> >
> > If the the vectorizer generates aligned memory accesses to
> > unaligned addresses then this is a serious bug. But I don’t think
> > that Josh said that the vectorizer generated aligned accesses to
> > unaligned pointers.
> >
> > There is no point in LLVM checking for alignment because if the
> > memory is unaligned then the program will crash. Users who want
> > to crash with a readable error message can simply write code that
> > checks the pointer (by masking the high bits and comparing to
> > zero).
> >
> >
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
More information about the llvm-dev
mailing list