[llvm] 1398104 - [DSE, MemorySSA] Account for ScanLimit == 0 on entry.
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 17 09:55:30 PDT 2020
Author: Florian Hahn
Date: 2020-08-17T17:55:14+01:00
New Revision: 139810449ba4c2203dbd9021b7ec4153bbfab269
URL: https://github.com/llvm/llvm-project/commit/139810449ba4c2203dbd9021b7ec4153bbfab269
DIFF: https://github.com/llvm/llvm-project/commit/139810449ba4c2203dbd9021b7ec4153bbfab269.diff
LOG: [DSE,MemorySSA] Account for ScanLimit == 0 on entry.
Currently the code does not account for the fact that getDomMemoryDef
can be called with ScanLimit == 0, if we reached the limit while
processing an earlier access. Also tighten the check a bit more and bump
the scan limit now that it is handled properly.
In some cases, this brings a 2x speedup in terms of compile-time.
Added:
Modified:
llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
llvm/test/Transforms/DeadStoreElimination/MSSA/memoryssa-scan-limit.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
index 261fb3878ac1..faa936e63c91 100644
--- a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
@@ -107,7 +107,7 @@ static cl::opt<bool>
cl::desc("Use the new MemorySSA-backed DSE."));
static cl::opt<unsigned>
- MemorySSAScanLimit("dse-memoryssa-scanlimit", cl::init(100), cl::Hidden,
+ MemorySSAScanLimit("dse-memoryssa-scanlimit", cl::init(150), cl::Hidden,
cl::desc("The number of memory instructions to scan for "
"dead store elimination (default = 100)"));
@@ -1743,7 +1743,12 @@ struct DSEState {
Optional<MemoryAccess *>
getDomMemoryDef(MemoryDef *KillingDef, MemoryAccess *Current,
MemoryLocation DefLoc, bool DefVisibleToCallerBeforeRet,
- bool DefVisibleToCallerAfterRet, int &ScanLimit) const {
+ bool DefVisibleToCallerAfterRet, unsigned &ScanLimit) const {
+ if (ScanLimit == 0) {
+ LLVM_DEBUG(dbgs() << "\n ... hit scan limit\n");
+ return None;
+ }
+
MemoryAccess *DomAccess;
bool StepAgain;
LLVM_DEBUG(dbgs() << " trying to get dominating access for " << *Current
@@ -1803,10 +1808,12 @@ struct DSEState {
MemoryAccess *UseAccess = WorkList[I];
LLVM_DEBUG(dbgs() << " " << *UseAccess);
- if (--ScanLimit == 0) {
+ // Bail out if the number of accesses to check exceeds the scan limit.
+ if (ScanLimit < (WorkList.size() - I)) {
LLVM_DEBUG(dbgs() << "\n ... hit scan limit\n");
return None;
}
+ --ScanLimit;
if (isa<MemoryPhi>(UseAccess)) {
LLVM_DEBUG(dbgs() << "\n ... adding PHI uses\n");
@@ -2154,7 +2161,7 @@ bool eliminateDeadStoresMemorySSA(Function &F, AliasAnalysis &AA,
LLVM_DEBUG(dbgs() << "Trying to eliminate MemoryDefs killed by "
<< *KillingDef << " (" << *SI << ")\n");
- int ScanLimit = MemorySSAScanLimit;
+ unsigned ScanLimit = MemorySSAScanLimit;
// Worklist of MemoryAccesses that may be killed by KillingDef.
SetVector<MemoryAccess *> ToCheck;
ToCheck.insert(KillingDef->getDefiningAccess());
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/memoryssa-scan-limit.ll b/llvm/test/Transforms/DeadStoreElimination/MSSA/memoryssa-scan-limit.ll
index c2b2eba7880a..5ee6fe1f69d5 100644
--- a/llvm/test/Transforms/DeadStoreElimination/MSSA/memoryssa-scan-limit.ll
+++ b/llvm/test/Transforms/DeadStoreElimination/MSSA/memoryssa-scan-limit.ll
@@ -1,14 +1,13 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -basic-aa -dse -enable-dse-memoryssa -S | FileCheck --check-prefix=NO-LIMIT %s
; RUN: opt < %s -basic-aa -dse -enable-dse-memoryssa -dse-memoryssa-scanlimit=0 -S | FileCheck --check-prefix=LIMIT-0 %s
+; RUN: opt < %s -basic-aa -dse -enable-dse-memoryssa -dse-memoryssa-scanlimit=2 -S | FileCheck --check-prefix=LIMIT-2 %s
; RUN: opt < %s -basic-aa -dse -enable-dse-memoryssa -dse-memoryssa-scanlimit=3 -S | FileCheck --check-prefix=LIMIT-3 %s
-; RUN: opt < %s -basic-aa -dse -enable-dse-memoryssa -dse-memoryssa-scanlimit=4 -S | FileCheck --check-prefix=LIMIT-4 %s
target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
define void @test2(i32* noalias %P, i32* noalias %Q, i32* noalias %R) {
-;
; NO-LIMIT-LABEL: @test2(
; NO-LIMIT-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
; NO-LIMIT: bb1:
@@ -16,47 +15,48 @@ define void @test2(i32* noalias %P, i32* noalias %Q, i32* noalias %R) {
; NO-LIMIT: bb2:
; NO-LIMIT-NEXT: br label [[BB3]]
; NO-LIMIT: bb3:
-; NO-LIMIT-NEXT: store i32 0, i32* [[Q:%.*]]
-; NO-LIMIT-NEXT: store i32 0, i32* [[R:%.*]]
-; NO-LIMIT-NEXT: store i32 0, i32* [[P:%.*]]
+; NO-LIMIT-NEXT: store i32 0, i32* [[Q:%.*]], align 4
+; NO-LIMIT-NEXT: store i32 0, i32* [[R:%.*]], align 4
+; NO-LIMIT-NEXT: store i32 0, i32* [[P:%.*]], align 4
; NO-LIMIT-NEXT: ret void
;
; LIMIT-0-LABEL: @test2(
+; LIMIT-0-NEXT: store i32 1, i32* [[P:%.*]], align 4
; LIMIT-0-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
; LIMIT-0: bb1:
; LIMIT-0-NEXT: br label [[BB3:%.*]]
; LIMIT-0: bb2:
; LIMIT-0-NEXT: br label [[BB3]]
; LIMIT-0: bb3:
-; LIMIT-0-NEXT: store i32 0, i32* [[Q:%.*]]
-; LIMIT-0-NEXT: store i32 0, i32* [[R:%.*]]
-; LIMIT-0-NEXT: store i32 0, i32* [[P:%.*]]
+; LIMIT-0-NEXT: store i32 0, i32* [[Q:%.*]], align 4
+; LIMIT-0-NEXT: store i32 0, i32* [[R:%.*]], align 4
+; LIMIT-0-NEXT: store i32 0, i32* [[P]], align 4
; LIMIT-0-NEXT: ret void
;
+; LIMIT-2-LABEL: @test2(
+; LIMIT-2-NEXT: store i32 1, i32* [[P:%.*]], align 4
+; LIMIT-2-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
+; LIMIT-2: bb1:
+; LIMIT-2-NEXT: br label [[BB3:%.*]]
+; LIMIT-2: bb2:
+; LIMIT-2-NEXT: br label [[BB3]]
+; LIMIT-2: bb3:
+; LIMIT-2-NEXT: store i32 0, i32* [[Q:%.*]], align 4
+; LIMIT-2-NEXT: store i32 0, i32* [[R:%.*]], align 4
+; LIMIT-2-NEXT: store i32 0, i32* [[P]], align 4
+; LIMIT-2-NEXT: ret void
+;
; LIMIT-3-LABEL: @test2(
-; LIMIT-3-NEXT: store i32 1, i32* [[P:%.*]]
; LIMIT-3-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
; LIMIT-3: bb1:
; LIMIT-3-NEXT: br label [[BB3:%.*]]
; LIMIT-3: bb2:
; LIMIT-3-NEXT: br label [[BB3]]
; LIMIT-3: bb3:
-; LIMIT-3-NEXT: store i32 0, i32* [[Q:%.*]]
-; LIMIT-3-NEXT: store i32 0, i32* [[R:%.*]]
-; LIMIT-3-NEXT: store i32 0, i32* [[P]]
+; LIMIT-3-NEXT: store i32 0, i32* [[Q:%.*]], align 4
+; LIMIT-3-NEXT: store i32 0, i32* [[R:%.*]], align 4
+; LIMIT-3-NEXT: store i32 0, i32* [[P:%.*]], align 4
; LIMIT-3-NEXT: ret void
-;
-; LIMIT-4-LABEL: @test2(
-; LIMIT-4-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
-; LIMIT-4: bb1:
-; LIMIT-4-NEXT: br label [[BB3:%.*]]
-; LIMIT-4: bb2:
-; LIMIT-4-NEXT: br label [[BB3]]
-; LIMIT-4: bb3:
-; LIMIT-4-NEXT: store i32 0, i32* [[Q:%.*]]
-; LIMIT-4-NEXT: store i32 0, i32* [[R:%.*]]
-; LIMIT-4-NEXT: store i32 0, i32* [[P:%.*]]
-; LIMIT-4-NEXT: ret void
;
store i32 1, i32* %P
br i1 true, label %bb1, label %bb2
More information about the llvm-commits
mailing list