diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp b/contrib/llvm-project/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp index 4684d8e4781a..9cf5b257a00a 100644 --- a/contrib/llvm-project/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp +++ b/contrib/llvm-project/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp @@ -10,8 +10,8 @@ // //===----------------------------------------------------------------------===// -#include "Hexagon.h" #include "HexagonISelDAGToDAG.h" +#include "Hexagon.h" #include "HexagonISelLowering.h" #include "HexagonMachineFunctionInfo.h" #include "HexagonTargetMachine.h" @@ -19,6 +19,7 @@ #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/SelectionDAGISel.h" #include "llvm/IR/Intrinsics.h" +#include "llvm/IR/IntrinsicsHexagon.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" using namespace llvm; @@ -915,7 +916,6 @@ SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID, switch (ConstraintID) { default: return true; - case InlineAsm::Constraint_i: case InlineAsm::Constraint_o: // Offsetable. case InlineAsm::Constraint_v: // Not offsetable. case InlineAsm::Constraint_m: // Memory. @@ -1261,7 +1261,7 @@ void HexagonDAGToDAGISel::PreprocessISelDAG() { } void HexagonDAGToDAGISel::EmitFunctionEntryCode() { - auto &HST = static_cast<const HexagonSubtarget&>(MF->getSubtarget()); + auto &HST = MF->getSubtarget<HexagonSubtarget>(); auto &HFI = *HST.getFrameLowering(); if (!HFI.needsAligna(*MF)) return; @@ -1269,12 +1269,23 @@ void HexagonDAGToDAGISel::EmitFunctionEntryCode() { MachineFrameInfo &MFI = MF->getFrameInfo(); MachineBasicBlock *EntryBB = &MF->front(); unsigned AR = FuncInfo->CreateReg(MVT::i32); - unsigned MaxA = MFI.getMaxAlignment(); + unsigned EntryMaxA = MFI.getMaxAlignment(); BuildMI(EntryBB, DebugLoc(), HII->get(Hexagon::PS_aligna), AR) - .addImm(MaxA); + .addImm(EntryMaxA); MF->getInfo<HexagonMachineFunctionInfo>()->setStackAlignBaseVReg(AR); } +void HexagonDAGToDAGISel::updateAligna() { + auto &HFI = *MF->getSubtarget<HexagonSubtarget>().getFrameLowering(); + if (!HFI.needsAligna(*MF)) + return; + auto *AlignaI = const_cast<MachineInstr*>(HFI.getAlignaInstr(*MF)); + assert(AlignaI != nullptr); + unsigned MaxA = MF->getFrameInfo().getMaxAlignment(); + if (AlignaI->getOperand(1).getImm() < MaxA) + AlignaI->getOperand(1).setImm(MaxA); +} + // Match a frame index that can be used in an addressing mode. bool HexagonDAGToDAGISel::SelectAddrFI(SDValue &N, SDValue &R) { if (N.getOpcode() != ISD::FrameIndex) |