[LCSSA] Efficiently compute blocks dominating at least one exit.
authorDavide Italiano <davide@freebsd.org>
Thu, 13 Apr 2017 20:36:59 +0000 (20:36 +0000)
committerDavide Italiano <davide@freebsd.org>
Thu, 13 Apr 2017 20:36:59 +0000 (20:36 +0000)
commitaf36d02430d66212c6bcab713199f2ab74c03a16
treee938115046a1ebe11d370eec3710e0a5e835d54a
parentdbc9ba306198f7793cf29dcbd014151a012facf1
[LCSSA] Efficiently compute blocks dominating at least one exit.

For LCSSA purposes, loop BBs not dominating any of the exits aren't
interesting, as none of the values defined in these blocks can be
used outside the loop.

The way the code computed this information was by comparing each
BB of the loop with each of the exit blocks and ask the dominator tree
about their dominance relation. This is slow.

A more efficient way, implemented here, is that of starting from the
exit blocks and walking the dom upwards until we hit an header. By
transitivity, all the blocks we encounter in our path dominate an exit.

For the testcase provided in PR31851, this reduces compile time on
`opt -O2` by ~25%, going from 1m47s to 1m22s.

Thanks to Dan/MichaelZ for discussions/suggesting the approach/review.

Differential Revision:  https://reviews.llvm.org/D31843

llvm-svn: 300255
llvm/lib/Transforms/Utils/LCSSA.cpp