@@ -974,6 +974,54 @@ define void @store_is_def() {
974
974
ret void
975
975
}
976
976
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
+
977
1025
; Optimization failures follow:
978
1026
979
1027
; 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() {
1509
1557
}
1510
1558
1511
1559
; 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
1515
1563
; CHECK-SAME: (i1 [[B:%.*]]) {
1516
1564
; CHECK-NEXT: [[SRC:%.*]] = alloca [[STRUCT_FOO:%.*]], align 4
1517
1565
; CHECK-NEXT: [[DEST:%.*]] = alloca [[STRUCT_FOO]], align 4
@@ -1528,6 +1576,7 @@ define void @multi_bb_mod_ref_conflict(i1 %b) {
1528
1576
; CHECK-NEXT: [[TMP3:%.*]] = call i32 @use_nocapture(ptr nocapture noundef [[DEST]])
1529
1577
; CHECK-NEXT: br label [[BB2]]
1530
1578
; CHECK: bb2:
1579
+ ; CHECK-NEXT: [[TMP4:%.*]] = call i32 @use_nocapture(ptr nocapture noundef [[DEST]])
1531
1580
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 12, ptr nocapture [[SRC]])
1532
1581
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 12, ptr nocapture [[DEST]])
1533
1582
; CHECK-NEXT: ret void
@@ -1550,6 +1599,7 @@ bb1:
1550
1599
br label %bb2
1551
1600
1552
1601
bb2:
1602
+ %4 = call i32 @use_nocapture (ptr noundef nocapture %dest )
1553
1603
call void @llvm.lifetime.end.p0 (i64 12 , ptr nocapture %src )
1554
1604
call void @llvm.lifetime.end.p0 (i64 12 , ptr nocapture %dest )
1555
1605
ret void
0 commit comments