Skip to content

Commit 72dcab3

Browse files
committed
Insert an empty init range for May/PartialAlias arguments
1 parent debf11f commit 72dcab3

File tree

2 files changed

+104
-69
lines changed

2 files changed

+104
-69
lines changed

llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -847,13 +847,8 @@ struct MemoryDefWrapper {
847847

848848
bool hasInitializesAttr(Instruction *I) {
849849
CallBase *CB = dyn_cast<CallBase>(I);
850-
if (!CB)
851-
return false;
852-
853-
for (unsigned Idx = 0, Count = CB->arg_size(); Idx < Count; ++Idx)
854-
if (CB->paramHasAttr(Idx, Attribute::Initializes))
855-
return true;
856-
return false;
850+
return CB != nullptr &&
851+
CB->getArgOperandWithAttribute(Attribute::Initializes) != nullptr;
857852
}
858853

859854
struct ArgumentInitInfo {
@@ -915,11 +910,19 @@ getInitializesArgMemLoc(const Instruction *I, BatchAAResults &BatchAA) {
915910
Value *CurArg = CB->getArgOperand(Idx);
916911
bool FoundAliasing = false;
917912
for (auto &[Arg, AliasList] : Arguments) {
918-
if (BatchAA.isNoAlias(Arg, CurArg))
913+
if (BatchAA.isNoAlias(Arg, CurArg)) {
919914
continue;
920-
// Conservatively consider must/may/partial-alias as aliasing.
921-
FoundAliasing = true;
922-
AliasList.push_back(InitInfo);
915+
} else if (BatchAA.isMustAlias(Arg, CurArg)) {
916+
FoundAliasing = true;
917+
AliasList.push_back(InitInfo);
918+
} else {
919+
// For ParitialAlias and MayAlias, there is an offset or may be an
920+
// unknown offset between the arguments and we insert an empty init
921+
// range to discard the entire initializes info while intersecting.
922+
FoundAliasing = true;
923+
AliasList.push_back(
924+
ArgumentInitInfo{Idx, HasDeadOnUnwindAttr, ConstantRangeList()});
925+
}
923926
}
924927
if (!FoundAliasing)
925928
Arguments[CurArg] = {InitInfo};

llvm/test/Transforms/DeadStoreElimination/inter-procedural.ll

Lines changed: 90 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ declare void @p2_no_dead_on_unwind_but_nounwind(ptr nocapture noundef initialize
1212
; Function Attrs: mustprogress nounwind uwtable
1313
define i16 @p1_write_only_caller() {
1414
; CHECK-LABEL: @p1_write_only_caller(
15-
; CHECK-NEXT: %ptr = alloca i16, align 2
16-
; CHECK-NEXT: call void @p1_write_only(ptr %ptr)
17-
; CHECK-NEXT: %l = load i16, ptr %ptr
18-
; CHECK-NEXT: ret i16 %l
15+
; CHECK-NEXT: [[PTR:%.*]] = alloca i16, align 2
16+
; CHECK-NEXT: call void @p1_write_only(ptr [[PTR]])
17+
; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[PTR]], align 2
18+
; CHECK-NEXT: ret i16 [[L]]
1919
;
2020
%ptr = alloca i16
2121
store i16 0, ptr %ptr
@@ -27,10 +27,10 @@ define i16 @p1_write_only_caller() {
2727
; Function Attrs: mustprogress nounwind uwtable
2828
define i16 @p1_write_then_read_caller() {
2929
; CHECK-LABEL: @p1_write_then_read_caller(
30-
; CHECK-NEXT: %ptr = alloca i16, align 2
31-
; CHECK-NEXT: call void @p1_write_then_read(ptr %ptr)
32-
; CHECK-NEXT: %l = load i16, ptr %ptr
33-
; CHECK-NEXT: ret i16 %l
30+
; CHECK-NEXT: [[PTR:%.*]] = alloca i16, align 2
31+
; CHECK-NEXT: call void @p1_write_then_read(ptr [[PTR]])
32+
; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[PTR]], align 2
33+
; CHECK-NEXT: ret i16 [[L]]
3434
;
3535
%ptr = alloca i16
3636
store i16 0, ptr %ptr
@@ -42,12 +42,12 @@ define i16 @p1_write_then_read_caller() {
4242
; Function Attrs: mustprogress nounwind uwtable
4343
define i16 @p1_write_then_read_caller_with_clobber() {
4444
; CHECK-LABEL: @p1_write_then_read_caller_with_clobber(
45-
; CHECK-NEXT: %ptr = alloca i16, align 2
46-
; CHECK-NEXT: store i16 0, ptr %ptr
47-
; CHECK-NEXT: call void @p1_clobber(ptr %ptr)
48-
; CHECK-NEXT: call void @p1_write_then_read(ptr %ptr)
49-
; CHECK-NEXT: %l = load i16, ptr %ptr
50-
; CHECK-NEXT: ret i16 %l
45+
; CHECK-NEXT: [[PTR:%.*]] = alloca i16, align 2
46+
; CHECK-NEXT: store i16 0, ptr [[PTR]], align 2
47+
; CHECK-NEXT: call void @p1_clobber(ptr [[PTR]])
48+
; CHECK-NEXT: call void @p1_write_then_read(ptr [[PTR]])
49+
; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[PTR]], align 2
50+
; CHECK-NEXT: ret i16 [[L]]
5151
;
5252
%ptr = alloca i16
5353
store i16 0, ptr %ptr
@@ -58,13 +58,13 @@ define i16 @p1_write_then_read_caller_with_clobber() {
5858
}
5959

6060
; Function Attrs: mustprogress nounwind uwtable
61-
define i16 @p2_same_range_nonalias_caller() {
62-
; CHECK-LABEL: @p2_same_range_nonalias_caller(
63-
; CHECK-NEXT: %ptr1 = alloca i16, align 2
64-
; CHECK-NEXT: %ptr2 = alloca i16, align 2
65-
; CHECK-NEXT: call void @p2_same_range(ptr %ptr1, ptr %ptr2)
66-
; CHECK-NEXT: %l = load i16, ptr %ptr1
67-
; CHECK-NEXT: ret i16 %l
61+
define i16 @p2_same_range_noalias_caller() {
62+
; CHECK-LABEL: @p2_same_range_noalias_caller(
63+
; CHECK-NEXT: [[PTR1:%.*]] = alloca i16, align 2
64+
; CHECK-NEXT: [[PTR2:%.*]] = alloca i16, align 2
65+
; CHECK-NEXT: call void @p2_same_range(ptr [[PTR1]], ptr [[PTR2]])
66+
; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[PTR1]], align 2
67+
; CHECK-NEXT: ret i16 [[L]]
6868
;
6969
%ptr1 = alloca i16
7070
%ptr2 = alloca i16
@@ -76,12 +76,12 @@ define i16 @p2_same_range_nonalias_caller() {
7676
}
7777

7878
; Function Attrs: mustprogress nounwind uwtable
79-
define i16 @p2_same_range_alias_caller() {
80-
; CHECK-LABEL: @p2_same_range_alias_caller(
81-
; CHECK-NEXT: %ptr = alloca i16, align 2
82-
; CHECK-NEXT: call void @p2_same_range(ptr %ptr, ptr %ptr)
83-
; CHECK-NEXT: %l = load i16, ptr %ptr
84-
; CHECK-NEXT: ret i16 %l
79+
define i16 @p2_same_range_must_alias_caller() {
80+
; CHECK-LABEL: @p2_same_range_must_alias_caller(
81+
; CHECK-NEXT: [[PTR:%.*]] = alloca i16, align 2
82+
; CHECK-NEXT: call void @p2_same_range(ptr [[PTR]], ptr [[PTR]])
83+
; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[PTR]], align 2
84+
; CHECK-NEXT: ret i16 [[L]]
8585
;
8686
%ptr = alloca i16
8787
store i16 0, ptr %ptr
@@ -90,14 +90,46 @@ define i16 @p2_same_range_alias_caller() {
9090
ret i16 %l
9191
}
9292

93+
; Function Attrs: mustprogress nounwind uwtable
94+
define i16 @p2_same_range_may_or_partial_alias_caller1(ptr %base, i1 %x) {
95+
; CHECK-LABEL: @p2_same_range_may_or_partial_alias_caller1(
96+
; CHECK-NEXT: [[BASEPLUS:%.*]] = getelementptr i8, ptr [[BASE:%.*]], i64 1
97+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[X:%.*]], ptr [[BASEPLUS]], ptr [[BASE]]
98+
; CHECK-NEXT: store i32 0, ptr [[BASE]], align 4
99+
; CHECK-NEXT: call void @p2_same_range(ptr [[BASE]], ptr [[SEL]])
100+
; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[BASE]], align 2
101+
; CHECK-NEXT: ret i16 [[L]]
102+
;
103+
%baseplus = getelementptr i8, ptr %base, i64 1
104+
%sel = select i1 %x, ptr %baseplus, ptr %base
105+
store i32 0, ptr %base
106+
call void @p2_same_range(ptr %base, ptr %sel)
107+
%l = load i16, ptr %base
108+
ret i16 %l
109+
}
110+
111+
; Function Attrs: mustprogress nounwind uwtable
112+
define i16 @p2_same_range_may_or_partial_alias_caller2(ptr %base1, ptr %base2) {
113+
; CHECK-LABEL: @p2_same_range_may_or_partial_alias_caller2(
114+
; CHECK-NEXT: store i32 0, ptr [[BASE1:%.*]], align 4
115+
; CHECK-NEXT: call void @p2_same_range(ptr [[BASE1]], ptr [[BASE2:%.*]])
116+
; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[BASE1]], align 2
117+
; CHECK-NEXT: ret i16 [[L]]
118+
;
119+
store i32 0, ptr %base1
120+
call void @p2_same_range(ptr %base1, ptr %base2)
121+
%l = load i16, ptr %base1
122+
ret i16 %l
123+
}
124+
93125
; Function Attrs: mustprogress nounwind uwtable
94126
define i16 @p2_no_init_alias_caller() {
95127
; CHECK-LABEL: @p2_no_init_alias_caller(
96-
; CHECK-NEXT: %ptr = alloca i16, align 2
97-
; CHECK-NEXT: store i16 0, ptr %ptr
98-
; CHECK-NEXT: call void @p2_no_init(ptr %ptr, ptr %ptr)
99-
; CHECK-NEXT: %l = load i16, ptr %ptr
100-
; CHECK-NEXT: ret i16 %l
128+
; CHECK-NEXT: [[PTR:%.*]] = alloca i16, align 2
129+
; CHECK-NEXT: store i16 0, ptr [[PTR]], align 2
130+
; CHECK-NEXT: call void @p2_no_init(ptr [[PTR]], ptr [[PTR]])
131+
; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[PTR]], align 2
132+
; CHECK-NEXT: ret i16 [[L]]
101133
;
102134
%ptr = alloca i16
103135
store i16 0, ptr %ptr
@@ -109,11 +141,11 @@ define i16 @p2_no_init_alias_caller() {
109141
; Function Attrs: mustprogress nounwind uwtable
110142
define i16 @p2_no_dead_on_unwind_alias_caller() {
111143
; CHECK-LABEL: @p2_no_dead_on_unwind_alias_caller(
112-
; CHECK-NEXT: %ptr = alloca i16, align 2
113-
; CHECK-NEXT: store i16 0, ptr %ptr
114-
; CHECK-NEXT: call void @p2_no_dead_on_unwind(ptr %ptr, ptr %ptr)
115-
; CHECK-NEXT: %l = load i16, ptr %ptr
116-
; CHECK-NEXT: ret i16 %l
144+
; CHECK-NEXT: [[PTR:%.*]] = alloca i16, align 2
145+
; CHECK-NEXT: store i16 0, ptr [[PTR]], align 2
146+
; CHECK-NEXT: call void @p2_no_dead_on_unwind(ptr [[PTR]], ptr [[PTR]])
147+
; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[PTR]], align 2
148+
; CHECK-NEXT: ret i16 [[L]]
117149
;
118150
%ptr = alloca i16
119151
store i16 0, ptr %ptr
@@ -125,10 +157,10 @@ define i16 @p2_no_dead_on_unwind_alias_caller() {
125157
; Function Attrs: mustprogress nounwind uwtable
126158
define i16 @p2_no_dead_on_unwind_but_nounwind_alias_caller() {
127159
; CHECK-LABEL: @p2_no_dead_on_unwind_but_nounwind_alias_caller(
128-
; CHECK-NEXT: %ptr = alloca i16, align 2
129-
; CHECK-NEXT: call void @p2_no_dead_on_unwind_but_nounwind(ptr %ptr, ptr %ptr)
130-
; CHECK-NEXT: %l = load i16, ptr %ptr
131-
; CHECK-NEXT: ret i16 %l
160+
; CHECK-NEXT: [[PTR:%.*]] = alloca i16, align 2
161+
; CHECK-NEXT: call void @p2_no_dead_on_unwind_but_nounwind(ptr [[PTR]], ptr [[PTR]])
162+
; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[PTR]], align 2
163+
; CHECK-NEXT: ret i16 [[L]]
132164
;
133165
%ptr = alloca i16
134166
store i16 0, ptr %ptr
@@ -144,10 +176,10 @@ declare void @large_p2(ptr nocapture noundef initializes((0, 200)), ptr nocaptur
144176
; Function Attrs: mustprogress nounwind uwtable
145177
define i16 @large_p1_caller() {
146178
; CHECK-LABEL: @large_p1_caller(
147-
; CHECK-NEXT: %ptr = alloca i16, align 2
148-
; CHECK-NEXT: call void @large_p1(ptr %ptr)
149-
; CHECK-NEXT: %l = load i16, ptr %ptr
150-
; CHECK-NEXT: ret i16 %l
179+
; CHECK-NEXT: [[PTR:%.*]] = alloca i16, align 2
180+
; CHECK-NEXT: call void @large_p1(ptr [[PTR]])
181+
; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[PTR]], align 2
182+
; CHECK-NEXT: ret i16 [[L]]
151183
;
152184
%ptr = alloca i16
153185
call void @llvm.memset.p0.i64(ptr %ptr, i8 42, i64 100, i1 false)
@@ -159,11 +191,11 @@ define i16 @large_p1_caller() {
159191
; Function Attrs: mustprogress nounwind uwtable
160192
define i16 @large_p2_nonalias_caller() {
161193
; CHECK-LABEL: @large_p2_nonalias_caller(
162-
; CHECK-NEXT: %ptr1 = alloca i16, align 2
163-
; CHECK-NEXT: %ptr2 = alloca i16, align 2
164-
; CHECK-NEXT: call void @large_p2(ptr %ptr1, ptr %ptr2)
165-
; CHECK-NEXT: %l = load i16, ptr %ptr1
166-
; CHECK-NEXT: ret i16 %l
194+
; CHECK-NEXT: [[PTR1:%.*]] = alloca i16, align 2
195+
; CHECK-NEXT: [[PTR2:%.*]] = alloca i16, align 2
196+
; CHECK-NEXT: call void @large_p2(ptr [[PTR1]], ptr [[PTR2]])
197+
; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[PTR1]], align 2
198+
; CHECK-NEXT: ret i16 [[L]]
167199
;
168200
%ptr1 = alloca i16
169201
%ptr2 = alloca i16
@@ -176,14 +208,14 @@ define i16 @large_p2_nonalias_caller() {
176208

177209

178210
; Function Attrs: mustprogress nounwind uwtable
179-
define i16 @large_p2_alias_caller() {
180-
; CHECK-LABEL: @large_p2_alias_caller(
181-
; CHECK-NEXT: %ptr = alloca i16, align 2
182-
; CHECK-NEXT: %1 = getelementptr inbounds i8, ptr %ptr, i64 100
183-
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 %1, i8 42, i64 200, i1 false)
184-
; CHECK-NEXT: call void @large_p2(ptr %ptr, ptr %ptr)
185-
; CHECK-NEXT: %l = load i16, ptr %ptr
186-
; CHECK-NEXT: ret i16 %l
211+
define i16 @large_p2_must_alias_caller() {
212+
; CHECK-LABEL: @large_p2_must_alias_caller(
213+
; CHECK-NEXT: [[PTR:%.*]] = alloca i16, align 2
214+
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 100
215+
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP1]], i8 42, i64 200, i1 false)
216+
; CHECK-NEXT: call void @large_p2(ptr [[PTR]], ptr [[PTR]])
217+
; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[PTR]], align 2
218+
; CHECK-NEXT: ret i16 [[L]]
187219
;
188220
%ptr = alloca i16
189221
call void @llvm.memset.p0.i64(ptr %ptr, i8 42, i64 300, i1 false)

0 commit comments

Comments
 (0)