<div dir="rtl"><div dir="ltr">Hi Andy,</div><div dir="ltr"><br></div><div dir="ltr">The change from std::set to SetVector gains stable iteration order but loses stable iterators...</div><div dir="ltr">Specifically, it invalidates BlockColors[BB].end() after every remove(), so it should not be cached in the End variable. Even if we solve this by testing It != BlockColors[BB].end(), after removing the last item 'It' will be at the (new after removal) end()+1 and then compared to the (new after removal) end() which is probably undefined behaviour for an iterator. Finally, erasing items in a loop in a SetVector is quadratic complexity.</div><div dir="ltr"><br></div><div dir="ltr">To solve all at once, we could split the loop into two steps:</div><div dir="ltr"><br></div><div dir="ltr"><div dir="ltr">        for (BasicBlock *ContainingFunclet : BlockColors[BB])</div><div dir="ltr">          if (ContainingFunclet != CorrectColor)</div><div dir="ltr">            FuncletBlocks[ContainingFunclet].erase(BB);</div><div dir="ltr">        BlockColors[BB].remove_if([&](BasicBlock *ContainingFunclet) {</div><div dir="ltr">          return ContainingFunclet != CorrectColor;</div><div dir="ltr">        });</div><div><br></div></div><div dir="ltr">Please feel free to modify the attached patch and commit,<br></div><div dir="ltr"><br></div><div dir="ltr">Yaron</div><div dir="ltr"><br></div><div dir="ltr"><br></div><div dir="ltr"><br></div><br></div>