Make sure that for C++ emitting LwConstant32 pseudos, that it corresponds

to what is needed for constant islands. The prescan method for Mips16 constant
islands will eventually go away. It is only temporary and should be done
earlier when the instructions are first created or from the DAG. If we keep
it here we need to handle better the situation where constant islands
is called multiple times since don't want to prescan more than once.

llvm-svn: 195569
This commit is contained in:
Reed Kotler 2013-11-24 06:18:50 +00:00
parent 1585fea1a2
commit a787aa2b1e
3 changed files with 6 additions and 4 deletions

View File

@ -281,7 +281,7 @@ void Mips16InstrInfo::adjustStackPtrBig(unsigned SP, int64_t Amount,
// //
// //
MachineInstrBuilder MIB1 = BuildMI(MBB, I, DL, get(Mips::LwConstant32), Reg1); MachineInstrBuilder MIB1 = BuildMI(MBB, I, DL, get(Mips::LwConstant32), Reg1);
MIB1.addImm(Amount); MIB1.addImm(Amount).addImm(-1);
MachineInstrBuilder MIB2 = BuildMI(MBB, I, DL, get(Mips::MoveR3216), Reg2); MachineInstrBuilder MIB2 = BuildMI(MBB, I, DL, get(Mips::MoveR3216), Reg2);
MIB2.addReg(Mips::SP, RegState::Kill); MIB2.addReg(Mips::SP, RegState::Kill);
MachineInstrBuilder MIB3 = BuildMI(MBB, I, DL, get(Mips::AdduRxRyRz16), Reg1); MachineInstrBuilder MIB3 = BuildMI(MBB, I, DL, get(Mips::AdduRxRyRz16), Reg1);
@ -393,7 +393,7 @@ Mips16InstrInfo::loadImmediate(unsigned FrameReg,
} }
else else
Available.reset(Reg); Available.reset(Reg);
BuildMI(MBB, II, DL, get(Mips::LwConstant32), Reg).addImm(Imm); BuildMI(MBB, II, DL, get(Mips::LwConstant32), Reg).addImm(Imm).addImm(-1);
NewImm = 0; NewImm = 0;
if (FrameReg == Mips::SP) { if (FrameReg == Mips::SP) {
SpReg = Available.find_first(); SpReg = Available.find_first();

View File

@ -1518,13 +1518,13 @@ MipsConstantIslands::fixupConditionalBr(ImmBranch &Br) {
void MipsConstantIslands::prescanForConstants() { void MipsConstantIslands::prescanForConstants() {
unsigned J = 0; unsigned J = 0;
(void)J; (void)J;
PrescannedForConstants = true;
for (MachineFunction::iterator B = for (MachineFunction::iterator B =
MF->begin(), E = MF->end(); B != E; ++B) { MF->begin(), E = MF->end(); B != E; ++B) {
for (MachineBasicBlock::instr_iterator I = for (MachineBasicBlock::instr_iterator I =
B->instr_begin(), EB = B->instr_end(); I != EB; ++I) { B->instr_begin(), EB = B->instr_end(); I != EB; ++I) {
switch(I->getDesc().getOpcode()) { switch(I->getDesc().getOpcode()) {
case Mips::LwConstant32: { case Mips::LwConstant32: {
PrescannedForConstants = true;
DEBUG(dbgs() << "constant island constant " << *I << "\n"); DEBUG(dbgs() << "constant island constant " << *I << "\n");
J = I->getNumOperands(); J = I->getNumOperands();
DEBUG(dbgs() << "num operands " << J << "\n"); DEBUG(dbgs() << "num operands " << J << "\n");

View File

@ -1,5 +1,6 @@
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=static < %s | FileCheck %s -check-prefix=1 ; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel -mcpu=mips16 -relocation-model=static < %s | FileCheck %s -check-prefix=1
; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel -mcpu=mips16 -soft-float -mips16-hard-float -relocation-model=pic -mips16-constant-islands < %s | FileCheck %s -check-prefix=ci
@i = common global i32 0, align 4 @i = common global i32 0, align 4
@j = common global i32 0, align 4 @j = common global i32 0, align 4
@ -71,4 +72,5 @@ entry:
ret i32 0 ret i32 0
} }
; ci: lw ${{[0-9]+}}, $CPI{{[0-9]+}}_{{[0-9]+}}
declare i32 @printf(i8*, ...) declare i32 @printf(i8*, ...)