diff options
author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-03-28 14:42:03 +0000 |
---|---|---|
committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-03-28 14:42:03 +0000 |
commit | a34901aae965d3006d528a1487f8a4880ce215e2 (patch) | |
tree | 32dec684f7ecd27ce37086b74dfa74d0c0e7ec2d /llvm/lib | |
parent | d0c11cf7adb0bd2d9fdaca5eba50cd637c8f5ebc (diff) | |
download | bcm5719-llvm-a34901aae965d3006d528a1487f8a4880ce215e2.tar.gz bcm5719-llvm-a34901aae965d3006d528a1487f8a4880ce215e2.zip |
[Hexagon] Speed up frame lowering when no optimizations are enabled
- Do not optimize stack slots in optnone functions.
- Get aligned-base register from HexagonMachineFunctionInfo instead of
looking for ALIGNA instruction in the function's body.
llvm-svn: 264580
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonFrameLowering.cpp | 40 | ||||
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonMachineFunctionInfo.h | 19 |
2 files changed, 35 insertions, 24 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonFrameLowering.cpp b/llvm/lib/Target/Hexagon/HexagonFrameLowering.cpp index acc92405aed..2b7c71c1c97 100644 --- a/llvm/lib/Target/Hexagon/HexagonFrameLowering.cpp +++ b/llvm/lib/Target/Hexagon/HexagonFrameLowering.cpp @@ -287,6 +287,20 @@ namespace { return true; return false; } + + inline bool isOptNone(const MachineFunction &MF) { + return MF.getFunction()->hasFnAttribute(Attribute::OptimizeNone) || + MF.getTarget().getOptLevel() == CodeGenOpt::None; + } + + inline bool isOptSize(const MachineFunction &MF) { + const Function &F = *MF.getFunction(); + return F.optForSize() && !F.optForMinSize(); + } + + inline bool isMinSize(const MachineFunction &MF) { + return MF.getFunction()->optForMinSize(); + } } @@ -864,9 +878,8 @@ int HexagonFrameLowering::getFrameIndexReference(const MachineFunction &MF, bool NoOpt = MF.getTarget().getOptLevel() == CodeGenOpt::None; unsigned SP = HRI.getStackRegister(), FP = HRI.getFrameRegister(); - unsigned AP = 0; - if (const MachineInstr *AI = getAlignaInstr(MF)) - AP = AI->getOperand(0).getReg(); + auto &HMFI = *MF.getInfo<HexagonMachineFunctionInfo>(); + unsigned AP = HMFI.getStackAlignBasePhysReg(); unsigned FrameSize = MFI.getStackSize(); bool UseFP = false, UseAP = false; // Default: use SP (except at -O0). @@ -1089,6 +1102,13 @@ void HexagonFrameLowering::processFunctionBeforeFrameFinalized( if (A == 0) MFI->setLocalFrameMaxAlign(8); MFI->setUseLocalStackAllocationBlock(true); + + // Set the physical aligned-stack base address register. + unsigned AP = 0; + if (const MachineInstr *AI = getAlignaInstr(MF)) + AP = AI->getOperand(0).getReg(); + auto &HMFI = *MF.getInfo<HexagonMachineFunctionInfo>(); + HMFI.setStackAlignBasePhysReg(AP); } /// Returns true if there is no caller saved registers available. @@ -1680,7 +1700,7 @@ void HexagonFrameLowering::determineCalleeSaves(MachineFunction &MF, // Replace predicate register pseudo spill code. SmallVector<unsigned,8> NewRegs; expandSpillMacros(MF, NewRegs); - if (OptimizeSpillSlots) + if (OptimizeSpillSlots && !isOptNone(MF)) optimizeSpillSlots(MF, NewRegs); // We need to reserve a a spill slot if scavenging could potentially require @@ -2145,18 +2165,6 @@ const MachineInstr *HexagonFrameLowering::getAlignaInstr( } -// FIXME: Use Function::optForSize(). -inline static bool isOptSize(const MachineFunction &MF) { - AttributeSet AF = MF.getFunction()->getAttributes(); - return AF.hasAttribute(AttributeSet::FunctionIndex, - Attribute::OptimizeForSize); -} - -inline static bool isMinSize(const MachineFunction &MF) { - return MF.getFunction()->optForMinSize(); -} - - /// Determine whether the callee-saved register saves and restores should /// be generated via inline code. If this function returns "true", inline /// code will be generated. If this function returns "false", additional diff --git a/llvm/lib/Target/Hexagon/HexagonMachineFunctionInfo.h b/llvm/lib/Target/Hexagon/HexagonMachineFunctionInfo.h index 76723586c66..26c5b63fec6 100644 --- a/llvm/lib/Target/Hexagon/HexagonMachineFunctionInfo.h +++ b/llvm/lib/Target/Hexagon/HexagonMachineFunctionInfo.h @@ -27,7 +27,8 @@ class HexagonMachineFunctionInfo : public MachineFunctionInfo { // returning the value of the returned struct in a register. This field // holds the virtual register into which the sret argument is passed. unsigned SRetReturnReg; - unsigned StackAlignBaseReg; + unsigned StackAlignBaseVReg; // Aligned-stack base register (virtual) + unsigned StackAlignBasePhysReg; // (physical) std::vector<MachineInstr*> AllocaAdjustInsts; int VarArgsFrameIndex; bool HasClobberLR; @@ -36,13 +37,12 @@ class HexagonMachineFunctionInfo : public MachineFunctionInfo { virtual void anchor(); public: - HexagonMachineFunctionInfo() : SRetReturnReg(0), StackAlignBaseReg(0), - HasClobberLR(0), HasEHReturn(false) {} + HexagonMachineFunctionInfo() : SRetReturnReg(0), StackAlignBaseVReg(0), + StackAlignBasePhysReg(0), HasClobberLR(0), HasEHReturn(false) {} HexagonMachineFunctionInfo(MachineFunction &MF) : SRetReturnReg(0), - StackAlignBaseReg(0), - HasClobberLR(0), - HasEHReturn(false) {} + StackAlignBaseVReg(0), StackAlignBasePhysReg(0), HasClobberLR(0), + HasEHReturn(false) {} unsigned getSRetReturnReg() const { return SRetReturnReg; } void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; } @@ -77,8 +77,11 @@ public: bool hasEHReturn() const { return HasEHReturn; }; void setHasEHReturn(bool H = true) { HasEHReturn = H; }; - void setStackAlignBaseVReg(unsigned R) { StackAlignBaseReg = R; } - unsigned getStackAlignBaseVReg() const { return StackAlignBaseReg; } + void setStackAlignBaseVReg(unsigned R) { StackAlignBaseVReg = R; } + unsigned getStackAlignBaseVReg() const { return StackAlignBaseVReg; } + + void setStackAlignBasePhysReg(unsigned R) { StackAlignBasePhysReg = R; } + unsigned getStackAlignBasePhysReg() const { return StackAlignBasePhysReg; } }; } // End llvm namespace |