<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Apr 15, 2021 at 12:58 PM Reid Kleckner <<a href="mailto:rnk@google.com">rnk@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">On Wed, Apr 14, 2021 at 11:58 AM James Y Knight via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>What I suspect you <i>actually</i> want here is an option to tell Clang not to infer load/store alignments based on object types or alignment attributes -- instead treating everything as being potentially aligned to 1 unless the allocation is seen (e.g. global/local variables). Clang would still need to use the usual alignment computation for variable definitions and structure layout, but not memory operations. If clang emits "load ... align 1" instructions in LLVM IR, the right thing would then happen in the X86 backend automatically.</div></div></blockquote><div><br></div><div>This sounds like the -fmax-type-align flag:</div><div><a href="https://clang.llvm.org/docs/UsersManual.html#controlling-code-generation" target="_blank">https://clang.llvm.org/docs/UsersManual.html#controlling-code-generation</a><br></div><div>Explicit alignment attributes are still honored, so some aligned vector instructions may be generated. However, the documentation describes essentially this exact use case.</div></div></div></blockquote><div><br></div><div>Wow, thanks! Somehow I've missed that this flag has existed all this time. ISTM that it would be reasonable to modify -fmax-type-align to override even an explicit alignment attribute on the type (or typedef).</div><div><br></div><div>It looks like -fmax-type-align is barely used in the wild, except that -fmax-type-align=16 is _default_ for Darwin platforms (since commit <a href="https://github.com/llvm/llvm-project/commit/bcd82afad64a22b15000de350d075b10f2de273a">bcd82afad64a22b15000de350d075b10f2de273a</a>). It's unclear to me what purpose that default is really serving, however, given that the only types with greater "native" alignment than 16 are vector types, and typically used vector typedefs already have an alignment specified, such as `typedef float __m256 __attribute__ ((__vector_size__ (32), __aligned__(32)));`. So the most-commonly-used vector types are exempted from the effect of the flag, anyways...</div><div><br></div><div></div></div></div>