Skip to content

Commit d1314d0

Browse files
authored
[MemoryLocation] Teach MemoryLocation about llvm.experimental.memset.pattern (llvm#120421)
Relates to (but isn't dependent on) llvm#120420. This allows alias analysis o the intrinsic of the same quality as for the libcall, which we want in order to move LoopIdiomRecognize over to selecting the intrinsic.
1 parent e00d1dd commit d1314d0

File tree

3 files changed

+14
-3
lines changed

3 files changed

+14
-3
lines changed

llvm/lib/Analysis/MemoryLocation.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,18 @@ MemoryLocation MemoryLocation::getForArgument(const CallBase *Call,
183183
AATags);
184184
return MemoryLocation::getAfter(Arg, AATags);
185185

186+
case Intrinsic::experimental_memset_pattern:
187+
assert((ArgIdx == 0 || ArgIdx == 1) &&
188+
"Invalid argument index for memory intrinsic");
189+
if (ConstantInt *LenCI = dyn_cast<ConstantInt>(II->getArgOperand(2)))
190+
return MemoryLocation(
191+
Arg,
192+
LocationSize::precise(
193+
LenCI->getZExtValue() *
194+
DL.getTypeAllocSize(II->getArgOperand(1)->getType())),
195+
AATags);
196+
return MemoryLocation::getAfter(Arg, AATags);
197+
186198
case Intrinsic::lifetime_start:
187199
case Intrinsic::lifetime_end:
188200
case Intrinsic::invariant_start:

llvm/test/Analysis/BasicAA/memset-pattern.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ define void @test_memset_pattern4_const_size(ptr noalias %a, i32 %pattern) {
44
; CHECK-LABEL: Function: test_memset_pattern4_const_size
55
; CHECK: Just Mod: Ptr: i8* %a <-> call void @llvm.experimental.memset.pattern.p0.i32.i64(ptr %a, i32 %pattern, i64 17, i1 false)
66
; CHECK-NEXT: Just Mod: Ptr: i8* %a.gep.1 <-> call void @llvm.experimental.memset.pattern.p0.i32.i64(ptr %a, i32 %pattern, i64 17, i1 false)
7-
; CHECK-NEXT: Just Mod: Ptr: i8* %a.gep.129 <-> call void @llvm.experimental.memset.pattern.p0.i32.i64(ptr %a, i32 %pattern, i64 17, i1 false)
7+
; CHECK-NEXT: NoModRef: Ptr: i8* %a.gep.129 <-> call void @llvm.experimental.memset.pattern.p0.i32.i64(ptr %a, i32 %pattern, i64 17, i1 false)
88

99
entry:
1010
load i8, ptr %a

llvm/test/Transforms/DeadStoreElimination/memory-intrinsics-sizes.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,7 @@ define void @memset_pattern_and_store_2(ptr %ptr, i64 %len) {
133133

134134
define void @memset_pattern_and_store_3(ptr %ptr) {
135135
; CHECK-LABEL: @memset_pattern_and_store_3(
136-
; CHECK-NEXT: store i64 0, ptr [[PTR:%.*]], align 4
137-
; CHECK-NEXT: call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 [[PTR]], i8 0, i64 13, i1 false)
136+
; CHECK-NEXT: call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 [[PTR:%.*]], i8 0, i64 13, i1 false)
138137
; CHECK-NEXT: ret void
139138
;
140139
store i64 0, ptr %ptr

0 commit comments

Comments
 (0)