Index: lib/Transforms/Utils/LoopVersioning.cpp =================================================================== --- lib/Transforms/Utils/LoopVersioning.cpp +++ lib/Transforms/Utils/LoopVersioning.cpp @@ -61,6 +61,8 @@ // Add the memcheck in the original preheader (this is empty initially). BasicBlock *RuntimeCheckBB = VersionedLoop->getLoopPreheader(); + bool CheckDominatesExit = DT->dominates(RuntimeCheckBB, + VersionedLoop->getExitBlock()); std::tie(FirstCheckInst, MemRuntimeCheck) = LAI.addRuntimeChecks(RuntimeCheckBB->getTerminator(), AliasChecks); @@ -112,9 +114,13 @@ VersionedLoop->getLoopPreheader(), RuntimeCheck, OrigTerm); OrigTerm->eraseFromParent(); - // The loops merge in the original exit block. This is now dominated by the - // memchecking block. - DT->changeImmediateDominator(VersionedLoop->getExitBlock(), RuntimeCheckBB); + // The loops merge in the original exit block. This should now be dominated + // by the memchecking block, but several loops may share the same exit block, + // so it may already be dominated by one of memcheck dominators. Only if + // the exit block is dominated by memcheck block in original loop, update its + // idom. + if (CheckDominatesExit) + DT->changeImmediateDominator(VersionedLoop->getExitBlock(), RuntimeCheckBB); // Adds the necessary PHI nodes for the versioned loops based on the // loop-defined values used outside of the loop. Index: test/Transforms/LoopVersioning/noalias-version-twice.ll =================================================================== --- test/Transforms/LoopVersioning/noalias-version-twice.ll +++ test/Transforms/LoopVersioning/noalias-version-twice.ll @@ -1,4 +1,4 @@ -; RUN: opt -basicaa -loop-distribute -scoped-noalias -loop-versioning -S < %s | FileCheck %s +; RUN: opt -basicaa -loop-distribute -scoped-noalias -loop-versioning -verify-dom-info -S < %s | FileCheck %s ; Test the metadata generated when versioning an already versioned loop. Here ; we invoke loop distribution to perform the first round of versioning. It