This is an archive of the discontinued LLVM Phabricator instance.

[ARM] Transform LDMs into writeback form to save code size
ClosedPublic

Authored by jmolloy on May 26 2016, 12:52 PM.

Details

Summary

If we have an LDM that uses only low registers and doesn't write to its base register:

ldm.w r0, {r1, r2, r3}

And that base register is dead after the LDM, then we can convert it to writeback form and use a narrow encoding:

ldm.n r0!, {r1, r2, r3}

Obviously, this introduces a new register write and so can cause WAW hazards, so I've enabled it only in minsize mode. This is a code size trick that ARM Compiler 5 ("armcc") does that we don't.

Diff Detail

Repository
rL LLVM

Event Timeline

jmolloy updated this revision to Diff 58670.May 26 2016, 12:52 PM
jmolloy retitled this revision from to [ARM] Transform LDMs into writeback form to save code size.
jmolloy updated this object.
jmolloy added reviewers: mcrosier, t.p.northover.
jmolloy set the repository for this revision to rL LLVM.
jmolloy added a subscriber: llvm-commits.
mcrosier added inline comments.May 26 2016, 1:07 PM
lib/Target/ARM/ARMLoadStoreOptimizer.cpp
1233

Could we just predicate all/most of this code with optForMinSize()?

// We couldn't find an inc/dec to merge. But if the base is dead, we can still
// change to a writeback form as that will save us 2 bytes of code size. It can
// create WAW hazards though, so only do it if we're minimizing code size.
if (MBB.getParent()->getFunction()->optForMinSize()) {
  bool HighRegsUsed = false;
  for (unsigned i = 2, e = MI->getNumOperands(); i != e; ++i)
    if (MI->getOperand(i).getReg() >= ARM::R8) {
      HighRegsUsed = true;
      break;
    }

  if (BaseKill && MBB.getParent()->getFunction()->optForMinSize() &&
      !HighRegsUsed)
    MergeInstr = MBB.end();
} else
  return false;

Hi Chad,

That makes sense to me. I'll make that change.

James

mcrosier accepted this revision.May 26 2016, 1:41 PM
mcrosier edited edge metadata.

LGTM with nit addressed.

This revision is now accepted and ready to land.May 26 2016, 1:41 PM
mcrosier added inline comments.May 26 2016, 1:45 PM
lib/Target/ARM/ARMLoadStoreOptimizer.cpp
1245

'BaseKill' looks invariant in this code as well, so you could put that in the outer check as well, if I'm not mistaken..

if (BaseKill && MBB.getParent()->getFunction()->optForMinSize()) {

} else
  return false;
jmolloy closed this revision.Jun 7 2016, 4:58 AM

Hi,

Thanks! committed with those changes in r272000.

Cheers,

James