Skip to content

Commit c865654

Browse files
committed
MemCpyOpt: fix bug
1 parent 5ca5b93 commit c865654

File tree

2 files changed

+18
-15
lines changed

2 files changed

+18
-15
lines changed

llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -656,7 +656,7 @@ bool MemCpyOptPass::processStoreOfLoad(StoreInst *SI, LoadInst *LI,
656656
BatchAAResults BAA(*AA);
657657
auto *Clobber =
658658
cast<MemoryUseOrDef>(MSSA->getWalker()->getClobberingMemoryAccess(
659-
StoreAccess, LoadLoc, BAA));
659+
StoreAccess->getDefiningAccess(), LoadLoc, BAA));
660660
Instruction *P =
661661
MSSA->dominates(LoadAccess, Clobber) ? Clobber->getMemoryInst() : SI;
662662

llvm/test/Transforms/MemCpyOpt/fca2memcpy.ll

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,9 @@ define void @noaliasdst(ptr %src, ptr noalias %dst) {
3838

3939
define void @destroysrc(ptr %src, ptr %dst) {
4040
; CHECK-LABEL: @destroysrc(
41-
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[SRC:%.*]], i8 0, i64 16, i1 false)
42-
; CHECK-NEXT: call void @llvm.memmove.p0.p0.i64(ptr align 8 [[DST:%.*]], ptr align 8 [[SRC]], i64 16, i1 false)
41+
; CHECK-NEXT: [[TMP1:%.*]] = load [[S:%.*]], ptr [[SRC:%.*]], align 8
42+
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[SRC]], i8 0, i64 16, i1 false)
43+
; CHECK-NEXT: store [[S]] [[TMP1]], ptr [[DST:%.*]], align 8
4344
; CHECK-NEXT: ret void
4445
;
4546
%1 = load %S, ptr %src
@@ -50,8 +51,8 @@ define void @destroysrc(ptr %src, ptr %dst) {
5051

5152
define void @destroynoaliassrc(ptr noalias %src, ptr %dst) {
5253
; CHECK-LABEL: @destroynoaliassrc(
53-
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[DST:%.*]], ptr align 8 [[SRC:%.*]], i64 16, i1 false)
54-
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[SRC]], i8 0, i64 16, i1 false)
54+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[DST:%.*]], ptr align 8 [[SRC]], i64 16, i1 false)
55+
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[SRC:%.*]], i8 0, i64 16, i1 false)
5556
; CHECK-NEXT: ret void
5657
;
5758
%1 = load %S, ptr %src
@@ -62,8 +63,9 @@ define void @destroynoaliassrc(ptr noalias %src, ptr %dst) {
6263

6364
define void @copyalias(ptr %src, ptr %dst) {
6465
; CHECK-LABEL: @copyalias(
65-
; CHECK-NEXT: call void @llvm.memmove.p0.p0.i64(ptr align 8 [[DST:%.*]], ptr align 8 [[SRC:%.*]], i64 16, i1 false)
66-
; CHECK-NEXT: call void @llvm.memmove.p0.p0.i64(ptr align 8 [[DST]], ptr align 8 [[SRC]], i64 16, i1 false)
66+
; CHECK-NEXT: [[TMP1:%.*]] = load [[S:%.*]], ptr [[SRC:%.*]], align 8
67+
; CHECK-NEXT: call void @llvm.memmove.p0.p0.i64(ptr align 8 [[DST:%.*]], ptr align 8 [[SRC]], i64 16, i1 false)
68+
; CHECK-NEXT: store [[S]] [[TMP1]], ptr [[DST]], align 8
6769
; CHECK-NEXT: ret void
6870
;
6971
%1 = load %S, ptr %src
@@ -77,9 +79,9 @@ define void @copyalias(ptr %src, ptr %dst) {
7779
; sure we lift the computation as well if needed and possible.
7880
define void @addrproducer(ptr %src, ptr %dst) {
7981
; CHECK-LABEL: @addrproducer(
80-
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[DST:%.*]], i8 undef, i64 16, i1 false)
8182
; CHECK-NEXT: [[DST2:%.*]] = getelementptr [[S:%.*]], ptr [[DST]], i64 1
8283
; CHECK-NEXT: call void @llvm.memmove.p0.p0.i64(ptr align 8 [[DST2]], ptr align 8 [[SRC:%.*]], i64 16, i1 false)
84+
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[DST:%.*]], i8 undef, i64 16, i1 false)
8385
; CHECK-NEXT: ret void
8486
;
8587
%1 = load %S, ptr %src
@@ -91,10 +93,11 @@ define void @addrproducer(ptr %src, ptr %dst) {
9193

9294
define void @aliasaddrproducer(ptr %src, ptr %dst, ptr %dstidptr) {
9395
; CHECK-LABEL: @aliasaddrproducer(
96+
; CHECK-NEXT: [[TMP1:%.*]] = load [[S:%.*]], ptr [[SRC:%.*]], align 8
9497
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[DST:%.*]], i8 undef, i64 16, i1 false)
9598
; CHECK-NEXT: [[DSTINDEX:%.*]] = load i32, ptr [[DSTIDPTR:%.*]], align 4
96-
; CHECK-NEXT: [[DST2:%.*]] = getelementptr [[S:%.*]], ptr [[DST]], i32 [[DSTINDEX]]
97-
; CHECK-NEXT: call void @llvm.memmove.p0.p0.i64(ptr align 8 [[DST2]], ptr align 8 [[SRC:%.*]], i64 16, i1 false)
99+
; CHECK-NEXT: [[DST2:%.*]] = getelementptr [[S]], ptr [[DST]], i32 [[DSTINDEX]]
100+
; CHECK-NEXT: store [[S]] [[TMP1]], ptr [[DST2]], align 8
98101
; CHECK-NEXT: ret void
99102
;
100103
%1 = load %S, ptr %src
@@ -107,11 +110,11 @@ define void @aliasaddrproducer(ptr %src, ptr %dst, ptr %dstidptr) {
107110

108111
define void @noaliasaddrproducer(ptr %src, ptr noalias %dst, ptr noalias %dstidptr) {
109112
; CHECK-LABEL: @noaliasaddrproducer(
110-
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[DSTIDPTR:%.*]], align 4
111-
; CHECK-NEXT: [[DSTINDEX:%.*]] = or i32 [[TMP1]], 1
113+
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[DSTIDPTR:%.*]], align 4
114+
; CHECK-NEXT: [[DSTINDEX:%.*]] = or i32 [[TMP2]], 1
112115
; CHECK-NEXT: [[DST2:%.*]] = getelementptr [[S:%.*]], ptr [[DST:%.*]], i32 [[DSTINDEX]]
113-
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[DST2]], ptr align 8 [[SRC:%.*]], i64 16, i1 false)
114-
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[SRC]], i8 undef, i64 16, i1 false)
116+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[DST2]], ptr align 8 [[SRC]], i64 16, i1 false)
117+
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[SRC:%.*]], i8 undef, i64 16, i1 false)
115118
; CHECK-NEXT: ret void
116119
;
117120
%1 = load %S, ptr %src
@@ -127,7 +130,7 @@ define void @throwing_call(ptr noalias %src, ptr %dst) {
127130
; CHECK-LABEL: @throwing_call(
128131
; CHECK-NEXT: [[TMP1:%.*]] = load [[S:%.*]], ptr [[SRC:%.*]], align 8
129132
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[SRC]], i8 0, i64 16, i1 false)
130-
; CHECK-NEXT: call void @call() #[[ATTR2:[0-9]+]]
133+
; CHECK-NEXT: call void @call() [[ATTR2:#.*]]
131134
; CHECK-NEXT: store [[S]] [[TMP1]], ptr [[DST:%.*]], align 8
132135
; CHECK-NEXT: ret void
133136
;

0 commit comments

Comments
 (0)