]> granicus.if.org Git - llvm/commit
[CodeExtractor] Factor out and reuse shrinkwrap analysis
authorVedant Kumar <vsk@apple.com>
Tue, 8 Oct 2019 17:17:51 +0000 (17:17 +0000)
committerVedant Kumar <vsk@apple.com>
Tue, 8 Oct 2019 17:17:51 +0000 (17:17 +0000)
commit742c52472ca095493229de94b68aa7d9e3bcc7ac
tree4299e8231d31199ba1af508e07b509b34d9602e3
parent80fd3bf4c9bfded822dab157055a99c907d7b018
[CodeExtractor] Factor out and reuse shrinkwrap analysis

Factor out CodeExtractor's analysis of allocas (for shrinkwrapping
purposes), and allow the analysis to be reused.

This resolves a quadratic compile-time bug observed when compiling
AMDGPUDisassembler.cpp.o.

Pre-patch (Release + LTO clang):

```
   ---User Time---   --System Time--   --User+System--   ---Wall Time---  --- Name ---
  176.5278 ( 57.8%)   0.4915 ( 18.5%)  177.0192 ( 57.4%)  177.4112 ( 57.3%)  Hot Cold Splitting
```

Post-patch (ReleaseAsserts clang):

```
   ---User Time---   --System Time--   --User+System--   ---Wall Time---  --- Name ---
  1.4051 (  3.3%)   0.0079 (  0.3%)   1.4129 (  3.2%)   1.4129 (  3.2%)  Hot Cold Splitting
```

Testing: check-llvm, and comparing the AMDGPUDisassembler.cpp.o binary
pre- vs. post-patch.

An alternate approach is to hide CodeExtractorAnalysisCache from clients
of CodeExtractor, and to recompute the analysis from scratch inside of
CodeExtractor::extractCodeRegion(). This eliminates some redundant work
in the shrinkwrapping legality check. However, some clients continue to
exhibit O(n^2) compile time behavior as computing the analysis is O(n).

rdar://55912966

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374089 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Transforms/IPO/HotColdSplitting.h
include/llvm/Transforms/Utils/CodeExtractor.h
lib/Transforms/IPO/BlockExtractor.cpp
lib/Transforms/IPO/HotColdSplitting.cpp
lib/Transforms/IPO/LoopExtractor.cpp
lib/Transforms/IPO/PartialInlining.cpp
lib/Transforms/Utils/CodeExtractor.cpp
unittests/Transforms/Utils/CodeExtractorTest.cpp