Skip to content

Commit 6157028

Browse files
authored
[BasicAA][ValueTracking] Increase depth for underlying object search (#143714)
This depth limits a linear search (rather than the usual potentially exponential one) and is not particularly important for compile-time in practice. The change in #137297 is going to increase the length of GEP chains, so I'd like to increase this limit a bit to reduce the chance of regressions (dtcxzyw/llvm-opt-benchmark#2419 showed a 13% increase in SearchLimitReached). There is no particular significance to the new value of 10. Compile-time is neutral.
1 parent 3f0cf74 commit 6157028

File tree

4 files changed

+42
-25
lines changed

4 files changed

+42
-25
lines changed

llvm/include/llvm/Analysis/ValueTracking.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ constexpr unsigned MaxAnalysisRecursionDepth = 6;
4747

4848
/// The max limit of the search depth in DecomposeGEPExpression() and
4949
/// getUnderlyingObject().
50-
constexpr unsigned MaxLookupSearchDepth = 6;
50+
constexpr unsigned MaxLookupSearchDepth = 10;
5151

5252
/// Determine which bits of V are known to be either zero or one and return
5353
/// them in the KnownZero/KnownOne bit sets.

llvm/test/Analysis/BasicAA/gep-decomposition-limit.ll

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,22 @@
22

33
; CHECK-LABEL: Function: test
44
;; Before limit:
5-
; CHECK-DAG: MustAlias: i8* %gep.add5, i8* %gep.inc5
6-
; CHECK-DAG: NoAlias: i8* %gep.inc3, i8* %gep.inc5
7-
; CHECK-DAG: NoAlias: i8* %gep.inc4, i8* %gep.inc5
5+
; CHECK-DAG: MustAlias: i8* %gep.add9, i8* %gep.inc9
6+
; CHECK-DAG: NoAlias: i8* %gep.inc7, i8* %gep.inc9
7+
; CHECK-DAG: NoAlias: i8* %gep.inc8, i8* %gep.inc9
88
;; At limit:
9-
; CHECK-DAG: MustAlias: i8* %gep.add6, i8* %gep.inc6
10-
; CHECK-DAG: NoAlias: i8* %gep.inc4, i8* %gep.inc6
11-
; CHECK-DAG: NoAlias: i8* %gep.inc5, i8* %gep.inc6
9+
; CHECK-DAG: MustAlias: i8* %gep.add10, i8* %gep.inc10
10+
; CHECK-DAG: NoAlias: i8* %gep.inc10, i8* %gep.inc8
11+
; CHECK-DAG: NoAlias: i8* %gep.inc10, i8* %gep.inc9
1212
;; After limit:
13-
; CHECK-DAG: MayAlias: i8* %gep.add7, i8* %gep.inc7
14-
; CHECK-DAG: MayAlias: i8* %gep.inc5, i8* %gep.inc7
15-
; CHECK-DAG: NoAlias: i8* %gep.inc6, i8* %gep.inc7
13+
; CHECK-DAG: MayAlias: i8* %gep.add11, i8* %gep.inc11
14+
; CHECK-DAG: MayAlias: i8* %gep.inc11, i8* %gep.inc9
15+
; CHECK-DAG: NoAlias: i8* %gep.inc10, i8* %gep.inc11
1616

1717
define void @test(ptr %base) {
18-
%gep.add5 = getelementptr i8, ptr %base, i64 5
19-
%gep.add6 = getelementptr i8, ptr %base, i64 6
20-
%gep.add7 = getelementptr i8, ptr %base, i64 7
18+
%gep.add9 = getelementptr i8, ptr %base, i64 9
19+
%gep.add10 = getelementptr i8, ptr %base, i64 10
20+
%gep.add11 = getelementptr i8, ptr %base, i64 11
2121

2222
%gep.inc1 = getelementptr i8, ptr %base, i64 1
2323
%gep.inc2 = getelementptr i8, ptr %gep.inc1, i64 1
@@ -26,15 +26,23 @@ define void @test(ptr %base) {
2626
%gep.inc5 = getelementptr i8, ptr %gep.inc4, i64 1
2727
%gep.inc6 = getelementptr i8, ptr %gep.inc5, i64 1
2828
%gep.inc7 = getelementptr i8, ptr %gep.inc6, i64 1
29+
%gep.inc8 = getelementptr i8, ptr %gep.inc7, i64 1
30+
%gep.inc9 = getelementptr i8, ptr %gep.inc8, i64 1
31+
%gep.inc10 = getelementptr i8, ptr %gep.inc9, i64 1
32+
%gep.inc11 = getelementptr i8, ptr %gep.inc10, i64 1
2933

30-
load i8, ptr %gep.add5
31-
load i8, ptr %gep.add6
32-
load i8, ptr %gep.add7
34+
load i8, ptr %gep.add9
35+
load i8, ptr %gep.add10
36+
load i8, ptr %gep.add11
3337
load i8, ptr %gep.inc3
3438
load i8, ptr %gep.inc4
3539
load i8, ptr %gep.inc5
3640
load i8, ptr %gep.inc6
3741
load i8, ptr %gep.inc7
42+
load i8, ptr %gep.inc8
43+
load i8, ptr %gep.inc9
44+
load i8, ptr %gep.inc10
45+
load i8, ptr %gep.inc11
3846

3947
ret void
4048
}

llvm/test/Analysis/LoopAccessAnalysis/underlying-objects-2.ll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,12 @@ for_j.body:
127127
%gepB7 = getelementptr inbounds i8, ptr %gepB6, i64 0
128128
%gepB8 = getelementptr inbounds i8, ptr %gepB7, i64 0
129129
%gepB9 = getelementptr inbounds i8, ptr %gepB8, i64 0
130+
%gepB10 = getelementptr inbounds i8, ptr %gepB9, i64 0
131+
%gepB11 = getelementptr inbounds i8, ptr %gepB10, i64 0
132+
%gepB12 = getelementptr inbounds i8, ptr %gepB11, i64 0
130133

131134
%loadPrev = load i8, ptr %gepPrev, align 1
132-
%loadB = load i8, ptr %gepB9, align 1
135+
%loadB = load i8, ptr %gepB12, align 1
133136

134137
%mul = mul i8 %loadPrev, %loadB
135138

llvm/test/Transforms/Inline/inline-noalias-unidentify-object.ll

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,18 @@
33
define i32 @caller(ptr %p) {
44
; CHECK-LABEL: define i32 @caller(ptr %p) {
55
; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META0:![0-9]+]])
6-
; CHECK-NEXT: [[P_8_I:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 8
7-
; CHECK-NEXT: [[V_I:%.*]] = load i32, ptr [[P_8_I]], align 4, !alias.scope !0
8-
; CHECK-NEXT: [[P_1_I:%.*]] = getelementptr i8, ptr [[P]], i64 1
6+
; CHECK-NEXT: [[P_11_I:%.*]] = getelementptr i8, ptr %p, i64 11
7+
; CHECK-NEXT: [[V_I:%.*]] = load i32, ptr [[P_11_I]], align 4, !alias.scope !0
8+
; CHECK-NEXT: [[P_1_I:%.*]] = getelementptr i8, ptr %p, i64 1
99
; CHECK-NEXT: [[P_2_I:%.*]] = getelementptr i8, ptr [[P_1_I]], i64 1
1010
; CHECK-NEXT: [[P_3_I:%.*]] = getelementptr i8, ptr [[P_2_I]], i64 1
1111
; CHECK-NEXT: [[P_4_I:%.*]] = getelementptr i8, ptr [[P_3_I]], i64 1
1212
; CHECK-NEXT: [[P_5_I:%.*]] = getelementptr i8, ptr [[P_4_I]], i64 1
1313
; CHECK-NEXT: [[P_6_I:%.*]] = getelementptr i8, ptr [[P_5_I]], i64 1
14-
; CHECK-NEXT: [[P_7_I:%.*]] = getelementptr i8, ptr [[P_6_I]], i64 1
14+
; CHECK-NEXT: [[P_7_I1:%.*]] = getelementptr i8, ptr [[P_6_I]], i64 1
15+
; CHECK-NEXT: [[P_8_I:%.*]] = getelementptr i8, ptr [[P_7_I1]], i64 1
16+
; CHECK-NEXT: [[P_9_I:%.*]] = getelementptr i8, ptr [[P_8_I]], i64 1
17+
; CHECK-NEXT: [[P_7_I:%.*]] = getelementptr i8, ptr [[P_9_I]], i64 1
1518
; CHECK-NEXT: [[P_8_ALIAS_I:%.*]] = getelementptr i8, ptr [[P_7_I]], i64 1
1619
; CHECK-NEXT: store i32 42, ptr [[P_8_ALIAS_I]], align 4
1720
; CHECK-NEXT: ret i32 [[V_I]]
@@ -21,16 +24,19 @@ define i32 @caller(ptr %p) {
2124
}
2225

2326
define internal i32 @callee(ptr noalias %p) {
24-
%p.8 = getelementptr i8, ptr %p, i64 8
25-
%v = load i32, ptr %p.8
27+
%p.11 = getelementptr i8, ptr %p, i64 11
28+
%v = load i32, ptr %p.11
2629
%p.1 = getelementptr i8, ptr %p, i64 1
2730
%p.2 = getelementptr i8, ptr %p.1, i64 1
2831
%p.3 = getelementptr i8, ptr %p.2, i64 1
2932
%p.4 = getelementptr i8, ptr %p.3, i64 1
3033
%p.5 = getelementptr i8, ptr %p.4, i64 1
3134
%p.6 = getelementptr i8, ptr %p.5, i64 1
3235
%p.7 = getelementptr i8, ptr %p.6, i64 1
33-
%p.8.alias = getelementptr i8, ptr %p.7, i64 1
34-
store i32 42, ptr %p.8.alias
36+
%p.8 = getelementptr i8, ptr %p.7, i64 1
37+
%p.9 = getelementptr i8, ptr %p.8, i64 1
38+
%p.10 = getelementptr i8, ptr %p.9, i64 1
39+
%p.11.alias = getelementptr i8, ptr %p.10, i64 1
40+
store i32 42, ptr %p.11.alias
3541
ret i32 %v
3642
}

0 commit comments

Comments
 (0)