mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-09 11:25:55 +00:00
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:
@@ -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?
|
||||||
|
Reference in New Issue
Block a user