diff options
| author | Zia Ansari <zia.ansari@intel.com> | 2016-02-15 23:44:13 +0000 |
|---|---|---|
| committer | Zia Ansari <zia.ansari@intel.com> | 2016-02-15 23:44:13 +0000 |
| commit | 30a02384f7b8dc07479e5df16ddf93056750062a (patch) | |
| tree | ee790c2bf4956042cce138820f70d869df6ca717 /llvm/lib/CodeGen/PrologEpilogInserter.cpp | |
| parent | 6ada31c2a686eb7647134c910e716b6a3509d64d (diff) | |
| download | llvm-30a02384f7b8dc07479e5df16ddf93056750062a.zip llvm-30a02384f7b8dc07479e5df16ddf93056750062a.tar.gz llvm-30a02384f7b8dc07479e5df16ddf93056750062a.tar.bz2 | |
Implemented stack symbol table ordering/packing optimization to improve data locality and code size from SP/FP offset encoding.
Differential Revision: http://reviews.llvm.org/D15393
llvm-svn: 260917
Diffstat (limited to 'llvm/lib/CodeGen/PrologEpilogInserter.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/PrologEpilogInserter.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/llvm/lib/CodeGen/PrologEpilogInserter.cpp index 8a4df42..14a2d08 100644 --- a/llvm/lib/CodeGen/PrologEpilogInserter.cpp +++ b/llvm/lib/CodeGen/PrologEpilogInserter.cpp @@ -707,8 +707,10 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) { Offset, MaxAlign, Skew); } - // Then assign frame offsets to stack objects that are not used to spill - // callee saved registers. + SmallVector<int, 8> ObjectsToAllocate; + + // Then prepare to assign frame offsets to stack objects that are not used to + // spill callee saved registers. for (unsigned i = 0, e = MFI->getObjectIndexEnd(); i != e; ++i) { if (MFI->isObjectPreAllocated(i) && MFI->getUseLocalStackAllocationBlock()) @@ -724,8 +726,17 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) { if (ProtectedObjs.count(i)) continue; - AdjustStackOffset(MFI, i, StackGrowsDown, Offset, MaxAlign, Skew); + // Add the objects that we need to allocate to our working set. + ObjectsToAllocate.push_back(i); } + // Give the targets a chance to order the objects the way they like it. + if (Fn.getTarget().getOptLevel() != CodeGenOpt::None && + Fn.getTarget().Options.StackSymbolOrdering) + TFI.orderFrameObjects(Fn, ObjectsToAllocate); + + // Now walk the objects and actually assign base offsets to them. + for (auto &Object : ObjectsToAllocate) + AdjustStackOffset(MFI, Object, StackGrowsDown, Offset, MaxAlign, Skew); // Make sure the special register scavenging spill slot is closest to the // stack pointer. |
