Skip to content

Commit 99e57f0

Browse files
[CodeGenPrepare] Increase the limit on the number of instructions to scan
... when finding all memory uses for an address and make it a parameter. Now that we have avoided potentially exponential run time of `FindAllMemoryUses` in D143893. it'd be beneficial to increase the limit up from 20. Reviewed By: mkazantsev Differential Revision: https://reviews.llvm.org/D143894 Change-Id: I3abdf40332ef65e9b2f819ac32ac60e4200ec51d
1 parent 3ad1673 commit 99e57f0

File tree

2 files changed

+30
-32
lines changed

2 files changed

+30
-32
lines changed

llvm/lib/CodeGen/CodeGenPrepare.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,10 @@ static cl::opt<unsigned>
264264
HugeFuncThresholdInCGPP("cgpp-huge-func", cl::init(10000), cl::Hidden,
265265
cl::desc("Least BB number of huge function."));
266266

267+
static cl::opt<unsigned>
268+
MaxAddressUsersToScan("cgp-max-address-users-to-scan", cl::init(100),
269+
cl::Hidden,
270+
cl::desc("Max number of address users to look at"));
267271
namespace {
268272

269273
enum ExtType {
@@ -4961,18 +4965,14 @@ static bool IsOperandAMemoryOperand(CallInst *CI, InlineAsm *IA, Value *OpVal,
49614965
return true;
49624966
}
49634967

4964-
// Max number of memory uses to look at before aborting the search to conserve
4965-
// compile time.
4966-
static constexpr int MaxMemoryUsesToScan = 20;
4967-
49684968
/// Recursively walk all the uses of I until we find a memory use.
49694969
/// If we find an obviously non-foldable instruction, return true.
49704970
/// Add accessed addresses and types to MemoryUses.
49714971
static bool FindAllMemoryUses(
49724972
Instruction *I, SmallVectorImpl<std::pair<Value *, Type *>> &MemoryUses,
49734973
SmallPtrSetImpl<Instruction *> &ConsideredInsts, const TargetLowering &TLI,
49744974
const TargetRegisterInfo &TRI, bool OptSize, ProfileSummaryInfo *PSI,
4975-
BlockFrequencyInfo *BFI, int &SeenInsts) {
4975+
BlockFrequencyInfo *BFI, unsigned &SeenInsts) {
49764976
// If we already considered this instruction, we're done.
49774977
if (!ConsideredInsts.insert(I).second)
49784978
return false;
@@ -4985,7 +4985,7 @@ static bool FindAllMemoryUses(
49854985
for (Use &U : I->uses()) {
49864986
// Conservatively return true if we're seeing a large number or a deep chain
49874987
// of users. This avoids excessive compilation times in pathological cases.
4988-
if (SeenInsts++ >= MaxMemoryUsesToScan)
4988+
if (SeenInsts++ >= MaxAddressUsersToScan)
49894989
return true;
49904990

49914991
Instruction *UserI = cast<Instruction>(U.getUser());
@@ -5047,7 +5047,7 @@ static bool FindAllMemoryUses(
50475047
Instruction *I, SmallVectorImpl<std::pair<Value *, Type *>> &MemoryUses,
50485048
const TargetLowering &TLI, const TargetRegisterInfo &TRI, bool OptSize,
50495049
ProfileSummaryInfo *PSI, BlockFrequencyInfo *BFI) {
5050-
int SeenInsts = 0;
5050+
unsigned SeenInsts = 0;
50515051
SmallPtrSet<Instruction *, 16> ConsideredInsts;
50525052
return FindAllMemoryUses(I, MemoryUses, ConsideredInsts, TLI, TRI, OptSize,
50535053
PSI, BFI, SeenInsts);

llvm/test/CodeGen/Generic/addr-use-count.ll

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
; RUN: opt -S -codegenprepare < %s | FileCheck %s
33
; REQUIRES: aarch64-registered-target
44

5-
; Test that `%addr` is not sunk, since the number of memory uses to scan exceeds the limit.
5+
; Test that `%addr` is sunk, after we've increased limit on the number of the memory uses to scan.
66

77
target triple = "aarch64-linux"
88

@@ -11,30 +11,28 @@ declare void @g(...)
1111
define void @f(ptr %p) {
1212
; CHECK-LABEL: @f(
1313
; CHECK-NEXT: entry:
14-
; CHECK-NEXT: [[ADDR:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 4
15-
; CHECK-NEXT: br label [[EXIT:%.*]]
16-
; CHECK: exit:
17-
; CHECK-NEXT: [[T0:%.*]] = load i32, ptr [[ADDR]], align 4
18-
; CHECK-NEXT: [[T1:%.*]] = load i32, ptr [[ADDR]], align 4
19-
; CHECK-NEXT: [[T2:%.*]] = load i32, ptr [[ADDR]], align 4
20-
; CHECK-NEXT: [[T3:%.*]] = load i32, ptr [[ADDR]], align 4
21-
; CHECK-NEXT: [[T4:%.*]] = load i32, ptr [[ADDR]], align 4
22-
; CHECK-NEXT: [[T5:%.*]] = load i32, ptr [[ADDR]], align 4
23-
; CHECK-NEXT: [[T6:%.*]] = load i32, ptr [[ADDR]], align 4
24-
; CHECK-NEXT: [[T7:%.*]] = load i32, ptr [[ADDR]], align 4
25-
; CHECK-NEXT: [[T8:%.*]] = load i32, ptr [[ADDR]], align 4
26-
; CHECK-NEXT: [[T9:%.*]] = load i32, ptr [[ADDR]], align 4
27-
; CHECK-NEXT: [[T10:%.*]] = load i32, ptr [[ADDR]], align 4
28-
; CHECK-NEXT: [[T11:%.*]] = load i32, ptr [[ADDR]], align 4
29-
; CHECK-NEXT: [[T12:%.*]] = load i32, ptr [[ADDR]], align 4
30-
; CHECK-NEXT: [[T13:%.*]] = load i32, ptr [[ADDR]], align 4
31-
; CHECK-NEXT: [[T14:%.*]] = load i32, ptr [[ADDR]], align 4
32-
; CHECK-NEXT: [[T15:%.*]] = load i32, ptr [[ADDR]], align 4
33-
; CHECK-NEXT: [[T16:%.*]] = load i32, ptr [[ADDR]], align 4
34-
; CHECK-NEXT: [[T17:%.*]] = load i32, ptr [[ADDR]], align 4
35-
; CHECK-NEXT: [[T18:%.*]] = load i32, ptr [[ADDR]], align 4
36-
; CHECK-NEXT: [[ADDR_1:%.*]] = getelementptr i8, ptr [[ADDR]], i32 4
37-
; CHECK-NEXT: [[T19:%.*]] = load i32, ptr [[ADDR_1]], align 4
14+
; CHECK-NEXT: [[SUNKADDR:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 4
15+
; CHECK-NEXT: [[T0:%.*]] = load i32, ptr [[SUNKADDR]], align 4
16+
; CHECK-NEXT: [[T1:%.*]] = load i32, ptr [[SUNKADDR]], align 4
17+
; CHECK-NEXT: [[T2:%.*]] = load i32, ptr [[SUNKADDR]], align 4
18+
; CHECK-NEXT: [[T3:%.*]] = load i32, ptr [[SUNKADDR]], align 4
19+
; CHECK-NEXT: [[T4:%.*]] = load i32, ptr [[SUNKADDR]], align 4
20+
; CHECK-NEXT: [[T5:%.*]] = load i32, ptr [[SUNKADDR]], align 4
21+
; CHECK-NEXT: [[T6:%.*]] = load i32, ptr [[SUNKADDR]], align 4
22+
; CHECK-NEXT: [[T7:%.*]] = load i32, ptr [[SUNKADDR]], align 4
23+
; CHECK-NEXT: [[T8:%.*]] = load i32, ptr [[SUNKADDR]], align 4
24+
; CHECK-NEXT: [[T9:%.*]] = load i32, ptr [[SUNKADDR]], align 4
25+
; CHECK-NEXT: [[T10:%.*]] = load i32, ptr [[SUNKADDR]], align 4
26+
; CHECK-NEXT: [[T11:%.*]] = load i32, ptr [[SUNKADDR]], align 4
27+
; CHECK-NEXT: [[T12:%.*]] = load i32, ptr [[SUNKADDR]], align 4
28+
; CHECK-NEXT: [[T13:%.*]] = load i32, ptr [[SUNKADDR]], align 4
29+
; CHECK-NEXT: [[T14:%.*]] = load i32, ptr [[SUNKADDR]], align 4
30+
; CHECK-NEXT: [[T15:%.*]] = load i32, ptr [[SUNKADDR]], align 4
31+
; CHECK-NEXT: [[T16:%.*]] = load i32, ptr [[SUNKADDR]], align 4
32+
; CHECK-NEXT: [[T17:%.*]] = load i32, ptr [[SUNKADDR]], align 4
33+
; CHECK-NEXT: [[T18:%.*]] = load i32, ptr [[SUNKADDR]], align 4
34+
; CHECK-NEXT: [[SUNKADDR1:%.*]] = getelementptr i8, ptr [[P]], i64 8
35+
; CHECK-NEXT: [[T19:%.*]] = load i32, ptr [[SUNKADDR1]], align 4
3836
; CHECK-NEXT: call void @g(i32 [[T0]], i32 [[T1]], i32 [[T2]], i32 [[T3]], i32 [[T4]], i32 [[T5]], i32 [[T6]], i32 [[T7]], i32 [[T8]], i32 [[T9]], i32 [[T10]], i32 [[T11]], i32 [[T12]], i32 [[T13]], i32 [[T14]], i32 [[T15]], i32 [[T16]], i32 [[T17]], i32 [[T18]], i32 [[T19]])
3937
; CHECK-NEXT: ret void
4038
;

0 commit comments

Comments
 (0)