diff options
| author | Vedant Kumar <vsk@apple.com> | 2019-10-08 17:17:51 +0000 |
|---|---|---|
| committer | Vedant Kumar <vsk@apple.com> | 2019-10-08 17:17:51 +0000 |
| commit | 9852699dcb18dd26866695a861e31a07bcc16e82 (patch) | |
| tree | fd4fcadee38bbfaf30f60fa0d7f816fe9b4f413d /llvm/unittests/Transforms/Utils | |
| parent | d8245e7a36d50310c85cbefe6b79f27f745e7cee (diff) | |
| download | bcm5719-llvm-9852699dcb18dd26866695a861e31a07bcc16e82.tar.gz bcm5719-llvm-9852699dcb18dd26866695a861e31a07bcc16e82.zip | |
[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
llvm-svn: 374089
Diffstat (limited to 'llvm/unittests/Transforms/Utils')
| -rw-r--r-- | llvm/unittests/Transforms/Utils/CodeExtractorTest.cpp | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/llvm/unittests/Transforms/Utils/CodeExtractorTest.cpp b/llvm/unittests/Transforms/Utils/CodeExtractorTest.cpp index 9213be72697..29864e54198 100644 --- a/llvm/unittests/Transforms/Utils/CodeExtractorTest.cpp +++ b/llvm/unittests/Transforms/Utils/CodeExtractorTest.cpp @@ -62,7 +62,8 @@ TEST(CodeExtractor, ExitStub) { CodeExtractor CE(Candidates); EXPECT_TRUE(CE.isEligible()); - Function *Outlined = CE.extractCodeRegion(); + CodeExtractorAnalysisCache CEAC(*Func); + Function *Outlined = CE.extractCodeRegion(CEAC); EXPECT_TRUE(Outlined); BasicBlock *Exit = getBlockByName(Func, "notExtracted"); BasicBlock *ExitSplit = getBlockByName(Outlined, "notExtracted.split"); @@ -112,7 +113,8 @@ TEST(CodeExtractor, ExitPHIOnePredFromRegion) { CodeExtractor CE(ExtractedBlocks); EXPECT_TRUE(CE.isEligible()); - Function *Outlined = CE.extractCodeRegion(); + CodeExtractorAnalysisCache CEAC(*Func); + Function *Outlined = CE.extractCodeRegion(CEAC); EXPECT_TRUE(Outlined); BasicBlock *Exit1 = getBlockByName(Func, "exit1"); BasicBlock *Exit2 = getBlockByName(Func, "exit2"); @@ -186,7 +188,8 @@ TEST(CodeExtractor, StoreOutputInvokeResultAfterEHPad) { CodeExtractor CE(ExtractedBlocks); EXPECT_TRUE(CE.isEligible()); - Function *Outlined = CE.extractCodeRegion(); + CodeExtractorAnalysisCache CEAC(*Func); + Function *Outlined = CE.extractCodeRegion(CEAC); EXPECT_TRUE(Outlined); EXPECT_FALSE(verifyFunction(*Outlined, &errs())); EXPECT_FALSE(verifyFunction(*Func, &errs())); @@ -220,7 +223,8 @@ TEST(CodeExtractor, StoreOutputInvokeResultInExitStub) { CodeExtractor CE(Blocks); EXPECT_TRUE(CE.isEligible()); - Function *Outlined = CE.extractCodeRegion(); + CodeExtractorAnalysisCache CEAC(*Func); + Function *Outlined = CE.extractCodeRegion(CEAC); EXPECT_TRUE(Outlined); EXPECT_FALSE(verifyFunction(*Outlined)); EXPECT_FALSE(verifyFunction(*Func)); @@ -271,7 +275,8 @@ TEST(CodeExtractor, ExtractAndInvalidateAssumptionCache) { CodeExtractor CE(Blocks, nullptr, false, nullptr, nullptr, &AC); EXPECT_TRUE(CE.isEligible()); - Function *Outlined = CE.extractCodeRegion(); + CodeExtractorAnalysisCache CEAC(*Func); + Function *Outlined = CE.extractCodeRegion(CEAC); EXPECT_TRUE(Outlined); EXPECT_FALSE(verifyFunction(*Outlined)); EXPECT_FALSE(verifyFunction(*Func)); |

