A pointer passed into a function must be suitably aligned or else risks
undefined behavior. Pass this information over to the middle end
optimizers by annotating pointer parameters with 'align' attributes.
Details
Diff Detail
Event Timeline
lib/CodeGen/CGCall.cpp | ||
---|---|---|
1592 | I don't really know anything about ObjC, but just about all of the places in SemaDeclAttr that check for pointer types for relevant attributes check for: Ty->isAnyPointerType() || Ty->isBlockPointerType() So maybe you should check for block pointers too? | |
lib/Headers/avxintrin.h | ||
788 | Are the changes to this file related to the alignment change? |
lib/CodeGen/CGCall.cpp | ||
---|---|---|
1592 | Agreed. It is fine as-is unless someone who does know cares to chime in. | |
lib/Headers/avxintrin.h | ||
788 | Ah, good point. But that's a problem. I'd need to make the same change to lib/Headers/altivec.h, but I don't think I can because it will interfere with the overloading. Even here, we lose type checking ability. I think we may need to add some kind of attribute that can specify these pointers as unaligned (which, coincidentally, is my http://reviews.llvm.org/D4635 currently under review), or we need to make these take pointers to an underaligned type: typedef double unaligned_double __attribute__((aligned(1))); _mm256_loadu_pd(unaligned_double const *__p) Does that work? If not, maybe putting it in a transparent_union will work? Finally, as this change points out, this has the possibility of breaking things. Should we add a flag, akin to -fno-strict-aliasing to disable this feature? |
lib/Headers/avxintrin.h | ||
---|---|---|
788 | I've changed the intrinsics to take underaligned pointers to complete types and I've also added -fno-strict-pointer-alignment to disable this optimization. |
I don't really know anything about ObjC, but just about all of the places in SemaDeclAttr that check for pointer types for relevant attributes check for:
So maybe you should check for block pointers too?