diff options
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp | 8 | 
1 files changed, 7 insertions, 1 deletions
| diff --git a/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp b/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp index a04ccfea361..b8664b0d4a1 100644 --- a/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp +++ b/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp @@ -206,7 +206,10 @@ void CodeGenPrepare::EliminateMostlyEmptyBlock(BasicBlock *BB) {    if (DestBB->getSinglePredecessor()) {      // If DestBB has single-entry PHI nodes, fold them.      while (PHINode *PN = dyn_cast<PHINode>(DestBB->begin())) { -      PN->replaceAllUsesWith(PN->getIncomingValue(0)); +      Value *NewVal = PN->getIncomingValue(0); +      // Replace self referencing PHI with undef, it must be dead. +      if (NewVal == PN) NewVal = UndefValue::get(PN->getType()); +      PN->replaceAllUsesWith(NewVal);        PN->eraseFromParent();      } @@ -569,6 +572,9 @@ static bool FindMaximalLegalAddressingMode(Value *Addr, const Type *AccessTy,    if (Instruction *I = dyn_cast_or_null<Instruction>(AddrInst))      AddrModeInsts.push_back(I); +  if (AddrInst && !AddrInst->hasOneUse()) +    ; +  else    switch (Opcode) {    case Instruction::PtrToInt:      // PtrToInt is always a noop, as we know that the int type is pointer sized. | 

