Skip to content

Commit 11a41b7

Browse files
committed
[MemCpyOpt] Avoid infinite loops in MemCpyOptPass::processMemCpyMemCpyDependence
1 parent 7030280 commit 11a41b7

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1198,6 +1198,10 @@ bool MemCpyOptPass::processMemCpyMemCpyDependence(MemCpyInst *M,
11981198
CopySourceAlign = commonAlignment(*CopySourceAlign, MForwardOffset);
11991199
}
12001200

1201+
// Avoid infinite loops
1202+
if (BAA.isMustAlias(M->getSource(), CopySource))
1203+
return false;
1204+
12011205
// Verify that the copied-from memory doesn't change in between the two
12021206
// transfers. For example, in:
12031207
// memcpy(a <- b)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -S -passes=memcpyopt < %s | FileCheck %s
3+
4+
@g1 = external global i8
5+
@g2 = external global [64 x i8]
6+
7+
define void @func() {
8+
; CHECK-LABEL: define void @func() {
9+
; CHECK-NEXT: [[ENTRY:.*:]]
10+
; 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)
11+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr @g1, ptr getelementptr inbounds (i8, ptr @g2, i64 24), i64 1, i1 false)
12+
; CHECK-NEXT: ret void
13+
;
14+
entry:
15+
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)
16+
call void @llvm.memcpy.p0.p0.i64(ptr @g1, ptr getelementptr inbounds (i8, ptr @g2, i64 24), i64 1, i1 false)
17+
ret void
18+
}

0 commit comments

Comments
 (0)