Skip to content

Commit 99685a5

Browse files
authored
[MemCpyOpt] Use dyn_cast to fix assertion failure in processMemCpyMemCpyDependence (#98686)
Fixes #98675.
1 parent 22b7b84 commit 99685a5

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1188,9 +1188,9 @@ bool MemCpyOptPass::processMemCpyMemCpyDependence(MemCpyInst *M,
11881188
if (MDestOffset == MForwardOffset)
11891189
CopySource = M->getDest();
11901190
else {
1191-
NewCopySource = cast<Instruction>(Builder.CreateInBoundsPtrAdd(
1192-
CopySource, Builder.getInt64(MForwardOffset)));
1193-
CopySource = NewCopySource;
1191+
CopySource = Builder.CreateInBoundsPtrAdd(
1192+
CopySource, Builder.getInt64(MForwardOffset));
1193+
NewCopySource = dyn_cast<Instruction>(CopySource);
11941194
}
11951195
// We need to update `MCopyLoc` if an offset exists.
11961196
MCopyLoc = MCopyLoc.getWithNewPtr(CopySource);

llvm/test/Transforms/MemCpyOpt/memcpy-memcpy-offset.ll

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,23 @@ define void @do_not_forward_offset_and_store(ptr %src, ptr %dest) {
197197
ret void
198198
}
199199

200+
; Make sure we don't crash when the copy source is a constant.
201+
@buf = external global [32 x i8]
202+
203+
define void @pr98675(ptr noalias %p1, ptr noalias %p2) {
204+
; CHECK-LABEL: define void @pr98675(
205+
; CHECK-SAME: ptr noalias [[P1:%.*]], ptr noalias [[P2:%.*]]) {
206+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[P1]], ptr @buf, i64 26, i1 false)
207+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[P1]], i64 10
208+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[P2]], ptr getelementptr inbounds (i8, ptr @buf, i64 10), i64 1, i1 false)
209+
; CHECK-NEXT: ret void
210+
;
211+
call void @llvm.memcpy.p0.p0.i64(ptr %p1, ptr @buf, i64 26, i1 false)
212+
%gep = getelementptr i8, ptr %p1, i64 10
213+
call void @llvm.memmove.p0.p0.i64(ptr %p2, ptr %gep, i64 1, i1 false)
214+
ret void
215+
}
216+
200217
declare void @use(ptr)
201218

202219
declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1)

0 commit comments

Comments
 (0)