mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-21 18:29:46 +00:00
Fix PR4926. When target hook EmitInstrWithCustomInserter() insert new basic blocks and update CFG, it should also inform sdisel of the changes so the phi source operands will come from the right basic blocks.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82311 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
83d63919bd
commit
ce31910eae
@ -954,14 +954,15 @@ SelectionDAGISel::FinishBasicBlock() {
|
||||
"This is not a machine PHI node that we are updating!");
|
||||
// "default" BB. We can go there only from header BB.
|
||||
if (PHIBB == SDL->JTCases[i].second.Default) {
|
||||
PHI->addOperand(MachineOperand::CreateReg(SDL->PHINodesToUpdate[pi].second,
|
||||
false));
|
||||
PHI->addOperand(MachineOperand::CreateMBB(SDL->JTCases[i].first.HeaderBB));
|
||||
PHI->addOperand
|
||||
(MachineOperand::CreateReg(SDL->PHINodesToUpdate[pi].second, false));
|
||||
PHI->addOperand
|
||||
(MachineOperand::CreateMBB(SDL->JTCases[i].first.HeaderBB));
|
||||
}
|
||||
// JT BB. Just iterate over successors here
|
||||
if (BB->succ_end() != std::find(BB->succ_begin(),BB->succ_end(), PHIBB)) {
|
||||
PHI->addOperand(MachineOperand::CreateReg(SDL->PHINodesToUpdate[pi].second,
|
||||
false));
|
||||
PHI->addOperand
|
||||
(MachineOperand::CreateReg(SDL->PHINodesToUpdate[pi].second, false));
|
||||
PHI->addOperand(MachineOperand::CreateMBB(BB));
|
||||
}
|
||||
}
|
||||
@ -999,7 +1000,8 @@ SelectionDAGISel::FinishBasicBlock() {
|
||||
// handle them the right number of times.
|
||||
while ((BB = SDL->SwitchCases[i].TrueBB)) { // Handle LHS and RHS.
|
||||
// If new BB's are created during scheduling, the edges may have been
|
||||
// updated.
|
||||
// updated. That is, the edge from ThisBB to BB may have been split and
|
||||
// BB's predecessor is now another block.
|
||||
DenseMap<MachineBasicBlock*, MachineBasicBlock*>::iterator EI =
|
||||
SDL->EdgeMapping.find(BB);
|
||||
if (EI != SDL->EdgeMapping.end())
|
||||
|
@ -2920,12 +2920,15 @@ ARMTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||
F->insert(It, sinkMBB);
|
||||
// Update machine-CFG edges by first adding all successors of the current
|
||||
// block to the new block which will contain the Phi node for the select.
|
||||
for(MachineBasicBlock::succ_iterator i = BB->succ_begin(),
|
||||
e = BB->succ_end(); i != e; ++i)
|
||||
sinkMBB->addSuccessor(*i);
|
||||
// Also inform sdisel of the edge changes.
|
||||
for (MachineBasicBlock::succ_iterator I = BB->succ_begin(),
|
||||
E = BB->succ_end(); I != E; ++I) {
|
||||
EM->insert(std::make_pair(*I, sinkMBB));
|
||||
sinkMBB->addSuccessor(*I);
|
||||
}
|
||||
// Next, remove all successors of the current block, and add the true
|
||||
// and fallthrough blocks as its successors.
|
||||
while(!BB->succ_empty())
|
||||
while (!BB->succ_empty())
|
||||
BB->removeSuccessor(BB->succ_begin());
|
||||
BB->addSuccessor(copy0MBB);
|
||||
BB->addSuccessor(sinkMBB);
|
||||
|
@ -855,6 +855,11 @@ AlphaTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||
MachineBasicBlock *llscMBB = F->CreateMachineBasicBlock(LLVM_BB);
|
||||
MachineBasicBlock *sinkMBB = F->CreateMachineBasicBlock(LLVM_BB);
|
||||
|
||||
// Inform sdisel of the edge changes.
|
||||
for (MachineBasicBlock::succ_iterator I = BB->succ_begin(),
|
||||
E = BB->succ_end(); I != E; ++I)
|
||||
EM->insert(std::make_pair(*I, sinkMBB));
|
||||
|
||||
sinkMBB->transferSuccessors(thisMBB);
|
||||
|
||||
F->insert(It, llscMBB);
|
||||
|
@ -712,6 +712,10 @@ MSP430TargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||
.addImm(MI->getOperand(3).getImm());
|
||||
F->insert(I, copy0MBB);
|
||||
F->insert(I, copy1MBB);
|
||||
// Inform sdisel of the edge changes.
|
||||
for (MachineBasicBlock::succ_iterator SI = BB->succ_begin(),
|
||||
SE = BB->succ_end(); SI != SE; ++SI)
|
||||
EM->insert(std::make_pair(*SI, copy1MBB));
|
||||
// Update machine-CFG edges by transferring all successors of the current
|
||||
// block to the new block which will contain the Phi node for the select.
|
||||
copy1MBB->transferSuccessors(BB);
|
||||
|
@ -308,9 +308,12 @@ MipsTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||
F->insert(It, sinkMBB);
|
||||
// Update machine-CFG edges by first adding all successors of the current
|
||||
// block to the new block which will contain the Phi node for the select.
|
||||
// Also inform sdisel of the edge changes.
|
||||
for(MachineBasicBlock::succ_iterator i = BB->succ_begin(),
|
||||
e = BB->succ_end(); i != e; ++i)
|
||||
e = BB->succ_end(); i != e; ++i) {
|
||||
EM->insert(std::make_pair(*i, sinkMBB));
|
||||
sinkMBB->addSuccessor(*i);
|
||||
}
|
||||
// Next, remove all successors of the current block, and add the true
|
||||
// and fallthrough blocks as its successors.
|
||||
while(!BB->succ_empty())
|
||||
|
@ -1840,9 +1840,18 @@ PIC16TargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||
F->insert(It, copy0MBB);
|
||||
F->insert(It, sinkMBB);
|
||||
|
||||
// Update machine-CFG edges by transferring all successors of the current
|
||||
// Update machine-CFG edges by first adding all successors of the current
|
||||
// block to the new block which will contain the Phi node for the select.
|
||||
sinkMBB->transferSuccessors(BB);
|
||||
// Also inform sdisel of the edge changes.
|
||||
for (MachineBasicBlock::succ_iterator I = BB->succ_begin(),
|
||||
E = BB->succ_end(); I != E; ++I) {
|
||||
EM->insert(std::make_pair(*I, sinkMBB));
|
||||
sinkMBB->addSuccessor(*I);
|
||||
}
|
||||
// Next, remove all successors of the current block, and add the true
|
||||
// and fallthrough blocks as its successors.
|
||||
while (!BB->succ_empty())
|
||||
BB->removeSuccessor(BB->succ_begin());
|
||||
// Next, add the true and fallthrough blocks as its successors.
|
||||
BB->addSuccessor(copy0MBB);
|
||||
BB->addSuccessor(sinkMBB);
|
||||
|
@ -4525,9 +4525,18 @@ PPCTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||
.addImm(SelectPred).addReg(MI->getOperand(1).getReg()).addMBB(sinkMBB);
|
||||
F->insert(It, copy0MBB);
|
||||
F->insert(It, sinkMBB);
|
||||
// Update machine-CFG edges by transferring all successors of the current
|
||||
// Update machine-CFG edges by first adding all successors of the current
|
||||
// block to the new block which will contain the Phi node for the select.
|
||||
sinkMBB->transferSuccessors(BB);
|
||||
// Also inform sdisel of the edge changes.
|
||||
for (MachineBasicBlock::succ_iterator I = BB->succ_begin(),
|
||||
E = BB->succ_end(); I != E; ++I) {
|
||||
EM->insert(std::make_pair(*I, sinkMBB));
|
||||
sinkMBB->addSuccessor(*I);
|
||||
}
|
||||
// Next, remove all successors of the current block, and add the true
|
||||
// and fallthrough blocks as its successors.
|
||||
while (!BB->succ_empty())
|
||||
BB->removeSuccessor(BB->succ_begin());
|
||||
// Next, add the true and fallthrough blocks as its successors.
|
||||
BB->addSuccessor(copy0MBB);
|
||||
BB->addSuccessor(sinkMBB);
|
||||
|
@ -990,9 +990,18 @@ SparcTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||
BuildMI(BB, dl, TII.get(BROpcode)).addMBB(sinkMBB).addImm(CC);
|
||||
F->insert(It, copy0MBB);
|
||||
F->insert(It, sinkMBB);
|
||||
// Update machine-CFG edges by transferring all successors of the current
|
||||
// Update machine-CFG edges by first adding all successors of the current
|
||||
// block to the new block which will contain the Phi node for the select.
|
||||
sinkMBB->transferSuccessors(BB);
|
||||
// Also inform sdisel of the edge changes.
|
||||
for (MachineBasicBlock::succ_iterator I = BB->succ_begin(),
|
||||
E = BB->succ_end(); I != E; ++I) {
|
||||
EM->insert(std::make_pair(*I, sinkMBB));
|
||||
sinkMBB->addSuccessor(*I);
|
||||
}
|
||||
// Next, remove all successors of the current block, and add the true
|
||||
// and fallthrough blocks as its successors.
|
||||
while (!BB->succ_empty())
|
||||
BB->removeSuccessor(BB->succ_begin());
|
||||
// Next, add the true and fallthrough blocks as its successors.
|
||||
BB->addSuccessor(copy0MBB);
|
||||
BB->addSuccessor(sinkMBB);
|
||||
|
@ -810,6 +810,10 @@ SystemZTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||
BuildMI(BB, dl, TII.getBrCond(CC)).addMBB(copy1MBB);
|
||||
F->insert(I, copy0MBB);
|
||||
F->insert(I, copy1MBB);
|
||||
// Inform sdisel of the edge changes.
|
||||
for (MachineBasicBlock::succ_iterator SI = BB->succ_begin(),
|
||||
SE = BB->succ_end(); SI != SE; ++SI)
|
||||
EM->insert(std::make_pair(*SI, copy1MBB));
|
||||
// Update machine-CFG edges by transferring all successors of the current
|
||||
// block to the new block which will contain the Phi node for the select.
|
||||
copy1MBB->transferSuccessors(BB);
|
||||
|
@ -7675,16 +7675,10 @@ X86TargetLowering::EmitPCMP(MachineInstr *MI, MachineBasicBlock *BB,
|
||||
const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
|
||||
|
||||
unsigned Opc;
|
||||
|
||||
if (memArg) {
|
||||
Opc = numArgs == 3 ?
|
||||
X86::PCMPISTRM128rm :
|
||||
X86::PCMPESTRM128rm;
|
||||
} else {
|
||||
Opc = numArgs == 3 ?
|
||||
X86::PCMPISTRM128rr :
|
||||
X86::PCMPESTRM128rr;
|
||||
}
|
||||
if (memArg)
|
||||
Opc = numArgs == 3 ? X86::PCMPISTRM128rm : X86::PCMPESTRM128rm;
|
||||
else
|
||||
Opc = numArgs == 3 ? X86::PCMPISTRM128rr : X86::PCMPESTRM128rr;
|
||||
|
||||
MachineInstrBuilder MIB = BuildMI(BB, dl, TII->get(Opc));
|
||||
|
||||
@ -7773,7 +7767,8 @@ X86TargetLowering::EmitVAStartSaveXMMRegsWithCustomInserter(
|
||||
|
||||
MachineBasicBlock *
|
||||
X86TargetLowering::EmitLoweredSelect(MachineInstr *MI,
|
||||
MachineBasicBlock *BB) const {
|
||||
MachineBasicBlock *BB,
|
||||
DenseMap<MachineBasicBlock*, MachineBasicBlock*> *EM) const {
|
||||
const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
|
||||
@ -7800,10 +7795,18 @@ X86TargetLowering::EmitLoweredSelect(MachineInstr *MI,
|
||||
BuildMI(BB, DL, TII->get(Opc)).addMBB(sinkMBB);
|
||||
F->insert(It, copy0MBB);
|
||||
F->insert(It, sinkMBB);
|
||||
// Update machine-CFG edges by transferring all successors of the current
|
||||
// Update machine-CFG edges by first adding all successors of the current
|
||||
// block to the new block which will contain the Phi node for the select.
|
||||
sinkMBB->transferSuccessors(BB);
|
||||
|
||||
// Also inform sdisel of the edge changes.
|
||||
for (MachineBasicBlock::succ_iterator I = BB->succ_begin(),
|
||||
E = BB->succ_end(); I != E; ++I) {
|
||||
EM->insert(std::make_pair(*I, sinkMBB));
|
||||
sinkMBB->addSuccessor(*I);
|
||||
}
|
||||
// Next, remove all successors of the current block, and add the true
|
||||
// and fallthrough blocks as its successors.
|
||||
while (!BB->succ_empty())
|
||||
BB->removeSuccessor(BB->succ_begin());
|
||||
// Add the true and fallthrough blocks as its successors.
|
||||
BB->addSuccessor(copy0MBB);
|
||||
BB->addSuccessor(sinkMBB);
|
||||
@ -7842,7 +7845,7 @@ X86TargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||
case X86::CMOV_V4F32:
|
||||
case X86::CMOV_V2F64:
|
||||
case X86::CMOV_V2I64:
|
||||
return EmitLoweredSelect(MI, BB);
|
||||
return EmitLoweredSelect(MI, BB, EM);
|
||||
|
||||
case X86::FP32_TO_INT16_IN_MEM:
|
||||
case X86::FP32_TO_INT32_IN_MEM:
|
||||
|
@ -740,7 +740,8 @@ namespace llvm {
|
||||
MachineBasicBlock *BB) const;
|
||||
|
||||
MachineBasicBlock *EmitLoweredSelect(MachineInstr *I,
|
||||
MachineBasicBlock *BB) const;
|
||||
MachineBasicBlock *BB,
|
||||
DenseMap<MachineBasicBlock*, MachineBasicBlock*> *EM) const;
|
||||
|
||||
/// Emit nodes that will be selected as "test Op0,Op0", or something
|
||||
/// equivalent, for use with the given x86 condition code.
|
||||
|
@ -1010,9 +1010,18 @@ XCoreTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||
.addReg(MI->getOperand(1).getReg()).addMBB(sinkMBB);
|
||||
F->insert(It, copy0MBB);
|
||||
F->insert(It, sinkMBB);
|
||||
// Update machine-CFG edges by transferring all successors of the current
|
||||
// Update machine-CFG edges by first adding all successors of the current
|
||||
// block to the new block which will contain the Phi node for the select.
|
||||
sinkMBB->transferSuccessors(BB);
|
||||
// Also inform sdisel of the edge changes.
|
||||
for (MachineBasicBlock::succ_iterator I = BB->succ_begin(),
|
||||
E = BB->succ_end(); I != E; ++I) {
|
||||
EM->insert(std::make_pair(*I, sinkMBB));
|
||||
sinkMBB->addSuccessor(*I);
|
||||
}
|
||||
// Next, remove all successors of the current block, and add the true
|
||||
// and fallthrough blocks as its successors.
|
||||
while (!BB->succ_empty())
|
||||
BB->removeSuccessor(BB->succ_begin());
|
||||
// Next, add the true and fallthrough blocks as its successors.
|
||||
BB->addSuccessor(copy0MBB);
|
||||
BB->addSuccessor(sinkMBB);
|
||||
|
30
test/CodeGen/X86/2009-09-19-SchedCustomLoweringBug.ll
Normal file
30
test/CodeGen/X86/2009-09-19-SchedCustomLoweringBug.ll
Normal file
@ -0,0 +1,30 @@
|
||||
; RUN: llc < %s -mtriple=i386-apple-darwin10 | FileCheck %s
|
||||
|
||||
; PR4958
|
||||
|
||||
define i32 @main() nounwind ssp {
|
||||
entry:
|
||||
; CHECK: main:
|
||||
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
|
||||
br label %bb
|
||||
|
||||
bb: ; preds = %bb1, %entry
|
||||
; CHECK: movl %e
|
||||
; CHECK-NEXT: addl $1
|
||||
; CHECK-NEXT: movl %e
|
||||
; CHECK-NEXT: adcl $0
|
||||
%i.0 = phi i64 [ 0, %entry ], [ %0, %bb1 ] ; <i64> [#uses=1]
|
||||
%0 = add nsw i64 %i.0, 1 ; <i64> [#uses=2]
|
||||
%1 = icmp sgt i32 0, 0 ; <i1> [#uses=1]
|
||||
br i1 %1, label %bb2, label %bb1
|
||||
|
||||
bb1: ; preds = %bb
|
||||
%2 = icmp sle i64 %0, 1 ; <i1> [#uses=1]
|
||||
br i1 %2, label %bb, label %bb2
|
||||
|
||||
bb2: ; preds = %bb1, %bb
|
||||
br label %return
|
||||
|
||||
return: ; preds = %bb2
|
||||
ret i32 0
|
||||
}
|
Loading…
Reference in New Issue
Block a user