jyknight added a comment.

> The idea here is not to "ignore type alignment".  `EmitPointerWithAlignment` 
> will sometimes return an alignment for a pointer that's less than the 
> alignment of the pointee type, e.g. because you're taking the address of a 
> packed struct field.  The critical question is whether the atomic builtins 
> ought to make an effort to honor that reduced alignment, even if it leads to 
> terrible code, or if we should treat the use of the builtin as a user promise 
> that the pointer is actually more aligned than you might think from the 
> information statically available.

Agreed -- that is the question. In general, I'd like to default to basing 
decisions only on the statically-known alignments, because I think that'll 
typically be the best choice for users. Where there's something like a packed 
struct, it's likely that the values will end up under-aligned in fact, not just 
in the compiler's understanding.

> For example, the MSDN documentation for `InterlockedIncrement` says that it 
> requires 32-bit alignment [...].  I would say that all of the Interlocked 
> APIs ought to be read as guaranteeing the natural, full-width alignment for 
> their operation.

I had missed that it was documented in some of the other functions (beyond 
InterlockedCompareExchange128). I'll change the remainder of the _Interlocked 
APIs to assume at least natural alignment.

> I'm less certain about what to do with the `__atomic_*` builtins

The `__atomic` builtins have already been supporting under-aligned pointers all 
along -- and that behavior is unchanged by this patch.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D97224/new/

https://reviews.llvm.org/D97224

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to