Index: lib/Transforms/Utils/LoopRotationUtils.cpp
===================================================================
--- lib/Transforms/Utils/LoopRotationUtils.cpp
+++ lib/Transforms/Utils/LoopRotationUtils.cpp
@@ -295,7 +295,7 @@
   // Begin by walking OrigHeader and populating ValueMap with an entry for
   // each Instruction.
   BasicBlock::iterator I = OrigHeader->begin(), E = OrigHeader->end();
-  ValueToValueMapTy ValueMap;
+  ValueToValueMapTy ValueMap, ValueMapMSSA;
 
   // For PHI nodes, the value available in OldPreHeader is just the
   // incoming value from OldPreHeader.
@@ -374,6 +374,9 @@
       if (auto *II = dyn_cast<IntrinsicInst>(C))
         if (II->getIntrinsicID() == Intrinsic::assume)
           AC->registerAssumption(II);
+      // MemorySSA cares whether the cloned instruction was inserted or not, and
+      // not whether it can be remapped to a simplified value.
+      ValueMapMSSA[Inst] = C;
     }
   }
 
@@ -391,10 +394,11 @@
   LoopEntryBranch->eraseFromParent();
 
   // Update MemorySSA before the rewrite call below changes the 1:1
-  // instruction:cloned_instruction_or_value mapping in ValueMap.
+  // instruction:cloned_instruction_or_value mapping.
   if (MSSAU) {
-    ValueMap[OrigHeader] = OrigPreheader;
-    MSSAU->updateForClonedBlockIntoPred(OrigHeader, OrigPreheader, ValueMap);
+    ValueMapMSSA[OrigHeader] = OrigPreheader;
+    MSSAU->updateForClonedBlockIntoPred(OrigHeader, OrigPreheader,
+                                        ValueMapMSSA);
   }
 
   SmallVector<PHINode*, 2> InsertedPHIs;
Index: test/Analysis/MemorySSA/loop-rotate-valuemap.ll
===================================================================
--- /dev/null
+++ test/Analysis/MemorySSA/loop-rotate-valuemap.ll
@@ -0,0 +1,26 @@
+; RUN: opt -loop-rotate -enable-mssa-loop-dependency %s -S | FileCheck %s
+; REQUIRES: asserts
+
+; Check that loop rotate keeps proper mapping between cloned instructions,
+; otherwise, MemorySSA will assert.
+
+; CHECK-LABEL: @f
+define void @f() {
+entry:
+  br label %for.body16
+
+for.cond.cleanup15:                               ; preds = %for.body16
+  ret void
+
+for.body16:                                       ; preds = %for.body16.for.body16_crit_edge, %entry
+  %call.i = tail call float @expf(float 0.000000e+00) #1
+  %0 = load float*, float** undef, align 8
+  br i1 undef, label %for.cond.cleanup15, label %for.body16.for.body16_crit_edge
+
+for.body16.for.body16_crit_edge:                  ; preds = %for.body16
+  %.pre = load float, float* undef, align 8
+  br label %for.body16
+}
+
+declare float @expf(float)
+