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:
Evan Cheng 2009-09-19 09:51:03 +00:00
parent 83d63919bd
commit ce31910eae
13 changed files with 126 additions and 35 deletions

View File

@ -954,14 +954,15 @@ SelectionDAGISel::FinishBasicBlock() {
"This is not a machine PHI node that we are updating!"); "This is not a machine PHI node that we are updating!");
// "default" BB. We can go there only from header BB. // "default" BB. We can go there only from header BB.
if (PHIBB == SDL->JTCases[i].second.Default) { if (PHIBB == SDL->JTCases[i].second.Default) {
PHI->addOperand(MachineOperand::CreateReg(SDL->PHINodesToUpdate[pi].second, PHI->addOperand
false)); (MachineOperand::CreateReg(SDL->PHINodesToUpdate[pi].second, false));
PHI->addOperand(MachineOperand::CreateMBB(SDL->JTCases[i].first.HeaderBB)); PHI->addOperand
(MachineOperand::CreateMBB(SDL->JTCases[i].first.HeaderBB));
} }
// JT BB. Just iterate over successors here // JT BB. Just iterate over successors here
if (BB->succ_end() != std::find(BB->succ_begin(),BB->succ_end(), PHIBB)) { if (BB->succ_end() != std::find(BB->succ_begin(),BB->succ_end(), PHIBB)) {
PHI->addOperand(MachineOperand::CreateReg(SDL->PHINodesToUpdate[pi].second, PHI->addOperand
false)); (MachineOperand::CreateReg(SDL->PHINodesToUpdate[pi].second, false));
PHI->addOperand(MachineOperand::CreateMBB(BB)); PHI->addOperand(MachineOperand::CreateMBB(BB));
} }
} }
@ -999,7 +1000,8 @@ SelectionDAGISel::FinishBasicBlock() {
// handle them the right number of times. // handle them the right number of times.
while ((BB = SDL->SwitchCases[i].TrueBB)) { // Handle LHS and RHS. while ((BB = SDL->SwitchCases[i].TrueBB)) { // Handle LHS and RHS.
// If new BB's are created during scheduling, the edges may have been // 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 = DenseMap<MachineBasicBlock*, MachineBasicBlock*>::iterator EI =
SDL->EdgeMapping.find(BB); SDL->EdgeMapping.find(BB);
if (EI != SDL->EdgeMapping.end()) if (EI != SDL->EdgeMapping.end())

View File

@ -2920,12 +2920,15 @@ ARMTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
F->insert(It, sinkMBB); F->insert(It, sinkMBB);
// Update machine-CFG edges by first adding 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. // block to the new block which will contain the Phi node for the select.
for(MachineBasicBlock::succ_iterator i = BB->succ_begin(), // Also inform sdisel of the edge changes.
e = BB->succ_end(); i != e; ++i) for (MachineBasicBlock::succ_iterator I = BB->succ_begin(),
sinkMBB->addSuccessor(*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 // Next, remove all successors of the current block, and add the true
// and fallthrough blocks as its successors. // and fallthrough blocks as its successors.
while(!BB->succ_empty()) while (!BB->succ_empty())
BB->removeSuccessor(BB->succ_begin()); BB->removeSuccessor(BB->succ_begin());
BB->addSuccessor(copy0MBB); BB->addSuccessor(copy0MBB);
BB->addSuccessor(sinkMBB); BB->addSuccessor(sinkMBB);

View File

@ -855,6 +855,11 @@ AlphaTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
MachineBasicBlock *llscMBB = F->CreateMachineBasicBlock(LLVM_BB); MachineBasicBlock *llscMBB = F->CreateMachineBasicBlock(LLVM_BB);
MachineBasicBlock *sinkMBB = 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); sinkMBB->transferSuccessors(thisMBB);
F->insert(It, llscMBB); F->insert(It, llscMBB);

View File

@ -712,6 +712,10 @@ MSP430TargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
.addImm(MI->getOperand(3).getImm()); .addImm(MI->getOperand(3).getImm());
F->insert(I, copy0MBB); F->insert(I, copy0MBB);
F->insert(I, copy1MBB); 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 // 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. // block to the new block which will contain the Phi node for the select.
copy1MBB->transferSuccessors(BB); copy1MBB->transferSuccessors(BB);

View File

@ -308,9 +308,12 @@ MipsTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
F->insert(It, sinkMBB); F->insert(It, sinkMBB);
// Update machine-CFG edges by first adding 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. // 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(), 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); sinkMBB->addSuccessor(*i);
}
// Next, remove all successors of the current block, and add the true // Next, remove all successors of the current block, and add the true
// and fallthrough blocks as its successors. // and fallthrough blocks as its successors.
while(!BB->succ_empty()) while(!BB->succ_empty())

View File

@ -1840,9 +1840,18 @@ PIC16TargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
F->insert(It, copy0MBB); F->insert(It, copy0MBB);
F->insert(It, sinkMBB); 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. // 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. // Next, add the true and fallthrough blocks as its successors.
BB->addSuccessor(copy0MBB); BB->addSuccessor(copy0MBB);
BB->addSuccessor(sinkMBB); BB->addSuccessor(sinkMBB);

View File

@ -4525,9 +4525,18 @@ PPCTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
.addImm(SelectPred).addReg(MI->getOperand(1).getReg()).addMBB(sinkMBB); .addImm(SelectPred).addReg(MI->getOperand(1).getReg()).addMBB(sinkMBB);
F->insert(It, copy0MBB); F->insert(It, copy0MBB);
F->insert(It, sinkMBB); 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. // 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. // Next, add the true and fallthrough blocks as its successors.
BB->addSuccessor(copy0MBB); BB->addSuccessor(copy0MBB);
BB->addSuccessor(sinkMBB); BB->addSuccessor(sinkMBB);

View File

@ -990,9 +990,18 @@ SparcTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
BuildMI(BB, dl, TII.get(BROpcode)).addMBB(sinkMBB).addImm(CC); BuildMI(BB, dl, TII.get(BROpcode)).addMBB(sinkMBB).addImm(CC);
F->insert(It, copy0MBB); F->insert(It, copy0MBB);
F->insert(It, sinkMBB); 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. // 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. // Next, add the true and fallthrough blocks as its successors.
BB->addSuccessor(copy0MBB); BB->addSuccessor(copy0MBB);
BB->addSuccessor(sinkMBB); BB->addSuccessor(sinkMBB);

View File

@ -810,6 +810,10 @@ SystemZTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
BuildMI(BB, dl, TII.getBrCond(CC)).addMBB(copy1MBB); BuildMI(BB, dl, TII.getBrCond(CC)).addMBB(copy1MBB);
F->insert(I, copy0MBB); F->insert(I, copy0MBB);
F->insert(I, copy1MBB); 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 // 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. // block to the new block which will contain the Phi node for the select.
copy1MBB->transferSuccessors(BB); copy1MBB->transferSuccessors(BB);

View File

@ -7675,16 +7675,10 @@ X86TargetLowering::EmitPCMP(MachineInstr *MI, MachineBasicBlock *BB,
const TargetInstrInfo *TII = getTargetMachine().getInstrInfo(); const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
unsigned Opc; unsigned Opc;
if (memArg)
if (memArg) { Opc = numArgs == 3 ? X86::PCMPISTRM128rm : X86::PCMPESTRM128rm;
Opc = numArgs == 3 ? else
X86::PCMPISTRM128rm : Opc = numArgs == 3 ? X86::PCMPISTRM128rr : X86::PCMPESTRM128rr;
X86::PCMPESTRM128rm;
} else {
Opc = numArgs == 3 ?
X86::PCMPISTRM128rr :
X86::PCMPESTRM128rr;
}
MachineInstrBuilder MIB = BuildMI(BB, dl, TII->get(Opc)); MachineInstrBuilder MIB = BuildMI(BB, dl, TII->get(Opc));
@ -7773,7 +7767,8 @@ X86TargetLowering::EmitVAStartSaveXMMRegsWithCustomInserter(
MachineBasicBlock * MachineBasicBlock *
X86TargetLowering::EmitLoweredSelect(MachineInstr *MI, X86TargetLowering::EmitLoweredSelect(MachineInstr *MI,
MachineBasicBlock *BB) const { MachineBasicBlock *BB,
DenseMap<MachineBasicBlock*, MachineBasicBlock*> *EM) const {
const TargetInstrInfo *TII = getTargetMachine().getInstrInfo(); const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
DebugLoc DL = MI->getDebugLoc(); DebugLoc DL = MI->getDebugLoc();
@ -7800,10 +7795,18 @@ X86TargetLowering::EmitLoweredSelect(MachineInstr *MI,
BuildMI(BB, DL, TII->get(Opc)).addMBB(sinkMBB); BuildMI(BB, DL, TII->get(Opc)).addMBB(sinkMBB);
F->insert(It, copy0MBB); F->insert(It, copy0MBB);
F->insert(It, sinkMBB); 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. // 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. // Add the true and fallthrough blocks as its successors.
BB->addSuccessor(copy0MBB); BB->addSuccessor(copy0MBB);
BB->addSuccessor(sinkMBB); BB->addSuccessor(sinkMBB);
@ -7842,7 +7845,7 @@ X86TargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
case X86::CMOV_V4F32: case X86::CMOV_V4F32:
case X86::CMOV_V2F64: case X86::CMOV_V2F64:
case X86::CMOV_V2I64: case X86::CMOV_V2I64:
return EmitLoweredSelect(MI, BB); return EmitLoweredSelect(MI, BB, EM);
case X86::FP32_TO_INT16_IN_MEM: case X86::FP32_TO_INT16_IN_MEM:
case X86::FP32_TO_INT32_IN_MEM: case X86::FP32_TO_INT32_IN_MEM:

View File

@ -740,7 +740,8 @@ namespace llvm {
MachineBasicBlock *BB) const; MachineBasicBlock *BB) const;
MachineBasicBlock *EmitLoweredSelect(MachineInstr *I, 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 /// Emit nodes that will be selected as "test Op0,Op0", or something
/// equivalent, for use with the given x86 condition code. /// equivalent, for use with the given x86 condition code.

View File

@ -1010,9 +1010,18 @@ XCoreTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
.addReg(MI->getOperand(1).getReg()).addMBB(sinkMBB); .addReg(MI->getOperand(1).getReg()).addMBB(sinkMBB);
F->insert(It, copy0MBB); F->insert(It, copy0MBB);
F->insert(It, sinkMBB); 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. // 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. // Next, add the true and fallthrough blocks as its successors.
BB->addSuccessor(copy0MBB); BB->addSuccessor(copy0MBB);
BB->addSuccessor(sinkMBB); BB->addSuccessor(sinkMBB);

View 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
}