Skip to content

Commit 850062c

Browse files
authored
[AA] Consider extractvalue and extractelement as escape sources (#127640)
CaptureTracking considers insertions into aggregates and vectors as captures. As such, extractions from aggregates and vectors are escape sources. A non-escaping identified local cannot alias with the result of an extractvalue/extractelement. Fixes #126670.
1 parent 9072ba7 commit 850062c

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

llvm/lib/Analysis/AliasAnalysis.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,12 @@ bool llvm::isEscapeSource(const Value *V) {
859859
if (isa<IntToPtrInst>(V))
860860
return true;
861861

862+
// Capture tracking considers insertions into aggregates and vectors as
863+
// captures. As such, extractions from aggregates and vectors are escape
864+
// sources.
865+
if (isa<ExtractValueInst, ExtractElementInst>(V))
866+
return true;
867+
862868
// Same for inttoptr constant expressions.
863869
if (auto *CE = dyn_cast<ConstantExpr>(V))
864870
if (CE->getOpcode() == Instruction::IntToPtr)

llvm/test/Analysis/BasicAA/escape-source-aggregate.ll

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
declare { ptr, i1 } @get_struct()
44
declare <2 x ptr> @get_vec()
5+
declare void @escape(ptr)
56

6-
; CHECK: MayAlias: i32* %a, i32* %extract
7+
; CHECK: NoAlias: i32* %a, i32* %extract
78
define i32 @test_extractvalue() {
89
%a = alloca i32
910
%call = call { ptr, i1 } @get_struct()
@@ -13,7 +14,7 @@ define i32 @test_extractvalue() {
1314
ret i32 %v
1415
}
1516

16-
; CHECK: MayAlias: i32* %a, i32* %extract
17+
; CHECK: NoAlias: i32* %a, i32* %extract
1718
define i32 @test_extractelement() {
1819
%a = alloca i32
1920
%call = call <2 x ptr> @get_vec()
@@ -22,3 +23,25 @@ define i32 @test_extractelement() {
2223
%v = load i32, ptr %a
2324
ret i32 %v
2425
}
26+
27+
; CHECK: MayAlias: i32* %a, i32* %extract
28+
define i32 @test_extractvalue_escape() {
29+
%a = alloca i32
30+
call void @escape(ptr %a)
31+
%call = call { ptr, i1 } @get_struct()
32+
%extract = extractvalue { ptr, i1 } %call, 0
33+
store i32 0, ptr %extract
34+
%v = load i32, ptr %a
35+
ret i32 %v
36+
}
37+
38+
; CHECK: MayAlias: i32* %a, i32* %extract
39+
define i32 @test_extractelement_escape() {
40+
%a = alloca i32
41+
call void @escape(ptr %a)
42+
%call = call <2 x ptr> @get_vec()
43+
%extract = extractelement <2 x ptr> %call, i32 0
44+
store i32 0, ptr %extract
45+
%v = load i32, ptr %a
46+
ret i32 %v
47+
}

0 commit comments

Comments
 (0)