Fix: CodeExtractor/2004-11-12-InvokeExtract.ll

llvm-svn: 17699
This commit is contained in:
Chris Lattner 2004-11-13 00:06:45 +00:00
parent 8cc98850f9
commit 9b0291b18d
1 changed files with 16 additions and 2 deletions

View File

@ -488,6 +488,9 @@ emitCallAndSwitchStatement(Function *newFunction, BasicBlock *codeReplacer,
// For an invoke, the normal destination is the only one that is // For an invoke, the normal destination is the only one that is
// dominated by the result of the invocation // dominated by the result of the invocation
BasicBlock *DefBlock = cast<Instruction>(outputs[out])->getParent(); BasicBlock *DefBlock = cast<Instruction>(outputs[out])->getParent();
bool DominatesDef = true;
if (InvokeInst *Invoke = dyn_cast<InvokeInst>(outputs[out])) { if (InvokeInst *Invoke = dyn_cast<InvokeInst>(outputs[out])) {
DefBlock = Invoke->getNormalDest(); DefBlock = Invoke->getNormalDest();
@ -500,9 +503,18 @@ emitCallAndSwitchStatement(Function *newFunction, BasicBlock *codeReplacer,
DefBlock = I->first; DefBlock = I->first;
break; break;
} }
// In the extract block case, if the block we are extracting ends
// with an invoke instruction, make sure that we don't emit a
// store of the invoke value for the unwind block.
if (!DS && DefBlock != OldTarget)
DominatesDef = false;
} }
if (!DS || DS->dominates(DefBlock, TI->getParent())) if (DS)
DominatesDef = DS->dominates(DefBlock, OldTarget);
if (DominatesDef) {
if (AggregateArgs) { if (AggregateArgs) {
std::vector<Value*> Indices; std::vector<Value*> Indices;
Indices.push_back(Constant::getNullValue(Type::UIntTy)); Indices.push_back(Constant::getNullValue(Type::UIntTy));
@ -512,8 +524,10 @@ emitCallAndSwitchStatement(Function *newFunction, BasicBlock *codeReplacer,
"gep_" + outputs[out]->getName(), "gep_" + outputs[out]->getName(),
NTRet); NTRet);
new StoreInst(outputs[out], GEP, NTRet); new StoreInst(outputs[out], GEP, NTRet);
} else } else {
new StoreInst(outputs[out], OAI, NTRet); new StoreInst(outputs[out], OAI, NTRet);
}
}
// Advance output iterator even if we don't emit a store // Advance output iterator even if we don't emit a store
if (!AggregateArgs) ++OAI; if (!AggregateArgs) ++OAI;
} }