[NFC] G_DYN_STACKALLOC realign iff align > 1, update documentation

Summary: I think it would be better to require the alignment to be >= 1. It is currently confusing to allow both values.

Reviewers: courbet

Subscribers: hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D77372
This commit is contained in:
Guillaume Chatelet 2020-04-03 08:10:59 +00:00
parent fadb1a3c1f
commit dafd1bd15f
2 changed files with 5 additions and 8 deletions

View File

@ -672,12 +672,9 @@ Other Operations
G_DYN_STACKALLOC
^^^^^^^^^^^^^^^^
Dynamically realign the stack pointer to the specified alignment
Dynamically realigns the stack pointer to the specified size and alignment.
An alignment value of `0` or `1` mean no specific alignment.
.. code-block:: none
%8:_(p0) = G_DYN_STACKALLOC %7(s64), 32
.. caution::
What does it mean for the immediate to be 0? It happens in the tests

View File

@ -4891,7 +4891,7 @@ LegalizerHelper::LegalizeResult
LegalizerHelper::lowerDynStackAlloc(MachineInstr &MI) {
Register Dst = MI.getOperand(0).getReg();
Register AllocSize = MI.getOperand(1).getReg();
unsigned Align = MI.getOperand(2).getImm();
Align Alignment = assumeAligned(MI.getOperand(2).getImm());
const auto &MF = *MI.getMF();
const auto &TLI = *MF.getSubtarget().getTargetLowering();
@ -4907,8 +4907,8 @@ LegalizerHelper::lowerDynStackAlloc(MachineInstr &MI) {
// have to generate an extra instruction to negate the alloc and then use
// G_PTR_ADD to add the negative offset.
auto Alloc = MIRBuilder.buildSub(IntPtrTy, SPTmp, AllocSize);
if (Align) {
APInt AlignMask(IntPtrTy.getSizeInBits(), Align, true);
if (Alignment > Align(1)) {
APInt AlignMask(IntPtrTy.getSizeInBits(), Alignment.value(), true);
AlignMask.negate();
auto AlignCst = MIRBuilder.buildConstant(IntPtrTy, AlignMask);
Alloc = MIRBuilder.buildAnd(IntPtrTy, Alloc, AlignCst);