mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-30 17:33:24 +00:00
When writing kernel, save the branches til the end. They are still put in the "right place" in the schedule, but sometimes when folding to make a kernel instructions are added between branches. This is wrong. To avoid this, we handle branches special.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18450 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
223d4c4b3a
commit
f3fa55f979
@ -1542,11 +1542,21 @@ void ModuloSchedulingPass::writeKernel(BasicBlock *llvmBB, MachineBasicBlock *ma
|
||||
std::map<Value*, Value*> finalPHIValue;
|
||||
std::map<Value*, Value*> kernelValue;
|
||||
|
||||
//Branches are a special case
|
||||
std::vector<MachineInstr*> branches;
|
||||
|
||||
//Create TmpInstructions for the final phis
|
||||
for(MSSchedule::kernel_iterator I = schedule.kernel_begin(), E = schedule.kernel_end(); I != E; ++I) {
|
||||
|
||||
DEBUG(std::cerr << "Stage: " << I->second << " Inst: " << *(I->first->getInst()) << "\n";);
|
||||
|
||||
if(I->first->isBranch()) {
|
||||
//Clone instruction
|
||||
const MachineInstr *inst = I->first->getInst();
|
||||
MachineInstr *instClone = inst->clone();
|
||||
branches.push_back(instClone);
|
||||
}
|
||||
|
||||
//Clone instruction
|
||||
const MachineInstr *inst = I->first->getInst();
|
||||
MachineInstr *instClone = inst->clone();
|
||||
@ -1556,11 +1566,6 @@ void ModuloSchedulingPass::writeKernel(BasicBlock *llvmBB, MachineBasicBlock *ma
|
||||
|
||||
DEBUG(std::cerr << "Cloned Inst: " << *instClone << "\n");
|
||||
|
||||
if(I->first->isBranch()) {
|
||||
//Add kernel noop
|
||||
BuildMI(machineBB, V9::NOP, 0);
|
||||
}
|
||||
|
||||
//Loop over Machine Operands
|
||||
for(unsigned i=0; i < inst->getNumOperands(); ++i) {
|
||||
//get machine operand
|
||||
@ -1623,6 +1628,13 @@ void ModuloSchedulingPass::writeKernel(BasicBlock *llvmBB, MachineBasicBlock *ma
|
||||
|
||||
}
|
||||
|
||||
//Add branches
|
||||
for(std::vector<MachineInstr*>::iterator I = branches.begin(), E = branches.end(); I != E; ++I) {
|
||||
machineBB->push_back(*I);
|
||||
BuildMI(machineBB, V9::NOP, 0);
|
||||
}
|
||||
|
||||
|
||||
DEBUG(std::cerr << "KERNEL before PHIs\n");
|
||||
DEBUG(machineBB->print(std::cerr));
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user