mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +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:
parent
ce485e7f70
commit
95bc85e4ee
@ -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);
|
||||
|
15
test/CodeGen/ARM/ldrd-memoper.ll
Normal file
15
test/CodeGen/ARM/ldrd-memoper.ll
Normal file
@ -0,0 +1,15 @@
|
||||
; RUN: llc %s -o /dev/null -mtriple=thumbv7-apple-ios -mcpu=cortex-a8 -debug-only=arm-ldst-opt 2> %t
|
||||
; RUN: FileCheck %s < %t
|
||||
; REQUIRES: asserts
|
||||
; PR8113: ARMLoadStoreOptimizer must preserve memoperands.
|
||||
|
||||
@b = external global i64*
|
||||
|
||||
; CHECK: Formed {{.*}} t2LDRD{{.*}} mem:LD4[%0] LD4[%0+4]
|
||||
define i64 @t(i64 %a) nounwind readonly {
|
||||
entry:
|
||||
%0 = load i64** @b, align 4
|
||||
%1 = load i64* %0, align 4
|
||||
%2 = mul i64 %1, %a
|
||||
ret i64 %2
|
||||
}
|
Loading…
Reference in New Issue
Block a user