Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[MemorySSA] Fix exponential compile-time updating MemorySSA.
MemorySSAUpdater::getPreviousDefRecursive is a recursive algorithm, for each block, it computes the previous definition for each predecessor, then takes those definitions and combines them. But currently it doesn't remember results which it already computed; this means it can visit the same block multiple times, which adds up to exponential time overall. To fix this, this patch adds a cache. If we computed the result for a block already, we don't need to visit it again because we'll come up with the same result. Well, unless we RAUW a MemoryPHI; in that case, the TrackingVH will be updated automatically. This matches the original source paper for this algorithm. The testcase isn't really a test for the bug, but it adds coverage for the case where tryRemoveTrivialPhi erases an existing PHI node. (It's hard to write a good regression test for a performance issue.) Differential Revision: https://reviews.llvm.org/D44715 llvm-svn: 328577
- Loading branch information
Eli Friedman
committed
Mar 26, 2018
1 parent
93ce248
commit 88e2bac
Showing
3 changed files
with
89 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
; RUN: opt < %s -gvn-hoist -S | FileCheck %s | ||
|
||
; This test is meant to make sure that MemorySSAUpdater works correctly | ||
; in non-trivial cases. | ||
|
||
; CHECK: if.else218: | ||
; CHECK-NEXT: %0 = getelementptr inbounds %s, %s* undef, i32 0, i32 0 | ||
; CHECK-NEXT: %1 = load i32, i32* %0, align 4 | ||
|
||
target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" | ||
|
||
%s = type { i32, %s**, [3 x i8], i8 } | ||
|
||
define void @test() { | ||
entry: | ||
br label %cond.end118 | ||
|
||
cond.end118: ; preds = %entry | ||
br i1 undef, label %cleanup, label %if.end155 | ||
|
||
if.end155: ; preds = %cond.end118 | ||
br label %while.cond | ||
|
||
while.cond: ; preds = %while.body, %if.end155 | ||
br i1 undef, label %while.end, label %while.body | ||
|
||
while.body: ; preds = %while.cond | ||
br label %while.cond | ||
|
||
while.end: ; preds = %while.cond | ||
switch i32 undef, label %if.else218 [ | ||
i32 1, label %cleanup | ||
i32 0, label %if.then174 | ||
] | ||
|
||
if.then174: ; preds = %while.end | ||
unreachable | ||
|
||
if.else218: ; preds = %while.end | ||
br i1 undef, label %if.then226, label %if.else326 | ||
|
||
if.then226: ; preds = %if.else218 | ||
%size227 = getelementptr inbounds %s, %s* undef, i32 0, i32 0 | ||
%0 = load i32, i32* %size227, align 4 | ||
unreachable | ||
|
||
if.else326: ; preds = %if.else218 | ||
%size330 = getelementptr inbounds %s, %s* undef, i32 0, i32 0 | ||
%1 = load i32, i32* %size330, align 4 | ||
unreachable | ||
|
||
cleanup: ; preds = %while.end, %cond.end118 | ||
ret void | ||
} |