mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-20 00:20:11 +00:00
Preserve MachineMemOperands in ARMLoadStoreOptimizer.
Fixes PR8113. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@144409 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -32,6 +32,7 @@
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
@@ -1504,6 +1505,23 @@ static bool IsSafeAndProfitableToMove(bool isLd, unsigned Base,
|
||||
return AddedRegPressure.size() <= MemRegs.size() * 2;
|
||||
}
|
||||
|
||||
|
||||
/// Copy Op0 and Op1 operands into a new array assigned to MI.
|
||||
static void concatenateMemOperands(MachineInstr *MI, MachineInstr *Op0,
|
||||
MachineInstr *Op1) {
|
||||
assert(MI->memoperands_empty() && "expected a new machineinstr");
|
||||
size_t numMemRefs = (Op0->memoperands_end() - Op0->memoperands_begin())
|
||||
+ (Op1->memoperands_end() - Op1->memoperands_begin());
|
||||
|
||||
MachineFunction *MF = MI->getParent()->getParent();
|
||||
MachineSDNode::mmo_iterator MemBegin = MF->allocateMemRefsArray(numMemRefs);
|
||||
MachineSDNode::mmo_iterator MemEnd =
|
||||
std::copy(Op0->memoperands_begin(), Op0->memoperands_end(), MemBegin);
|
||||
MemEnd =
|
||||
std::copy(Op1->memoperands_begin(), Op1->memoperands_end(), MemEnd);
|
||||
MI->setMemRefs(MemBegin, MemEnd);
|
||||
}
|
||||
|
||||
bool
|
||||
ARMPreAllocLoadStoreOpt::CanFormLdStDWord(MachineInstr *Op0, MachineInstr *Op1,
|
||||
DebugLoc &dl,
|
||||
@@ -1698,6 +1716,8 @@ bool ARMPreAllocLoadStoreOpt::RescheduleOps(MachineBasicBlock *MBB,
|
||||
if (!isT2)
|
||||
MIB.addReg(0);
|
||||
MIB.addImm(Offset).addImm(Pred).addReg(PredReg);
|
||||
concatenateMemOperands(MIB, Op0, Op1);
|
||||
DEBUG(dbgs() << "Formed " << *MIB << "\n");
|
||||
++NumLDRDFormed;
|
||||
} else {
|
||||
MachineInstrBuilder MIB = BuildMI(*MBB, InsertPos, dl, MCID)
|
||||
@@ -1710,6 +1730,8 @@ bool ARMPreAllocLoadStoreOpt::RescheduleOps(MachineBasicBlock *MBB,
|
||||
if (!isT2)
|
||||
MIB.addReg(0);
|
||||
MIB.addImm(Offset).addImm(Pred).addReg(PredReg);
|
||||
concatenateMemOperands(MIB, Op0, Op1);
|
||||
DEBUG(dbgs() << "Formed " << *MIB << "\n");
|
||||
++NumSTRDFormed;
|
||||
}
|
||||
MBB->erase(Op0);
|
||||
|
||||
Reference in New Issue
Block a user