llvm-project/llvm
Adam Nemet 4ef096b0c2 Handle non-unique edges in edge-dominance
This removes a quadratic behavior in assert-enabled builds.

GVN propagates the equivalence from a condition into the blocks guarded by the
condition.  E.g. for 'if (a == 7) { ... }', 'a' will be replaced in the block
with 7.  It does this by replacing all the uses of 'a' that are dominated by
the true edge.

For a switch with N cases and U uses of the value, this will mean N * U calls
to 'dominates'.  Asserting isSingleEdge in 'dominates' make this N^2 * U
because this function checks for the uniqueness of the edge. I.e. traverses
each edge between the SwitchInst's block and the cases.

The change removes the assert and makes 'dominates' works correctly in the
presence of non-unique edges.

This brings build time down by an order of magnitude for an input that has
~10k cases in a switch statement.

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

llvm-svn: 304721
2017-06-05 16:27:09 +00:00
..
bindings [LLVM-C] [OCaml] Expose Type::subtypes. 2017-06-05 11:49:52 +00:00
cmake CMake: Fix docs-llvm-man target when clang+llvm is in the same source tree 2017-05-15 09:34:23 +00:00
docs [docs] Update name of vectorization interleave flag. 2017-05-31 23:02:55 +00:00
examples [Examples] Fix some Clang-tidy modernize-use-using and Include What You Use warnings; other minor fixes (NFC). 2017-05-26 00:00:14 +00:00
include Handle non-unique edges in edge-dominance 2017-06-05 16:27:09 +00:00
lib Handle non-unique edges in edge-dominance 2017-06-05 16:27:09 +00:00
projects Add temporary workaround to allow in-tree libc++ builds on Windows 2017-05-11 01:44:30 +00:00
resources
runtimes [CMake][runtimes] Add install target for runtimes builtins 2017-06-02 19:38:11 +00:00
test Symbols re-defined with -wrap and -defsym need to be excluded from inter- 2017-06-05 16:24:25 +00:00
tools Symbols re-defined with -wrap and -defsym need to be excluded from inter- 2017-06-05 16:24:25 +00:00
unittests Handle non-unique edges in edge-dominance 2017-06-05 16:27:09 +00:00
utils git-llvm: Update the project list for the llvm-project-20170507 monorepo. 2017-06-04 22:18:57 +00:00
.arcconfig
.clang-format
.clang-tidy
.gitignore
CMakeLists.txt Update the documentation and CMake file for Visual Studio generators. 2017-05-25 21:01:30 +00:00
CODE_OWNERS.TXT
CREDITS.TXT update of the url 2017-05-14 07:55:01 +00:00
LICENSE.TXT
LLVMBuild.txt
README.txt
RELEASE_TESTERS.TXT
configure
llvm.spec.in

README.txt

Low Level Virtual Machine (LLVM)
================================

This directory and its subdirectories contain source code for LLVM,
a toolkit for the construction of highly optimized compilers,
optimizers, and runtime environments.

LLVM is open source software. You may freely distribute it under the terms of
the license agreement found in LICENSE.txt.

Please see the documentation provided in docs/ for further
assistance with LLVM, and in particular docs/GettingStarted.rst for getting
started with LLVM and docs/README.txt for an overview of LLVM's
documentation setup.

If you are writing a package for LLVM, see docs/Packaging.rst for our
suggestions.