mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-22 20:20:03 +00:00
Fix a bug that occurs when the constant value is the result of an invoke. In
particular, invoke ret values are only live in the normal dest of the invoke not in the unwind dest. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17108 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
963869e41a
commit
28e792c232
@ -95,10 +95,12 @@ namespace {
|
||||
|
||||
void run();
|
||||
|
||||
/// dominates - Return true if BB1 dominates BB2 using the DT.
|
||||
/// dominates - Return true if I1 dominates I2 using the DominatorTree.
|
||||
///
|
||||
bool dominates(BasicBlock *BB1, BasicBlock *BB2) const {
|
||||
return DT[BB1]->dominates(DT[BB2]);
|
||||
bool dominates(Instruction *I1, Instruction *I2) const {
|
||||
if (InvokeInst *II = dyn_cast<InvokeInst>(I1))
|
||||
I1 = II->getNormalDest()->begin();
|
||||
return DT[I1->getParent()]->dominates(DT[I2->getParent()]);
|
||||
}
|
||||
|
||||
private:
|
||||
@ -339,8 +341,7 @@ void PromoteMem2Reg::run() {
|
||||
for (unsigned i = 0, e = PNs.size(); i != e; ++i)
|
||||
if (PNs[i]) {
|
||||
if (Value *V = hasConstantValue(PNs[i])) {
|
||||
if (!isa<Instruction>(V) ||
|
||||
dominates(cast<Instruction>(V)->getParent(), I->first)) {
|
||||
if (!isa<Instruction>(V) || dominates(cast<Instruction>(V), PNs[i])) {
|
||||
PNs[i]->replaceAllUsesWith(V);
|
||||
PNs[i]->eraseFromParent();
|
||||
PNs[i] = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user