Generate better code by being far less clever when it comes to the select instruction. Don't create overlapping register lifetimes

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@16580 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nate Begeman
2004-09-29 05:00:31 +00:00
parent a771347336
commit 1f49e868aa

View File

@@ -1296,7 +1296,6 @@ void PPC32ISel::emitSelectOperation(MachineBasicBlock *MBB,
BuildMI(*MBB, IP, PPC::CMPWI, 2, PPC::CR0).addReg(CondReg).addSImm(0); BuildMI(*MBB, IP, PPC::CMPWI, 2, PPC::CR0).addReg(CondReg).addSImm(0);
Opcode = getPPCOpcodeForSetCCNumber(Instruction::SetNE); Opcode = getPPCOpcodeForSetCCNumber(Instruction::SetNE);
} }
unsigned TrueValue = getReg(TrueVal, BB, BB->end());
MachineBasicBlock *thisMBB = BB; MachineBasicBlock *thisMBB = BB;
const BasicBlock *LLVM_BB = BB->getBasicBlock(); const BasicBlock *LLVM_BB = BB->getBasicBlock();
@@ -1306,22 +1305,33 @@ void PPC32ISel::emitSelectOperation(MachineBasicBlock *MBB,
// thisMBB: // thisMBB:
// ... // ...
// cmpTY cr0, r1, r2 // cmpTY cr0, r1, r2
// %TrueValue = ... // bCC copy1MBB
// bCC sinkMBB // fallthrough --> copy0MBB
MachineBasicBlock *copy0MBB = new MachineBasicBlock(LLVM_BB); MachineBasicBlock *copy0MBB = new MachineBasicBlock(LLVM_BB);
MachineBasicBlock *copy1MBB = new MachineBasicBlock(LLVM_BB);
MachineBasicBlock *sinkMBB = new MachineBasicBlock(LLVM_BB); MachineBasicBlock *sinkMBB = new MachineBasicBlock(LLVM_BB);
BuildMI(BB, Opcode, 2).addReg(PPC::CR0).addMBB(sinkMBB); BuildMI(BB, Opcode, 2).addReg(PPC::CR0).addMBB(copy1MBB);
F->getBasicBlockList().insert(It, copy0MBB); F->getBasicBlockList().insert(It, copy0MBB);
F->getBasicBlockList().insert(It, copy1MBB);
F->getBasicBlockList().insert(It, sinkMBB); F->getBasicBlockList().insert(It, sinkMBB);
// Update machine-CFG edges // Update machine-CFG edges
BB->addSuccessor(copy0MBB); BB->addSuccessor(copy0MBB);
BB->addSuccessor(sinkMBB); BB->addSuccessor(copy1MBB);
// copy0MBB: // copy0MBB:
// %FalseValue = ... // %FalseValue = ...
// fallthrough // b sinkMBB
BB = copy0MBB; BB = copy0MBB;
unsigned FalseValue = getReg(FalseVal, BB, BB->begin()); unsigned FalseValue = getReg(FalseVal, BB, BB->begin());
BuildMI(BB, PPC::B, 1).addMBB(sinkMBB);
// Update machine-CFG edges
BB->addSuccessor(sinkMBB);
// copy1MBB:
// %TrueValue = ...
// fallthrough
BB = copy1MBB;
unsigned TrueValue = getReg(TrueVal, BB, BB->begin());
// Update machine-CFG edges // Update machine-CFG edges
BB->addSuccessor(sinkMBB); BB->addSuccessor(sinkMBB);
@@ -1330,7 +1340,7 @@ void PPC32ISel::emitSelectOperation(MachineBasicBlock *MBB,
// ... // ...
BB = sinkMBB; BB = sinkMBB;
BuildMI(BB, PPC::PHI, 4, DestReg).addReg(FalseValue) BuildMI(BB, PPC::PHI, 4, DestReg).addReg(FalseValue)
.addMBB(copy0MBB).addReg(TrueValue).addMBB(thisMBB); .addMBB(copy0MBB).addReg(TrueValue).addMBB(copy1MBB);
// For a register pair representing a long value, define the second reg // For a register pair representing a long value, define the second reg
// FIXME: Can this really be correct for selecting longs? // FIXME: Can this really be correct for selecting longs?