Skip to content

Commit c4d37c3

Browse files
committed
[MemCpyOpt] fix false negative case and add it as a true positive case(NFC)
1 parent 70d8153 commit c4d37c3

File tree

1 file changed

+53
-3
lines changed

1 file changed

+53
-3
lines changed

llvm/test/Transforms/MemCpyOpt/stack-move.ll

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -974,6 +974,54 @@ define void @store_is_def() {
974974
ret void
975975
}
976976

977+
; TODO: merge src and dest, because any execution path doesn't cause conflicts.
978+
; Tests that exists modref for both src/dest, but it never conflict on the execution.
979+
define void @multi_bb_dataflow(i1 %b) {
980+
; CHECK-LABEL: define void @multi_bb_dataflow
981+
; CHECK-SAME: (i1 [[B:%.*]]) {
982+
; CHECK-NEXT: [[SRC:%.*]] = alloca [[STRUCT_FOO:%.*]], align 4
983+
; CHECK-NEXT: [[DEST:%.*]] = alloca [[STRUCT_FOO]], align 4
984+
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 12, ptr nocapture [[SRC]])
985+
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 12, ptr nocapture [[DEST]])
986+
; CHECK-NEXT: store [[STRUCT_FOO]] { i32 10, i32 20, i32 30 }, ptr [[SRC]], align 4
987+
; CHECK-NEXT: [[TMP1:%.*]] = call i32 @use_nocapture(ptr nocapture noundef [[SRC]])
988+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[DEST]], ptr align 4 [[SRC]], i64 12, i1 false)
989+
; CHECK-NEXT: br i1 [[B]], label [[BB0:%.*]], label [[BB1:%.*]]
990+
; CHECK: bb0:
991+
; CHECK-NEXT: [[TMP2:%.*]] = call i32 @use_nocapture(ptr nocapture noundef [[SRC]])
992+
; CHECK-NEXT: br label [[BB2:%.*]]
993+
; CHECK: bb1:
994+
; CHECK-NEXT: [[TMP3:%.*]] = call i32 @use_nocapture(ptr nocapture noundef [[DEST]])
995+
; CHECK-NEXT: br label [[BB2]]
996+
; CHECK: bb2:
997+
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 12, ptr nocapture [[SRC]])
998+
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 12, ptr nocapture [[DEST]])
999+
; CHECK-NEXT: ret void
1000+
;
1001+
%src = alloca %struct.Foo, align 4
1002+
%dest = alloca %struct.Foo, align 4
1003+
call void @llvm.lifetime.start.p0(i64 12, ptr nocapture %src)
1004+
call void @llvm.lifetime.start.p0(i64 12, ptr nocapture %dest)
1005+
store %struct.Foo { i32 10, i32 20, i32 30 }, ptr %src
1006+
%1 = call i32 @use_nocapture(ptr noundef nocapture %src)
1007+
call void @llvm.memcpy.p0.p0.i64(ptr align 4 %dest, ptr align 4 %src, i64 12, i1 false)
1008+
br i1 %b, label %bb0, label %bb1
1009+
1010+
bb0:
1011+
%2 = call i32 @use_nocapture(ptr noundef nocapture %src)
1012+
br label %bb2
1013+
1014+
bb1:
1015+
%3 = call i32 @use_nocapture(ptr noundef nocapture %dest)
1016+
br label %bb2
1017+
1018+
bb2:
1019+
call void @llvm.lifetime.end.p0(i64 12, ptr nocapture %src)
1020+
call void @llvm.lifetime.end.p0(i64 12, ptr nocapture %dest)
1021+
ret void
1022+
}
1023+
1024+
9771025
; Optimization failures follow:
9781026

9791027
; Tests that a memcpy that doesn't completely overwrite a stack value is a use
@@ -1509,9 +1557,9 @@ define void @alias_src_ref_dest_mod_after_copy() {
15091557
}
15101558

15111559
; Tests that the optimization isn't performed when the source and destination
1512-
; have mod ref conflict.
1513-
define void @multi_bb_mod_ref_conflict(i1 %b) {
1514-
; CHECK-LABEL: define void @multi_bb_mod_ref_conflict
1560+
; have mod ref conflict on bb2.
1561+
define void @multi_bb_dataflow_conflict(i1 %b) {
1562+
; CHECK-LABEL: define void @multi_bb_dataflow_conflict
15151563
; CHECK-SAME: (i1 [[B:%.*]]) {
15161564
; CHECK-NEXT: [[SRC:%.*]] = alloca [[STRUCT_FOO:%.*]], align 4
15171565
; CHECK-NEXT: [[DEST:%.*]] = alloca [[STRUCT_FOO]], align 4
@@ -1528,6 +1576,7 @@ define void @multi_bb_mod_ref_conflict(i1 %b) {
15281576
; CHECK-NEXT: [[TMP3:%.*]] = call i32 @use_nocapture(ptr nocapture noundef [[DEST]])
15291577
; CHECK-NEXT: br label [[BB2]]
15301578
; CHECK: bb2:
1579+
; CHECK-NEXT: [[TMP4:%.*]] = call i32 @use_nocapture(ptr nocapture noundef [[DEST]])
15311580
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 12, ptr nocapture [[SRC]])
15321581
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 12, ptr nocapture [[DEST]])
15331582
; CHECK-NEXT: ret void
@@ -1550,6 +1599,7 @@ bb1:
15501599
br label %bb2
15511600

15521601
bb2:
1602+
%4 = call i32 @use_nocapture(ptr noundef nocapture %dest)
15531603
call void @llvm.lifetime.end.p0(i64 12, ptr nocapture %src)
15541604
call void @llvm.lifetime.end.p0(i64 12, ptr nocapture %dest)
15551605
ret void

0 commit comments

Comments
 (0)