Generate fewer reg-reg copies for the register allocator to deal with.

This eliminates over 2000 in hbd alone.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17973 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nate Begeman 2004-11-19 02:06:40 +00:00
parent 05f8d5fed6
commit 8531f6f42a

View File

@ -1496,16 +1496,7 @@ void PPC32ISel::promote32(unsigned targetReg, const ValueRecord &VR) {
// If this is a simple constant, just emit a load directly to avoid the copy // If this is a simple constant, just emit a load directly to avoid the copy
if (ConstantInt *CI = dyn_cast<ConstantInt>(Val)) { if (ConstantInt *CI = dyn_cast<ConstantInt>(Val)) {
int TheVal = CI->getRawValue() & 0xFFFFFFFF; copyConstantToRegister(BB, BB->end(), CI, targetReg);
if (TheVal < 32768 && TheVal >= -32768) {
BuildMI(BB, PPC::LI, 1, targetReg).addSImm(TheVal);
} else {
unsigned TmpReg = makeAnotherReg(Type::IntTy);
BuildMI(BB, PPC::LIS, 1, TmpReg).addSImm(TheVal >> 16);
BuildMI(BB, PPC::ORI, 2, targetReg).addReg(TmpReg)
.addImm(TheVal & 0xFFFF);
}
return; return;
} }
} }
@ -3330,10 +3321,11 @@ void PPC32ISel::emitCastOperation(MachineBasicBlock *MBB,
} }
// Make sure we're dealing with a full 32 bits // Make sure we're dealing with a full 32 bits
unsigned TmpReg = makeAnotherReg(Type::IntTy); if (SrcClass < cInt) {
promote32(TmpReg, ValueRecord(SrcReg, SrcTy)); unsigned TmpReg = makeAnotherReg(Type::IntTy);
promote32(TmpReg, ValueRecord(SrcReg, SrcTy));
SrcReg = TmpReg; SrcReg = TmpReg;
}
// Spill the integer to memory and reload it from there. // Spill the integer to memory and reload it from there.
// Also spill room for a special conversion constant // Also spill room for a special conversion constant
@ -3499,15 +3491,9 @@ void PPC32ISel::emitCastOperation(MachineBasicBlock *MBB,
if (sourceUnsigned && destUnsigned) { if (sourceUnsigned && destUnsigned) {
// handle long dest class now to keep switch clean // handle long dest class now to keep switch clean
if (DestClass == cLong) { if (DestClass == cLong) {
if (SrcClass == cLong) { BuildMI(*MBB, IP, PPC::LI, 1, DestReg).addSImm(0);
BuildMI(*MBB, IP, PPC::OR, 2, DestReg).addReg(SrcReg).addReg(SrcReg); BuildMI(*MBB, IP, PPC::OR, 2, DestReg+1).addReg(SrcReg)
BuildMI(*MBB, IP, PPC::OR, 2, DestReg+1).addReg(SrcReg+1) .addReg(SrcReg);
.addReg(SrcReg+1);
} else {
BuildMI(*MBB, IP, PPC::LI, 1, DestReg).addSImm(0);
BuildMI(*MBB, IP, PPC::OR, 2, DestReg+1).addReg(SrcReg)
.addReg(SrcReg);
}
return; return;
} }
@ -3516,21 +3502,15 @@ void PPC32ISel::emitCastOperation(MachineBasicBlock *MBB,
switch (SrcClass) { switch (SrcClass) {
case cByte: case cByte:
case cShort: case cShort:
if (SrcClass == DestClass) BuildMI(*MBB, IP, PPC::RLWINM, 4, DestReg).addReg(SrcReg)
BuildMI(*MBB, IP, PPC::OR, 2, DestReg).addReg(SrcReg).addReg(SrcReg); .addImm(0).addImm(clearBits).addImm(31);
else
BuildMI(*MBB, IP, PPC::RLWINM, 4, DestReg).addReg(SrcReg)
.addImm(0).addImm(clearBits).addImm(31);
break; break;
case cLong: case cLong:
++SrcReg; ++SrcReg;
// Fall through // Fall through
case cInt: case cInt:
if (DestClass == cInt) BuildMI(*MBB, IP, PPC::RLWINM, 4, DestReg).addReg(SrcReg)
BuildMI(*MBB, IP, PPC::OR, 2, DestReg).addReg(SrcReg).addReg(SrcReg); .addImm(0).addImm(clearBits).addImm(31);
else
BuildMI(*MBB, IP, PPC::RLWINM, 4, DestReg).addReg(SrcReg)
.addImm(0).addImm(clearBits).addImm(31);
break; break;
} }
return; return;
@ -3540,15 +3520,9 @@ void PPC32ISel::emitCastOperation(MachineBasicBlock *MBB,
if (!sourceUnsigned && !destUnsigned) { if (!sourceUnsigned && !destUnsigned) {
// handle long dest class now to keep switch clean // handle long dest class now to keep switch clean
if (DestClass == cLong) { if (DestClass == cLong) {
if (SrcClass == cLong) { BuildMI(*MBB, IP, PPC::SRAWI, 2, DestReg).addReg(SrcReg).addImm(31);
BuildMI(*MBB, IP, PPC::OR, 2, DestReg).addReg(SrcReg).addReg(SrcReg); BuildMI(*MBB, IP, PPC::OR, 2, DestReg+1).addReg(SrcReg)
BuildMI(*MBB, IP, PPC::OR, 2, DestReg+1).addReg(SrcReg+1) .addReg(SrcReg);
.addReg(SrcReg+1);
} else {
BuildMI(*MBB, IP, PPC::SRAWI, 2, DestReg).addReg(SrcReg).addImm(31);
BuildMI(*MBB, IP, PPC::OR, 2, DestReg+1).addReg(SrcReg)
.addReg(SrcReg);
}
return; return;
} }
@ -3582,15 +3556,9 @@ void PPC32ISel::emitCastOperation(MachineBasicBlock *MBB,
if (sourceUnsigned && !destUnsigned) { if (sourceUnsigned && !destUnsigned) {
// handle long dest class now to keep switch clean // handle long dest class now to keep switch clean
if (DestClass == cLong) { if (DestClass == cLong) {
if (SrcClass == cLong) { BuildMI(*MBB, IP, PPC::LI, 1, DestReg).addSImm(0);
BuildMI(*MBB, IP, PPC::OR, 2, DestReg).addReg(SrcReg).addReg(SrcReg); BuildMI(*MBB, IP, PPC::OR, 2, DestReg+1).addReg(SrcReg)
BuildMI(*MBB, IP, PPC::OR, 2, DestReg+1).addReg(SrcReg+1). .addReg(SrcReg);
addReg(SrcReg+1);
} else {
BuildMI(*MBB, IP, PPC::LI, 1, DestReg).addSImm(0);
BuildMI(*MBB, IP, PPC::OR, 2, DestReg+1).addReg(SrcReg)
.addReg(SrcReg);
}
return; return;
} }
@ -3627,15 +3595,9 @@ void PPC32ISel::emitCastOperation(MachineBasicBlock *MBB,
if (!sourceUnsigned && destUnsigned) { if (!sourceUnsigned && destUnsigned) {
// handle long dest class now to keep switch clean // handle long dest class now to keep switch clean
if (DestClass == cLong) { if (DestClass == cLong) {
if (SrcClass == cLong) { BuildMI(*MBB, IP, PPC::SRAWI, 2, DestReg).addReg(SrcReg).addImm(31);
BuildMI(*MBB, IP, PPC::OR, 2, DestReg).addReg(SrcReg).addReg(SrcReg); BuildMI(*MBB, IP, PPC::OR, 2, DestReg+1).addReg(SrcReg)
BuildMI(*MBB, IP, PPC::OR, 2, DestReg+1).addReg(SrcReg+1) .addReg(SrcReg);
.addReg(SrcReg+1);
} else {
BuildMI(*MBB, IP, PPC::SRAWI, 2, DestReg).addReg(SrcReg).addImm(31);
BuildMI(*MBB, IP, PPC::OR, 2, DestReg+1).addReg(SrcReg)
.addReg(SrcReg);
}
return; return;
} }
@ -3817,10 +3779,23 @@ void PPC32ISel::emitGEPOperation(MachineBasicBlock *MBB,
cgo_e = ops.end(); cgo_i != cgo_e; ++cgo_i) { cgo_e = ops.end(); cgo_i != cgo_e; ++cgo_i) {
CollapsedGepOp& cgo = *cgo_i; CollapsedGepOp& cgo = *cgo_i;
unsigned TmpReg1 = makeAnotherReg(Type::IntTy); // Avoid emitting known move instructions here for the register allocator
unsigned TmpReg2 = makeAnotherReg(Type::IntTy); // to deal with later. val * 1 == val. val + 0 == val.
doMultiplyConst(MBB, IP, TmpReg1, cgo.index, cgo.size); unsigned TmpReg1;
emitBinaryConstOperation(MBB, IP, TmpReg1, cgo.offset, 0, TmpReg2); if (cgo.size->getValue() == 1) {
TmpReg1 = getReg(cgo.index, MBB, IP);
} else {
TmpReg1 = makeAnotherReg(Type::IntTy);
doMultiplyConst(MBB, IP, TmpReg1, cgo.index, cgo.size);
}
unsigned TmpReg2;
if (cgo.offset->isNullValue()) {
TmpReg2 = TmpReg1;
} else {
TmpReg2 = makeAnotherReg(Type::IntTy);
emitBinaryConstOperation(MBB, IP, TmpReg1, cgo.offset, 0, TmpReg2);
}
if (indexReg == 0) if (indexReg == 0)
indexReg = TmpReg2; indexReg = TmpReg2;