COFF: Teach ICF to merge cyclic graphs.
Previously, LLD's ICF couldn't merge cyclic graphs. That was unfortunate because, in COFF, cyclic graphs are not exceptional at all. That is pretty common. In this patch, sections are grouped by Tarjan's strongly connected component algorithm to get acyclic graphs. And then we try to merge SCCs whose outdegree is zero, and remove them from the graph. This makes other SCCs to have outdegree zero, so we can repeat the process until all SCCs are removed. When comparing two SCCs, we handle cycles properly. This algorithm works better than previous one. Previously, self-linking produced a 29.0MB executable. It now produces a 27.7MB. There's still some gap compared to MSVC linker which produces a 27.1MB executable for the same input. So the gap is narrowed, but still LLD is not on par with MSVC. I'll investigate that later. llvm-svn: 247387
Loading
Please sign in to comment