@@ -743,6 +743,42 @@ bb2:
743
743
744
744
}
745
745
746
+ ; Test for existing unreachable cycle
747
+ define void @multi_bb_pdom_test2 (i1 %b ) {
748
+ ; CHECK-LABEL: define void @multi_bb_pdom_test2
749
+ ; CHECK-SAME: (i1 [[B:%.*]]) {
750
+ ; CHECK-NEXT: [[SRC:%.*]] = alloca [[STRUCT_FOO:%.*]], align 4
751
+ ; CHECK-NEXT: [[DEST:%.*]] = alloca [[STRUCT_FOO]], align 4
752
+ ; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 12, ptr nocapture [[DEST]])
753
+ ; CHECK-NEXT: store [[STRUCT_FOO]] { i32 10, i32 20, i32 30 }, ptr [[SRC]], align 4
754
+ ; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[DEST]], ptr align 4 [[SRC]], i64 12, i1 false)
755
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i32 @use_nocapture(ptr nocapture noundef [[DEST]])
756
+ ; CHECK-NEXT: ret void
757
+ ; CHECK: unr1:
758
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @use_nocapture(ptr nocapture noundef [[DEST]])
759
+ ; CHECK-NEXT: br label [[UNR2:%.*]]
760
+ ; CHECK: unr2:
761
+ ; CHECK-NEXT: [[TMP3:%.*]] = call i32 @use_nocapture(ptr nocapture noundef [[DEST]])
762
+ ; CHECK-NEXT: br label [[UNR1:%.*]]
763
+ ;
764
+ %src = alloca %struct.Foo , align 4
765
+ %dest = alloca %struct.Foo , align 4
766
+ call void @llvm.lifetime.start.p0 (i64 12 , ptr nocapture %dest )
767
+ store %struct.Foo { i32 10 , i32 20 , i32 30 }, ptr %src
768
+ call void @llvm.memcpy.p0.p0.i64 (ptr align 4 %dest , ptr align 4 %src , i64 12 , i1 false ); 1
769
+ %1 = call i32 @use_nocapture (ptr noundef nocapture %dest )
770
+ ret void
771
+
772
+ unr1:
773
+ %2 = call i32 @use_nocapture (ptr noundef nocapture %dest )
774
+ br label %unr2
775
+
776
+ unr2:
777
+ %3 = call i32 @use_nocapture (ptr noundef nocapture %dest )
778
+ br label %unr1
779
+
780
+ }
781
+
746
782
; TODO: merge allocas for multi basicblock loop case.
747
783
define void @multi_bb_loop (i32 %n ) {
748
784
; CHECK-LABEL: define void @multi_bb_loop
0 commit comments