Skip to content

Commit e9c9941

Browse files
committed
Use MemoryLocation::getBeforeOrAfter() in BatchAA.isNoAlias(Value*, Value*)
1 parent f660110 commit e9c9941

File tree

3 files changed

+41
-12
lines changed

3 files changed

+41
-12
lines changed

llvm/include/llvm/Analysis/AliasAnalysis.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -668,9 +668,8 @@ class BatchAAResults {
668668
AliasResult::MustAlias;
669669
}
670670
bool isNoAlias(const Value *V1, const Value *V2) {
671-
return alias(MemoryLocation(V1, LocationSize::precise(1)),
672-
MemoryLocation(V2, LocationSize::precise(1))) ==
673-
AliasResult::NoAlias;
671+
return alias(MemoryLocation::getBeforeOrAfter(V1),
672+
MemoryLocation::getBeforeOrAfter(V2)) == AliasResult::NoAlias;
674673
}
675674
ModRefInfo callCapturesBefore(const Instruction *I,
676675
const MemoryLocation &MemLoc,

llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -916,7 +916,7 @@ getInitializesArgMemLoc(const Instruction *I, BatchAAResults &BatchAA) {
916916
FoundAliasing = true;
917917
AliasList.push_back(InitInfo);
918918
} else {
919-
// For ParitialAlias and MayAlias, there is an offset or may be an
919+
// For PartialAlias and MayAlias, there is an offset or may be an
920920
// unknown offset between the arguments and we insert an empty init
921921
// range to discard the entire initializes info while intersecting.
922922
FoundAliasing = true;

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

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -176,12 +176,12 @@ declare void @large_p2(ptr nocapture noundef initializes((0, 200)), ptr nocaptur
176176
; Function Attrs: mustprogress nounwind uwtable
177177
define i16 @large_p1_caller() {
178178
; CHECK-LABEL: @large_p1_caller(
179-
; CHECK-NEXT: [[PTR:%.*]] = alloca i16, align 2
179+
; CHECK-NEXT: [[PTR:%.*]] = alloca [200 x i8], align 1
180180
; CHECK-NEXT: call void @large_p1(ptr [[PTR]])
181181
; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[PTR]], align 2
182182
; CHECK-NEXT: ret i16 [[L]]
183183
;
184-
%ptr = alloca i16
184+
%ptr = alloca [200 x i8]
185185
call void @llvm.memset.p0.i64(ptr %ptr, i8 42, i64 100, i1 false)
186186
call void @large_p1(ptr %ptr)
187187
%l = load i16, ptr %ptr
@@ -191,14 +191,14 @@ define i16 @large_p1_caller() {
191191
; Function Attrs: mustprogress nounwind uwtable
192192
define i16 @large_p2_nonalias_caller() {
193193
; CHECK-LABEL: @large_p2_nonalias_caller(
194-
; CHECK-NEXT: [[PTR1:%.*]] = alloca i16, align 2
195-
; CHECK-NEXT: [[PTR2:%.*]] = alloca i16, align 2
194+
; CHECK-NEXT: [[PTR1:%.*]] = alloca [200 x i8], align 1
195+
; CHECK-NEXT: [[PTR2:%.*]] = alloca [100 x i8], align 1
196196
; CHECK-NEXT: call void @large_p2(ptr [[PTR1]], ptr [[PTR2]])
197197
; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[PTR1]], align 2
198198
; CHECK-NEXT: ret i16 [[L]]
199199
;
200-
%ptr1 = alloca i16
201-
%ptr2 = alloca i16
200+
%ptr1 = alloca [200 x i8]
201+
%ptr2 = alloca [100 x i8]
202202
call void @llvm.memset.p0.i64(ptr %ptr1, i8 42, i64 200, i1 false)
203203
call void @llvm.memset.p0.i64(ptr %ptr2, i8 42, i64 100, i1 false)
204204
call void @large_p2(ptr %ptr1, ptr %ptr2)
@@ -210,17 +210,47 @@ define i16 @large_p2_nonalias_caller() {
210210
; Function Attrs: mustprogress nounwind uwtable
211211
define i16 @large_p2_must_alias_caller() {
212212
; CHECK-LABEL: @large_p2_must_alias_caller(
213-
; CHECK-NEXT: [[PTR:%.*]] = alloca i16, align 2
213+
; CHECK-NEXT: [[PTR:%.*]] = alloca [300 x i8], align 1
214214
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 100
215215
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP1]], i8 42, i64 200, i1 false)
216216
; CHECK-NEXT: call void @large_p2(ptr [[PTR]], ptr [[PTR]])
217217
; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[PTR]], align 2
218218
; CHECK-NEXT: ret i16 [[L]]
219219
;
220-
%ptr = alloca i16
220+
%ptr = alloca [300 x i8]
221221
call void @llvm.memset.p0.i64(ptr %ptr, i8 42, i64 300, i1 false)
222222
call void @large_p2(ptr %ptr, ptr %ptr)
223223
%l = load i16, ptr %ptr
224224
ret i16 %l
225225
}
226226

227+
; Function Attrs: mustprogress nounwind uwtable
228+
define i16 @large_p2_may_or_partial_alias_caller1(ptr %base) {
229+
; CHECK-LABEL: @large_p2_may_or_partial_alias_caller1(
230+
; CHECK-NEXT: [[BASEPLUS:%.*]] = getelementptr i8, ptr [[BASE:%.*]], i64 100
231+
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr [[BASE]], i8 42, i64 300, i1 false)
232+
; CHECK-NEXT: call void @large_p2(ptr [[BASE]], ptr [[BASEPLUS]])
233+
; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[BASE]], align 2
234+
; CHECK-NEXT: ret i16 [[L]]
235+
;
236+
%baseplus = getelementptr i8, ptr %base, i64 100
237+
call void @llvm.memset.p0.i64(ptr %base, i8 42, i64 300, i1 false)
238+
call void @large_p2(ptr %base, ptr %baseplus)
239+
%l = load i16, ptr %base
240+
ret i16 %l
241+
}
242+
243+
; Function Attrs: mustprogress nounwind uwtable
244+
define i16 @large_p2_may_or_partial_alias_caller2(ptr %base1, ptr %base2) {
245+
; CHECK-LABEL: @large_p2_may_or_partial_alias_caller2(
246+
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr [[BASE1:%.*]], i8 42, i64 300, i1 false)
247+
; CHECK-NEXT: call void @large_p2(ptr [[BASE1]], ptr [[BASE2:%.*]])
248+
; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[BASE1]], align 2
249+
; CHECK-NEXT: ret i16 [[L]]
250+
;
251+
call void @llvm.memset.p0.i64(ptr %base1, i8 42, i64 300, i1 false)
252+
call void @large_p2(ptr %base1, ptr %base2)
253+
%l = load i16, ptr %base1
254+
ret i16 %l
255+
}
256+

0 commit comments

Comments
 (0)