diff --git a/lib/Analysis/ScalarEvolutionExpander.cpp b/lib/Analysis/ScalarEvolutionExpander.cpp
index 852c7a0..58181fb 100644
--- a/lib/Analysis/ScalarEvolutionExpander.cpp
+++ b/lib/Analysis/ScalarEvolutionExpander.cpp
@@ -35,9 +35,7 @@ Value *SCEVExpander::ReuseOrCreateCast(Value *V, Type *Ty,
   // InsertPt to ensure that the expression's expansion dominates its uses.
   // Assert that the requested insertion point works at least for new
   // instructions.
-
-  // FIXME: disabled to make the bots happy.
-  //assert(SE.DT->dominates(IP, Builder.GetInsertPoint()));
+  assert(SE.DT->dominates(IP, Builder.GetInsertPoint()));
 
   // Check to see if there is already a cast!
   for (Value::use_iterator UI = V->use_begin(), E = V->use_end();
diff --git a/lib/VMCore/Dominators.cpp b/lib/VMCore/Dominators.cpp
index d052f24..689a089 100644
--- a/lib/VMCore/Dominators.cpp
+++ b/lib/VMCore/Dominators.cpp
@@ -83,15 +83,25 @@ void DominatorTree::print(raw_ostream &OS, const Module *) const {
 // dominates - Return true if A dominates a use in B. This performs the
 // special checks necessary if A and B are in the same basic block.
 bool DominatorTree::dominates(const Instruction *A, const Instruction *B) const{
+  // This is needed to handle A and B being the same invoke.
+  if (A == B)
+    return true;
+
   const BasicBlock *BBA = A->getParent(), *BBB = B->getParent();
 
   // If A is an invoke instruction, its value is only available in this normal
   // successor block.
-  if (const InvokeInst *II = dyn_cast<InvokeInst>(A))
+  const InvokeInst *II = dyn_cast<InvokeInst>(A);
+  if (II)
     BBA = II->getNormalDest();
 
   if (BBA != BBB) return dominates(BBA, BBB);
 
+  // If A is an invoke, it dominates anything on the normal successor block.
+  // FIXME: Should it dominate phis?
+  if (II)
+    return true;
+
   // It is not possible to determine dominance between two PHI nodes
   // based on their ordering.
   if (isa<PHINode>(A) && isa<PHINode>(B))
diff --git a/test/Transforms/LoopStrengthReduce/normal_successor.ll b/test/Transforms/LoopStrengthReduce/normal_successor.ll
new file mode 100644
index 0000000..078b542
--- /dev/null
+++ b/test/Transforms/LoopStrengthReduce/normal_successor.ll
@@ -0,0 +1,53 @@
+; RUN: opt < %s -loop-reduce
+
+define void @f(i32* %foo) {
+entry:
+  br label %arrayctor.loop
+
+arrayctor.loop:                                   ; preds = %invoke.cont, %entry
+  %arrayctor.cur = phi i32* [ %foo, %entry ], [ %arrayctor.next, %invoke.cont ]
+  invoke void @g(i32* null)
+          to label %invoke.cont unwind label %lpad
+
+invoke.cont:                                      ; preds = %arrayctor.loop
+  %arrayctor.next = getelementptr inbounds i32* %arrayctor.cur, i64 1
+  %arrayctor.done = icmp eq i32* %arrayctor.next, null
+  br label %arrayctor.loop
+
+lpad:                                             ; preds = %arrayctor.loop
+  %tmp2 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
+          cleanup
+  ret void
+}
+
+declare i32 @__gxx_personality_v0(...)
+
+declare void @g(i32*)
+
+%"class.std::list" = type { %"class.std::_List_base" }
+%"class.std::_List_base" = type { %"struct.std::_List_base<double, std::allocator<double> >::_List_impl" }
+%"struct.std::_List_base<double, std::allocator<double> >::_List_impl" = type { %"struct.std::__detail::_List_node_base" }
+%"struct.std::__detail::_List_node_base" = type { i8 }
+
+define i32 @_Z15number_of_testsi(i32 %size, i64 %foo, double* %xyz) uwtable {
+entry:
+  %add.ptr.i4 = getelementptr inbounds double* %xyz, i64 %foo
+  br label %for.body.i.i.i.i
+
+for.body.i.i.i.i:                                 ; preds = %.noexc1, %entry
+  %incdec.ptr13.i.i.i.i = phi double* [ %incdec.ptr.i.i.i.i, %.noexc1 ], [ %xyz, %entry ]
+  invoke void @_ZNSt4listIdSaIdEE9push_backERKd(%"class.std::list"* undef, double* %incdec.ptr13.i.i.i.i)
+          to label %.noexc1 unwind label %lpad
+
+.noexc1:                                          ; preds = %for.body.i.i.i.i
+  %incdec.ptr.i.i.i.i = getelementptr inbounds double* %incdec.ptr13.i.i.i.i, i32 1
+  %cmp.i.i.i.i = icmp eq double* %incdec.ptr.i.i.i.i, %add.ptr.i4
+  br label %for.body.i.i.i.i
+
+lpad:                                             ; preds = %for.body.i.i.i.i
+  %lpad.us-lcssa5 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
+          cleanup
+  resume { i8*, i32 } undef
+}
+
+declare void @_ZNSt4listIdSaIdEE9push_backERKd(%"class.std::list"*, double*)
