[LLVMdev] Disable vectorization for unaligned data

Francois Pichet pichet2000 at gmail.com
Fri Jul 19 13:14:23 PDT 2013


What is the proper solution to disable auto-vectorization for unaligned
data?

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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130719/ec295a09/attachment.html>


More information about the llvm-dev mailing list