From f7b5d2de13fce734724d9e062fe2307e3449c8ea Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Wed, 21 Sep 2016 20:05:23 -0700 Subject: [PATCH] SIL Optimizer: Fix bug in EscapeAnalysis::isReachable() We weren't clearing the worklist flags if returning true here. Oops! This would manifest as alias analysis returning different results for the same operands over time, which confused ARC code motion into dropping release instructions. --- lib/SILOptimizer/Analysis/EscapeAnalysis.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/SILOptimizer/Analysis/EscapeAnalysis.cpp b/lib/SILOptimizer/Analysis/EscapeAnalysis.cpp index 89f47ac688cf4..a505fdc39ba32 100644 --- a/lib/SILOptimizer/Analysis/EscapeAnalysis.cpp +++ b/lib/SILOptimizer/Analysis/EscapeAnalysis.cpp @@ -560,8 +560,10 @@ bool EscapeAnalysis::ConnectionGraph::isReachable(CGNode *From, CGNode *To) { From->isInWorkList = true; for (unsigned Idx = 0; Idx < WorkList.size(); ++Idx) { CGNode *Reachable = WorkList[Idx]; - if (Reachable == To) + if (Reachable == To) { + clearWorkListFlags(WorkList); return true; + } for (Predecessor Pred : Reachable->Preds) { CGNode *PredNode = Pred.getPointer(); if (!PredNode->isInWorkList) {