diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2012-03-15 15:52:59 +0000 | 
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2012-03-15 15:52:59 +0000 | 
| commit | f58927855b8017bea646eb1c1a7b38899a3eeeb9 (patch) | |
| tree | a5af8f73ff96655f816f42eeba36b29f79fb9786 /llvm/lib/Transforms | |
| parent | 2ee44a1e384244289bd3d7ae8ff3b5c1e3f3daa0 (diff) | |
| download | bcm5719-llvm-f58927855b8017bea646eb1c1a7b38899a3eeeb9.tar.gz bcm5719-llvm-f58927855b8017bea646eb1c1a7b38899a3eeeb9.zip | |
Short term fix for pr12270 before we change dominates to handle unreachable
code.
While here, reduce indentation.
llvm-svn: 152803
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/ObjCARC.cpp | 62 | 
1 files changed, 33 insertions, 29 deletions
| diff --git a/llvm/lib/Transforms/Scalar/ObjCARC.cpp b/llvm/lib/Transforms/Scalar/ObjCARC.cpp index 529ea326a75..9fdea8d1dfa 100644 --- a/llvm/lib/Transforms/Scalar/ObjCARC.cpp +++ b/llvm/lib/Transforms/Scalar/ObjCARC.cpp @@ -4024,36 +4024,40 @@ bool ObjCARCContract::runOnFunction(Function &F) {          Use &U = UI.getUse();          unsigned OperandNo = UI.getOperandNo();          ++UI; // Increment UI now, because we may unlink its element. -        if (Instruction *UserInst = dyn_cast<Instruction>(U.getUser())) -          if (Inst != UserInst && DT->dominates(Inst, UserInst)) { -            Changed = true; -            Instruction *Replacement = Inst; -            Type *UseTy = U.get()->getType(); -            if (PHINode *PHI = dyn_cast<PHINode>(UserInst)) { -              // For PHI nodes, insert the bitcast in the predecessor block. -              unsigned ValNo = -                PHINode::getIncomingValueNumForOperand(OperandNo); -              BasicBlock *BB = -                PHI->getIncomingBlock(ValNo); -              if (Replacement->getType() != UseTy) -                Replacement = new BitCastInst(Replacement, UseTy, "", -                                              &BB->back()); -              for (unsigned i = 0, e = PHI->getNumIncomingValues(); -                   i != e; ++i) -                if (PHI->getIncomingBlock(i) == BB) { -                  // Keep the UI iterator valid. -                  if (&PHI->getOperandUse( -                        PHINode::getOperandNumForIncomingValue(i)) == -                        &UI.getUse()) -                    ++UI; -                  PHI->setIncomingValue(i, Replacement); -                } -            } else { -              if (Replacement->getType() != UseTy) -                Replacement = new BitCastInst(Replacement, UseTy, "", UserInst); -              U.set(Replacement); -            } +        Instruction *UserInst = dyn_cast<Instruction>(U.getUser()); +        if (!UserInst) +          continue; +        // FIXME: dominates should return true for unreachable UserInst. +        if (!DT->isReachableFromEntry(UserInst->getParent()) || +            DT->dominates(Inst, UserInst)) { +          Changed = true; +          Instruction *Replacement = Inst; +          Type *UseTy = U.get()->getType(); +          if (PHINode *PHI = dyn_cast<PHINode>(UserInst)) { +            // For PHI nodes, insert the bitcast in the predecessor block. +            unsigned ValNo = +              PHINode::getIncomingValueNumForOperand(OperandNo); +            BasicBlock *BB = +              PHI->getIncomingBlock(ValNo); +            if (Replacement->getType() != UseTy) +              Replacement = new BitCastInst(Replacement, UseTy, "", +                                            &BB->back()); +            for (unsigned i = 0, e = PHI->getNumIncomingValues(); +                 i != e; ++i) +              if (PHI->getIncomingBlock(i) == BB) { +                // Keep the UI iterator valid. +                if (&PHI->getOperandUse( +                      PHINode::getOperandNumForIncomingValue(i)) == +                    &UI.getUse()) +                  ++UI; +                PHI->setIncomingValue(i, Replacement); +              } +          } else { +            if (Replacement->getType() != UseTy) +              Replacement = new BitCastInst(Replacement, UseTy, "", UserInst); +            U.set(Replacement);            } +        }        }        // If Arg is a no-op casted pointer, strip one level of casts and | 

