From dafd1bd15fd74ab80f6d3535029b55f129deb808 Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Fri, 3 Apr 2020 08:10:59 +0000 Subject: [PATCH] [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 --- docs/GlobalISel/GenericOpcode.rst | 7 ++----- lib/CodeGen/GlobalISel/LegalizerHelper.cpp | 6 +++--- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/docs/GlobalISel/GenericOpcode.rst b/docs/GlobalISel/GenericOpcode.rst index 3110e1fa839..7c418a0c05c 100644 --- a/docs/GlobalISel/GenericOpcode.rst +++ b/docs/GlobalISel/GenericOpcode.rst @@ -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 diff --git a/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/lib/CodeGen/GlobalISel/LegalizerHelper.cpp index bb144480bbd..3c24933921b 100644 --- a/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -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);