[LLVMdev] Disable vectorization for unaligned data

Eli Friedman eli.friedman at gmail.com
Fri Jul 19 13:32:50 PDT 2013


On Fri, Jul 19, 2013 at 1:14 PM, Francois Pichet <pichet2000 at gmail.com> wrote:
>
> What is the proper solution to disable auto-vectorization for unaligned
> data?

Why are you trying to do this?  If auto-vectorization is making a
given loop slower on your target, that means the cost metrics are off,
and we should fix them.  If code size is an issue, you should tell the
optimizer that you want to optimize for size.

-Eli

> I have an out of tree target and I added this:
>
> bool OpusTargetLowering::allowsUnalignedMemoryAccesses(EVT VT, bool *Fast)
> const {
>   if (VT.isVector())
>     return false;
> ....
> }
>
> After that, I could see that vectorization is still done on unaligned data
> except that llvm will copy the data back and forth from the source to the
> top of the stack and work from there. This is very costly, I rather get
> scalar operations.
>
> Then I tried to add:
>   unsigned getMemoryOpCost(unsigned Opcode, Type *Src,
>                            unsigned Alignment,
>                            unsigned AddressSpace) const {
>     if (Src->isVectorTy() && Alignment != 16)
>       return 10000; // <== high number to try to avoid unaligned load/store.
>     return TargetTransformInfo::getMemoryOpCost(Opcode, Src, Alignment,
> AddressSpace);
>   }
>
> Except that this doesn't work because Alignment will always be 4 even for
> data like:
>        int   data[16][16] __attribute__ ((aligned (16))),
>
> Because individual element are still 4-byte aligned.
>
> I am not sure what is the right way to do it?
> Thanks.
>
>
> _______________________________________________
> 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