<div dir="ltr">Alignment in LLVM is currently represented with an `unsigned`, sometimes an `uint32_t`, `uint64_t` or `uint16_t`.<br>FWIU the value has the following possible semantics:<br> - 0 means alignment is unknown,<br> - 1 means no alignment requirement,<br> - a power of two means a required alignment in bytes.<br><br>Using `unsigned` throughout the codebase has several disadvantages:<br> - comparing alignments may compare different things, what does `A < B` or `std::min(A, B)` mean when A or B are allowed to be 0?<br> - integer promotion can kick in and turn a `bool` in an alignment when calling a function (1)<br> - masking may lead to incorrect result when value is 0 (2)<br> - integer promotion leads to not obviously correct code in the presence of signed and unsigned values (3)<br> - dividing an alignment by 2 can change the associated semantic from `unaligned` to `unknown alignment` (4)<br> - developers have to be defensive to make sure assumptions hold (5)<br> - checking that an offset is aligned is sometimes done backward `Alignment % Offset == 0` instead of `Offset % Alignment == 0` (6) (7)<br> - MachineConstantPoolEntry::Alignment encodes special information in its topmost bit (8) but `AsmPrinter::GetCPISymbol` seems to use it directly (9) instead of calling `getAlignment()` (10)<br><br>I have a patch to introduce alignment object in LLVM.<br>This patch does not fix the code but replaces the unsigned value by a type so it's easier to introduce proper semantic later on.<br><br>The patch (11) is too big to be sent to Phabricator, arc diff complains about server's `post_max_size` being too small.<br><br>I would like to seek guidance from the community:<br> - Is this patch worthwhile?<br> - If so, how should it be reviewed? Should it be split?<br><br>-- Guillaume<br>PS: If you intend to have a look at it you should start with `llvm/include/llvm/Support/Alignment.h`<br><br>1 - <a href="https://github.com/llvm/llvm-project/blob/b725d27350ffdda9e8e9144668ad54c922297f59/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp#L2593">https://github.com/llvm/llvm-project/blob/b725d27350ffdda9e8e9144668ad54c922297f59/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp#L2593</a><br>2 - <a href="https://github.com/llvm/llvm-project/blob/b725d27350ffdda9e8e9144668ad54c922297f59/llvm/lib/CodeGen/SafeStack.cpp#L545">https://github.com/llvm/llvm-project/blob/b725d27350ffdda9e8e9144668ad54c922297f59/llvm/lib/CodeGen/SafeStack.cpp#L545</a><br>3 - <a href="https://github.com/llvm/llvm-project/blob/b725d27350ffdda9e8e9144668ad54c922297f59/llvm/lib/Target/Hexagon/HexagonFrameLowering.cpp#L1533">https://github.com/llvm/llvm-project/blob/b725d27350ffdda9e8e9144668ad54c922297f59/llvm/lib/Target/Hexagon/HexagonFrameLowering.cpp#L1533</a><br>4 - <a href="https://github.com/llvm/llvm-project/blob/b725d27350ffdda9e8e9144668ad54c922297f59/llvm/lib/CodeGen/CodeGenPrepare.cpp#L6751">https://github.com/llvm/llvm-project/blob/b725d27350ffdda9e8e9144668ad54c922297f59/llvm/lib/CodeGen/CodeGenPrepare.cpp#L6751</a><br>5 - <a href="https://github.com/llvm/llvm-project/blob/d0307f93a7658e6d0eef1ffd0b0ed4f1506bfc13/llvm/include/llvm/Analysis/VectorUtils.h#L278">https://github.com/llvm/llvm-project/blob/d0307f93a7658e6d0eef1ffd0b0ed4f1506bfc13/llvm/include/llvm/Analysis/VectorUtils.h#L278</a><br>6 - <a href="https://github.com/llvm/llvm-project/blob/fafec5155e39f5dad098376c1beb4a56604aa655/llvm/lib/Target/ARM/ARMCallingConv.cpp#L207">https://github.com/llvm/llvm-project/blob/fafec5155e39f5dad098376c1beb4a56604aa655/llvm/lib/Target/ARM/ARMCallingConv.cpp#L207</a><br>7 - <a href="https://github.com/llvm/llvm-project/blob/d0307f93a7658e6d0eef1ffd0b0ed4f1506bfc13/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp#L563">https://github.com/llvm/llvm-project/blob/d0307f93a7658e6d0eef1ffd0b0ed4f1506bfc13/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp#L563</a><br>8 - <a href="https://github.com/llvm/llvm-project/blob/7eeb82b58554163962d2696ce9be7d021d5b25d4/llvm/include/llvm/CodeGen/MachineConstantPool.h#L76">https://github.com/llvm/llvm-project/blob/7eeb82b58554163962d2696ce9be7d021d5b25d4/llvm/include/llvm/CodeGen/MachineConstantPool.h#L76</a><br>9 - <a href="https://github.com/llvm/llvm-project/blob/7eeb82b58554163962d2696ce9be7d021d5b25d4/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp#L2809">https://github.com/llvm/llvm-project/blob/7eeb82b58554163962d2696ce9be7d021d5b25d4/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp#L2809</a><br>10 - <a href="https://github.com/llvm/llvm-project/blob/7eeb82b58554163962d2696ce9be7d021d5b25d4/llvm/include/llvm/CodeGen/MachineConstantPool.h#L96">https://github.com/llvm/llvm-project/blob/7eeb82b58554163962d2696ce9be7d021d5b25d4/llvm/include/llvm/CodeGen/MachineConstantPool.h#L96</a><br><div>11 - <a href="https://drive.google.com/file/d/1PgrEuNjIcSH9hOs6REe9FedCH5mf43Q9/view?usp=sharing">https://drive.google.com/file/d/1PgrEuNjIcSH9hOs6REe9FedCH5mf43Q9/view?usp=sharing</a></div></div>