forked from OSchip/llvm-project
[AArch64] Allocate the modified and used regs only once per function.
llvm-svn: 259510
This commit is contained in:
parent
8e18fe6e54
commit
bba881ef3d
|
@ -88,6 +88,9 @@ struct AArch64LoadStoreOpt : public MachineFunctionPass {
|
|||
const TargetRegisterInfo *TRI;
|
||||
const AArch64Subtarget *Subtarget;
|
||||
|
||||
// Track which registers have been modified and used.
|
||||
BitVector ModifiedRegs, UsedRegs;
|
||||
|
||||
// Scan the instructions looking for a load/store that can be combined
|
||||
// with the current instruction into a load/store pair.
|
||||
// Return the matching instruction if one is found, else MBB->end().
|
||||
|
@ -1015,9 +1018,8 @@ bool AArch64LoadStoreOpt::findMatchingStore(
|
|||
|
||||
// Track which registers have been modified and used between the first insn
|
||||
// and the second insn.
|
||||
BitVector ModifiedRegs, UsedRegs;
|
||||
ModifiedRegs.resize(TRI->getNumRegs());
|
||||
UsedRegs.resize(TRI->getNumRegs());
|
||||
ModifiedRegs.reset();
|
||||
UsedRegs.reset();
|
||||
|
||||
for (unsigned Count = 0; MBBI != E && Count < Limit;) {
|
||||
--MBBI;
|
||||
|
@ -1096,9 +1098,8 @@ AArch64LoadStoreOpt::findMatchingInsn(MachineBasicBlock::iterator I,
|
|||
|
||||
// Track which registers have been modified and used between the first insn
|
||||
// (inclusive) and the second insn.
|
||||
BitVector ModifiedRegs, UsedRegs;
|
||||
ModifiedRegs.resize(TRI->getNumRegs());
|
||||
UsedRegs.resize(TRI->getNumRegs());
|
||||
ModifiedRegs.reset();
|
||||
UsedRegs.reset();
|
||||
|
||||
// Remember any instructions that read/write memory between FirstMI and MI.
|
||||
SmallVector<MachineInstr *, 4> MemInsns;
|
||||
|
@ -1378,9 +1379,8 @@ MachineBasicBlock::iterator AArch64LoadStoreOpt::findMatchingUpdateInsnForward(
|
|||
|
||||
// Track which registers have been modified and used between the first insn
|
||||
// (inclusive) and the second insn.
|
||||
BitVector ModifiedRegs, UsedRegs;
|
||||
ModifiedRegs.resize(TRI->getNumRegs());
|
||||
UsedRegs.resize(TRI->getNumRegs());
|
||||
ModifiedRegs.reset();
|
||||
UsedRegs.reset();
|
||||
++MBBI;
|
||||
for (; MBBI != E; ++MBBI) {
|
||||
MachineInstr *MI = MBBI;
|
||||
|
@ -1428,9 +1428,8 @@ MachineBasicBlock::iterator AArch64LoadStoreOpt::findMatchingUpdateInsnBackward(
|
|||
|
||||
// Track which registers have been modified and used between the first insn
|
||||
// (inclusive) and the second insn.
|
||||
BitVector ModifiedRegs, UsedRegs;
|
||||
ModifiedRegs.resize(TRI->getNumRegs());
|
||||
UsedRegs.resize(TRI->getNumRegs());
|
||||
ModifiedRegs.reset();
|
||||
UsedRegs.reset();
|
||||
--MBBI;
|
||||
for (; MBBI != B; --MBBI) {
|
||||
MachineInstr *MI = MBBI;
|
||||
|
@ -1784,6 +1783,12 @@ bool AArch64LoadStoreOpt::runOnMachineFunction(MachineFunction &Fn) {
|
|||
TII = static_cast<const AArch64InstrInfo *>(Subtarget->getInstrInfo());
|
||||
TRI = Subtarget->getRegisterInfo();
|
||||
|
||||
// Resize the modified and used register bitfield trackers. We do this once
|
||||
// per function and then clear the bitfield each time we optimize a load or
|
||||
// store.
|
||||
ModifiedRegs.resize(TRI->getNumRegs());
|
||||
UsedRegs.resize(TRI->getNumRegs());
|
||||
|
||||
bool Modified = false;
|
||||
bool enableNarrowLdOpt = enableNarrowLdMerge(Fn);
|
||||
for (auto &MBB : Fn)
|
||||
|
|
Loading…
Reference in New Issue