diff options
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp | 17 | ||||
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.h | 4 |
2 files changed, 18 insertions, 3 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp index 4684d8e4781..1129f17b872 100644 --- a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp +++ b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp @@ -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) diff --git a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.h b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.h index 65edb09603b..6c77d880335 100644 --- a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.h +++ b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.h @@ -43,6 +43,7 @@ public: HII = HST->getInstrInfo(); HRI = HST->getRegisterInfo(); SelectionDAGISel::runOnMachineFunction(MF); + updateAligna(); return true; } @@ -144,6 +145,9 @@ private: void ppAddrRewriteAndSrl(std::vector<SDNode*> &&Nodes); void ppHoistZextI1(std::vector<SDNode*> &&Nodes); + // Function postprocessing. + void updateAligna(); + SmallDenseMap<SDNode *,int> RootWeights; SmallDenseMap<SDNode *,int> RootHeights; SmallDenseMap<const Value *,int> GAUsesInFunction; |