Skip to content

Commit

Permalink
[MemCpyOpt] Avoid infinite loops in `MemCpyOptPass::processMemCpyMemC…
Browse files Browse the repository at this point in the history
…pyDependence` (#103218)

Closes #102994.
  • Loading branch information
dtcxzyw authored Aug 22, 2024
1 parent 15e915a commit 378daa6
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 0 deletions.
4 changes: 4 additions & 0 deletions llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1193,6 +1193,10 @@ bool MemCpyOptPass::processMemCpyMemCpyDependence(MemCpyInst *M,
CopySourceAlign = commonAlignment(*CopySourceAlign, MForwardOffset);
}

// Avoid infinite loops
if (BAA.isMustAlias(M->getSource(), CopySource))
return false;

// Verify that the copied-from memory doesn't change in between the two
// transfers. For example, in:
// memcpy(a <- b)
Expand Down
39 changes: 39 additions & 0 deletions llvm/test/Transforms/MemCpyOpt/pr102994.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -S -passes=memcpyopt < %s | FileCheck %s

@g1 = external global i8
@g2 = external global [64 x i8]
@g3 = global i8 0, align 1

define void @func() {
; CHECK-LABEL: define void @func() {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr getelementptr inbounds (i8, ptr @g2, i64 16), ptr getelementptr inbounds nuw (i8, ptr @g2, i64 16), i64 20, i1 false)
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr @g1, ptr getelementptr inbounds (i8, ptr @g2, i64 24), i64 1, i1 false)
; CHECK-NEXT: ret void
;
entry:
call void @llvm.memcpy.p0.p0.i64(ptr getelementptr inbounds (i8, ptr @g2, i64 16), ptr getelementptr inbounds nuw (i8, ptr @g2, i64 16), i64 20, i1 false)
call void @llvm.memcpy.p0.p0.i64(ptr @g1, ptr getelementptr inbounds (i8, ptr @g2, i64 24), i64 1, i1 false)
ret void
}

define void @func2(ptr %p) {
; CHECK-LABEL: define void @func2(
; CHECK-SAME: ptr [[P:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i8, ptr [[P]], i64 32
; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i8, ptr [[P]], i64 34
; CHECK-NEXT: [[GEP3:%.*]] = getelementptr i8, ptr [[P]], i64 32
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[GEP1]], ptr [[GEP3]], i64 32, i1 false)
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr @g3, ptr [[GEP2]], i64 1, i1 false)
; CHECK-NEXT: ret void
;
entry:
%gep1 = getelementptr i8, ptr %p, i64 32
%gep2 = getelementptr i8, ptr %p, i64 34
%gep3 = getelementptr i8, ptr %p, i64 32
call void @llvm.memcpy.p0.p0.i64(ptr %gep1, ptr %gep3, i64 32, i1 false)
call void @llvm.memcpy.p0.p0.i64(ptr @g3, ptr %gep2, i64 1, i1 false)
ret void
}

0 comments on commit 378daa6

Please sign in to comment.