Fix a bug that occurs when the constant value is the result of an invoke. In
authorChris Lattner <sabre@nondot.org>
Mon, 18 Oct 2004 01:21:17 +0000 (01:21 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 18 Oct 2004 01:21:17 +0000 (01:21 +0000)
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

index 49499c65e0d5fd2bdc4ebf8f21f774100d3b9020..3311bd1c20bf78e32fdb2d769b1a3f17dbfd062a 100644 (file)
@@ -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;