From 28e792c2323a878e6a4661f043f10affc804cca2 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 18 Oct 2004 01:21:17 +0000 Subject: [PATCH] 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 --- lib/Transforms/Utils/PromoteMemoryToRegister.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/Transforms/Utils/PromoteMemoryToRegister.cpp b/lib/Transforms/Utils/PromoteMemoryToRegister.cpp index 49499c65e0d..3311bd1c20b 100644 --- a/lib/Transforms/Utils/PromoteMemoryToRegister.cpp +++ b/lib/Transforms/Utils/PromoteMemoryToRegister.cpp @@ -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(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(V) || - dominates(cast(V)->getParent(), I->first)) { + if (!isa(V) || dominates(cast(V), PNs[i])) { PNs[i]->replaceAllUsesWith(V); PNs[i]->eraseFromParent(); PNs[i] = 0;