summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-04-09 16:32:30 +0000
committerChris Lattner <sabre@nondot.org>2005-04-09 16:32:30 +0000
commita55a5f258047859d66d7d4c061a04e273098cf9a (patch)
tree08af0233d0a8a78cd238d0f6efc345687170af74 /llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp
parent1a44855f8f4a5f0f56d3754c222d587800851269 (diff)
downloadbcm5719-llvm-a55a5f258047859d66d7d4c061a04e273098cf9a.tar.gz
bcm5719-llvm-a55a5f258047859d66d7d4c061a04e273098cf9a.zip
Switch this instruction selector over to using liveins and liveouts, eliminating
implicit defs on entry to the function. yaay :) llvm-svn: 21184
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp')
-rw-r--r--llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp34
1 files changed, 26 insertions, 8 deletions
diff --git a/llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp b/llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp
index 4a318b259b7..e137839a269 100644
--- a/llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp
+++ b/llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp
@@ -729,7 +729,8 @@ void PPC32ISel::LoadArgumentsToVirtualRegs(Function &Fn) {
MachineFrameInfo *MFI = F->getFrameInfo();
- for (Function::arg_iterator I = Fn.arg_begin(), E = Fn.arg_end(); I != E; ++I) {
+ for (Function::arg_iterator I = Fn.arg_begin(), E = Fn.arg_end();
+ I != E; ++I) {
bool ArgLive = !I->use_empty();
unsigned Reg = ArgLive ? getReg(*I) : 0;
int FI; // Frame object index
@@ -739,7 +740,7 @@ void PPC32ISel::LoadArgumentsToVirtualRegs(Function &Fn) {
if (ArgLive) {
FI = MFI->CreateFixedObject(4, ArgOffset);
if (GPR_remaining > 0) {
- BuildMI(BB, PPC::IMPLICIT_DEF, 0, GPR[GPR_idx]);
+ F->addLiveIn(GPR[GPR_idx]);
BuildMI(BB, PPC::OR, 2, Reg).addReg(GPR[GPR_idx])
.addReg(GPR[GPR_idx]);
} else {
@@ -751,7 +752,7 @@ void PPC32ISel::LoadArgumentsToVirtualRegs(Function &Fn) {
if (ArgLive) {
FI = MFI->CreateFixedObject(4, ArgOffset);
if (GPR_remaining > 0) {
- BuildMI(BB, PPC::IMPLICIT_DEF, 0, GPR[GPR_idx]);
+ F->addLiveIn(GPR[GPR_idx]);
BuildMI(BB, PPC::OR, 2, Reg).addReg(GPR[GPR_idx])
.addReg(GPR[GPR_idx]);
} else {
@@ -763,7 +764,7 @@ void PPC32ISel::LoadArgumentsToVirtualRegs(Function &Fn) {
if (ArgLive) {
FI = MFI->CreateFixedObject(4, ArgOffset);
if (GPR_remaining > 0) {
- BuildMI(BB, PPC::IMPLICIT_DEF, 0, GPR[GPR_idx]);
+ F->addLiveIn(GPR[GPR_idx]);
BuildMI(BB, PPC::OR, 2, Reg).addReg(GPR[GPR_idx])
.addReg(GPR[GPR_idx]);
} else {
@@ -775,8 +776,8 @@ void PPC32ISel::LoadArgumentsToVirtualRegs(Function &Fn) {
if (ArgLive) {
FI = MFI->CreateFixedObject(8, ArgOffset);
if (GPR_remaining > 1) {
- BuildMI(BB, PPC::IMPLICIT_DEF, 0, GPR[GPR_idx]);
- BuildMI(BB, PPC::IMPLICIT_DEF, 0, GPR[GPR_idx+1]);
+ F->addLiveIn(GPR[GPR_idx]);
+ F->addLiveIn(GPR[GPR_idx+1]);
BuildMI(BB, PPC::OR, 2, Reg).addReg(GPR[GPR_idx])
.addReg(GPR[GPR_idx]);
BuildMI(BB, PPC::OR, 2, Reg+1).addReg(GPR[GPR_idx+1])
@@ -798,7 +799,7 @@ void PPC32ISel::LoadArgumentsToVirtualRegs(Function &Fn) {
FI = MFI->CreateFixedObject(4, ArgOffset);
if (FPR_remaining > 0) {
- BuildMI(BB, PPC::IMPLICIT_DEF, 0, FPR[FPR_idx]);
+ F->addLiveIn(FPR[FPR_idx]);
BuildMI(BB, PPC::FMR, 1, Reg).addReg(FPR[FPR_idx]);
FPR_remaining--;
FPR_idx++;
@@ -812,7 +813,7 @@ void PPC32ISel::LoadArgumentsToVirtualRegs(Function &Fn) {
FI = MFI->CreateFixedObject(8, ArgOffset);
if (FPR_remaining > 0) {
- BuildMI(BB, PPC::IMPLICIT_DEF, 0, FPR[FPR_idx]);
+ F->addLiveIn(FPR[FPR_idx]);
BuildMI(BB, PPC::FMR, 1, Reg).addReg(FPR[FPR_idx]);
FPR_remaining--;
FPR_idx++;
@@ -843,6 +844,23 @@ void PPC32ISel::LoadArgumentsToVirtualRegs(Function &Fn) {
// llvm.va_start.
if (Fn.getFunctionType()->isVarArg())
VarArgsFrameIndex = MFI->CreateFixedObject(4, ArgOffset);
+
+ if (Fn.getReturnType() != Type::VoidTy)
+ switch (getClassB(Fn.getReturnType())) {
+ case cByte:
+ case cShort:
+ case cInt:
+ F->addLiveOut(PPC::R3);
+ break;
+ case cLong:
+ F->addLiveOut(PPC::R3);
+ F->addLiveOut(PPC::R4);
+ break;
+ case cFP32:
+ case cFP64:
+ F->addLiveOut(PPC::F1);
+ break;
+ }
}
OpenPOWER on IntegriCloud