Index: include/llvm/Analysis/AliasSetTracker.h =================================================================== --- include/llvm/Analysis/AliasSetTracker.h +++ include/llvm/Analysis/AliasSetTracker.h @@ -401,6 +401,7 @@ /// program to update the AST. If you don't use this, you would have dangling /// pointers to deleted instructions. void deleteValue(Value *PtrVal); + void deleteValue(Instruction *I); /// This method should be used whenever a preexisting value in the program is /// copied or cloned, introducing a new value. Note that it is ok for clients Index: lib/Analysis/AliasSetTracker.cpp =================================================================== --- lib/Analysis/AliasSetTracker.cpp +++ lib/Analysis/AliasSetTracker.cpp @@ -551,6 +551,14 @@ PointerMap.erase(I); } +void AliasSetTracker::deleteValue(Instruction *I) { + auto Loc = MemoryLocation::getOrNone(I); + if (Loc == None) + deleteValue((Value *)I); + else + deleteValue(const_cast(Loc->Ptr)); +} + // copyValue - This method should be used whenever a preexisting value in the // program is copied or cloned, introducing a new value. Note that it is ok for // clients that use this method to introduce the same value multiple times: if Index: lib/Transforms/Scalar/LICM.cpp =================================================================== --- lib/Transforms/Scalar/LICM.cpp +++ lib/Transforms/Scalar/LICM.cpp @@ -315,7 +315,10 @@ bool Promoted = false; // Loop over all of the alias sets in the tracker object. - for (AliasSet &AS : *CurAST) { + for (auto ASItB = CurAST->begin(), ASItE = CurAST->end(); + ASItB != ASItE;) { + auto &AS = *ASItB; + ++ASItB; // We can promote this alias set if it has a store, if it is a "Must" // alias set, if the pointer is loop invariant, and if we are not // eliminating any volatile loads or stores.