diff --git a/lib/Sema/AnalysisBasedWarnings.cpp b/lib/Sema/AnalysisBasedWarnings.cpp
index 60bf5a0..33cccb9 100644
--- a/lib/Sema/AnalysisBasedWarnings.cpp
+++ b/lib/Sema/AnalysisBasedWarnings.cpp
@@ -224,20 +224,28 @@ static void checkForFunctionCall(Sema &S, const FunctionDecl *FD,
                                  CFGBlock &Block, unsigned ExitID,
                                  llvm::SmallVectorImpl<RecursiveState> &States,
                                  RecursiveState State) {
-  unsigned ID = Block.getBlockID();
+  SmallVector<std::pair<CFGBlock *, RecursiveState>, 16> Stack;
+  Stack.emplace_back(&Block, State);
 
-  // A block's state can only move to a higher state.
-  if (States[ID] >= State)
-    return;
+  while (!Stack.empty()) {
+    CFGBlock &CurBlock = *Stack.back().first;
+    RecursiveState CurState = Stack.back().second;
+    Stack.pop_back();
+
+    unsigned ID = CurBlock.getBlockID();
 
-  States[ID] = State;
+    // A block's state can only move to a higher state.
+    if (States[ID] >= CurState)
+      continue;
+
+    States[ID] = CurState;
 
-  State = updateRecursiveState(FD, Block, ExitID, State);
+    CurState = updateRecursiveState(FD, CurBlock, ExitID, CurState);
 
-  for (CFGBlock::succ_iterator I = Block.succ_begin(), E = Block.succ_end();
-       I != E; ++I)
-    if (*I)
-      checkForFunctionCall(S, FD, **I, ExitID, States, State);
+    for (auto I = CurBlock.succ_rbegin(), E = CurBlock.succ_rend(); I != E; ++I)
+      if (*I)
+        Stack.emplace_back(*I, CurState);
+  }
 }
 
 static void checkRecursiveFunction(Sema &S, const FunctionDecl *FD,
