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 | |
| parent | 6ada31c2a686eb7647134c910e716b6a3509d64d (diff) | |
| download | bcm5719-llvm-30a02384f7b8dc07479e5df16ddf93056750062a.tar.gz bcm5719-llvm-30a02384f7b8dc07479e5df16ddf93056750062a.zip | |
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')
| -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 8a4df422294..14a2d0800a5 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. | 

