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.
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;