forked from OSchip/llvm-project
Refactor code. Fix a potential missing check. Teach isIdentical() about tLDRpci_pic.
llvm-svn: 86330
This commit is contained in:
parent
ae3361de2d
commit
a8e8a7c976
|
@ -14,11 +14,13 @@
|
|||
#include "ARMBaseInstrInfo.h"
|
||||
#include "ARM.h"
|
||||
#include "ARMAddressingModes.h"
|
||||
#include "ARMConstantPoolValue.h"
|
||||
#include "ARMGenInstrInfo.inc"
|
||||
#include "ARMMachineFunctionInfo.h"
|
||||
#include "ARMRegisterInfo.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/CodeGen/LiveVariables.h"
|
||||
#include "llvm/CodeGen/MachineConstantPool.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/CodeGen/MachineJumpTableInfo.h"
|
||||
|
@ -895,6 +897,37 @@ ARMBaseInstrInfo::canFoldMemoryOperand(const MachineInstr *MI,
|
|||
return false;
|
||||
}
|
||||
|
||||
bool ARMBaseInstrInfo::isIdentical(const MachineInstr *MI0,
|
||||
const MachineInstr *MI1,
|
||||
const MachineRegisterInfo *MRI) const {
|
||||
int Opcode = MI0->getOpcode();
|
||||
if (Opcode == ARM::t2LDRpci_pic || Opcode == ARM::tLDRpci_pic) {
|
||||
if (MI1->getOpcode() != Opcode)
|
||||
return false;
|
||||
if (MI0->getNumOperands() != MI1->getNumOperands())
|
||||
return false;
|
||||
|
||||
const MachineOperand &MO0 = MI0->getOperand(1);
|
||||
const MachineOperand &MO1 = MI1->getOperand(1);
|
||||
if (MO0.getOffset() != MO1.getOffset())
|
||||
return false;
|
||||
|
||||
const MachineFunction *MF = MI0->getParent()->getParent();
|
||||
const MachineConstantPool *MCP = MF->getConstantPool();
|
||||
int CPI0 = MO0.getIndex();
|
||||
int CPI1 = MO1.getIndex();
|
||||
const MachineConstantPoolEntry &MCPE0 = MCP->getConstants()[CPI0];
|
||||
const MachineConstantPoolEntry &MCPE1 = MCP->getConstants()[CPI1];
|
||||
ARMConstantPoolValue *ACPV0 =
|
||||
static_cast<ARMConstantPoolValue*>(MCPE0.Val.MachineCPVal);
|
||||
ARMConstantPoolValue *ACPV1 =
|
||||
static_cast<ARMConstantPoolValue*>(MCPE1.Val.MachineCPVal);
|
||||
return ACPV0->hasSameValue(ACPV1);
|
||||
}
|
||||
|
||||
return TargetInstrInfoImpl::isIdentical(MI0, MI1, MRI);
|
||||
}
|
||||
|
||||
/// getInstrPredicate - If instruction is predicated, returns its predicate
|
||||
/// condition, otherwise returns AL. It also returns the condition code
|
||||
/// register by reference.
|
||||
|
|
|
@ -263,6 +263,9 @@ public:
|
|||
MachineInstr* MI,
|
||||
const SmallVectorImpl<unsigned> &Ops,
|
||||
MachineInstr* LoadMI) const;
|
||||
|
||||
virtual bool isIdentical(const MachineInstr *MI, const MachineInstr *Other,
|
||||
const MachineRegisterInfo *MRI) const;
|
||||
};
|
||||
|
||||
static inline
|
||||
|
|
|
@ -591,3 +591,8 @@ http://lists.cs.uiuc.edu/pipermail/llvmdev/2009-June/022763.html
|
|||
//===---------------------------------------------------------------------===//
|
||||
|
||||
Make use of the "rbit" instruction.
|
||||
|
||||
//===---------------------------------------------------------------------===//
|
||||
|
||||
Take a look at test/CodeGen/Thumb2/machine-licm.ll. ARM should be taught how
|
||||
to licm and cse the unnecessary load from cp#1.
|
||||
|
|
|
@ -175,32 +175,6 @@ void Thumb2InstrInfo::reMaterialize(MachineBasicBlock &MBB,
|
|||
NewMI->getOperand(0).setSubReg(SubIdx);
|
||||
}
|
||||
|
||||
bool Thumb2InstrInfo::isIdentical(const MachineInstr *MI0,
|
||||
const MachineInstr *MI1,
|
||||
const MachineRegisterInfo *MRI) const {
|
||||
unsigned Opcode = MI0->getOpcode();
|
||||
if (Opcode == ARM::t2LDRpci_pic) {
|
||||
const MachineOperand &MO0 = MI0->getOperand(1);
|
||||
const MachineOperand &MO1 = MI1->getOperand(1);
|
||||
if (MO0.getOffset() != MO1.getOffset())
|
||||
return false;
|
||||
|
||||
const MachineFunction *MF = MI0->getParent()->getParent();
|
||||
const MachineConstantPool *MCP = MF->getConstantPool();
|
||||
int CPI0 = MO0.getIndex();
|
||||
int CPI1 = MO1.getIndex();
|
||||
const MachineConstantPoolEntry &MCPE0 = MCP->getConstants()[CPI0];
|
||||
const MachineConstantPoolEntry &MCPE1 = MCP->getConstants()[CPI1];
|
||||
ARMConstantPoolValue *ACPV0 =
|
||||
static_cast<ARMConstantPoolValue*>(MCPE0.Val.MachineCPVal);
|
||||
ARMConstantPoolValue *ACPV1 =
|
||||
static_cast<ARMConstantPoolValue*>(MCPE1.Val.MachineCPVal);
|
||||
return ACPV0->hasSameValue(ACPV1);
|
||||
}
|
||||
|
||||
return TargetInstrInfoImpl::isIdentical(MI0, MI1, MRI);
|
||||
}
|
||||
|
||||
void llvm::emitT2RegPlusImmediate(MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator &MBBI, DebugLoc dl,
|
||||
unsigned DestReg, unsigned BaseReg, int NumBytes,
|
||||
|
|
|
@ -54,10 +54,6 @@ public:
|
|||
unsigned DestReg, unsigned SubIdx,
|
||||
const MachineInstr *Orig) const;
|
||||
|
||||
bool isIdentical(const MachineInstr *MI,
|
||||
const MachineInstr *Other,
|
||||
const MachineRegisterInfo *MRI) const;
|
||||
|
||||
/// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As
|
||||
/// such, whenever a client has an instance of instruction info, it should
|
||||
/// always be able to get register info as well (through this method).
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
; RUN: llc < %s -mtriple=thumb-apple-darwin -relocation-model=pic -disable-fp-elim | FileCheck %s
|
||||
; rdar://7353541
|
||||
; rdar://7354376
|
||||
|
||||
; The generated code is no where near ideal. It's not recognizing the two
|
||||
; constantpool entries being loaded can be merged into one.
|
||||
|
||||
@GV = external global i32 ; <i32*> [#uses=2]
|
||||
|
||||
define arm_apcscc void @t(i32* nocapture %vals, i32 %c) nounwind {
|
||||
entry:
|
||||
; CHECK: t:
|
||||
%0 = icmp eq i32 %c, 0 ; <i1> [#uses=1]
|
||||
br i1 %0, label %return, label %bb.nph
|
||||
|
||||
bb.nph: ; preds = %entry
|
||||
; CHECK: BB#1
|
||||
; CHECK: ldr.n r2, LCPI1_0
|
||||
; CHECK: add r2, pc
|
||||
; CHECK: ldr r{{[0-9]+}}, [r2]
|
||||
; CHECK: LBB1_2
|
||||
; CHECK: LCPI1_0:
|
||||
; CHECK-NOT: LCPI1_1:
|
||||
; CHECK: .section
|
||||
%.pre = load i32* @GV, align 4 ; <i32> [#uses=1]
|
||||
br label %bb
|
||||
|
||||
bb: ; preds = %bb, %bb.nph
|
||||
%1 = phi i32 [ %.pre, %bb.nph ], [ %3, %bb ] ; <i32> [#uses=1]
|
||||
%i.03 = phi i32 [ 0, %bb.nph ], [ %4, %bb ] ; <i32> [#uses=2]
|
||||
%scevgep = getelementptr i32* %vals, i32 %i.03 ; <i32*> [#uses=1]
|
||||
%2 = load i32* %scevgep, align 4 ; <i32> [#uses=1]
|
||||
%3 = add nsw i32 %1, %2 ; <i32> [#uses=2]
|
||||
store i32 %3, i32* @GV, align 4
|
||||
%4 = add i32 %i.03, 1 ; <i32> [#uses=2]
|
||||
%exitcond = icmp eq i32 %4, %c ; <i1> [#uses=1]
|
||||
br i1 %exitcond, label %return, label %bb
|
||||
|
||||
return: ; preds = %bb, %entry
|
||||
ret void
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
; RUN: llc < %s -mtriple=thumbv7-apple-darwin -relocation-model=pic -disable-fp-elim | FileCheck %s
|
||||
; rdar://7353541
|
||||
; rdar://7354376
|
||||
|
||||
; The generated code is no where near ideal. It's not recognizing the two
|
||||
; constantpool entries being loaded can be merged into one.
|
||||
|
|
Loading…
Reference in New Issue