1 ; RUN: opt -S -passes=loop-fusion < %s 2>&1 | FileCheck %s
3 @A = common global [1024 x [1024 x i32]] zeroinitializer, align 16
4 @B = common global [1024 x [1024 x i32]] zeroinitializer, align 16
6 ; CHECK: void @dep_free
8 ; CHECK-NEXT: br label %[[LOOP1HEADER:bb[0-9]*]]
9 ; CHECK: [[LOOP1HEADER]]
10 ; CHECK: br i1 %{{.*}}, label %[[LOOP1BODY:bb[0-9]*]], label %[[LOOP2PREHEADER:bb[0-9]+]]
11 ; CHECK: [[LOOP1BODY]]
12 ; CHECK: br label %[[LOOP1LATCH:bb[0-9]*]]
13 ; CHECK: [[LOOP1LATCH]]
14 ; CHECK: br label %[[LOOP2PREHEADER:bb[0-9]+]]
15 ; CHECK: [[LOOP2PREHEADER]]
16 ; CHECK: br i1 %{{.*}}, label %[[LOOP2BODY:bb[0-9]*]], label %[[LOOP2EXIT:bb[0-9]*]]
17 ; CHECK: [[LOOP2BODY]]
18 ; CHECK: br label %[[LOOP2LATCH:bb[0-9]+]]
19 ; CHECK: [[LOOP2LATCH]]
20 ; CHECK: br label %[[LOOP1HEADER]]
23 define void @dep_free() {
27 bb9: ; preds = %bb35, %bb
28 %indvars.iv6 = phi i64 [ %indvars.iv.next7, %bb35 ], [ 0, %bb ]
29 %.0 = phi i32 [ 0, %bb ], [ %tmp36, %bb35 ]
30 %exitcond8 = icmp ne i64 %indvars.iv6, 100
31 br i1 %exitcond8, label %bb11, label %bb10
39 bb12: ; preds = %bb21, %bb11
40 %indvars.iv = phi i64 [ %indvars.iv.next, %bb21 ], [ 0, %bb11 ]
41 %exitcond = icmp ne i64 %indvars.iv, 100
42 br i1 %exitcond, label %bb14, label %bb23
45 %tmp = add nsw i32 %.0, -3
46 %tmp15 = add nuw nsw i64 %indvars.iv6, 3
47 %tmp16 = trunc i64 %tmp15 to i32
48 %tmp17 = mul nsw i32 %tmp, %tmp16
49 %tmp18 = trunc i64 %indvars.iv6 to i32
50 %tmp19 = srem i32 %tmp17, %tmp18
51 %tmp20 = getelementptr inbounds [1024 x [1024 x i32]], ptr @A, i64 0, i64 %indvars.iv6, i64 %indvars.iv
52 store i32 %tmp19, ptr %tmp20, align 4
56 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
59 bb23: ; preds = %bb33, %bb12
60 %indvars.iv3 = phi i64 [ %indvars.iv.next4, %bb33 ], [ 0, %bb12 ]
61 %exitcond5 = icmp ne i64 %indvars.iv3, 100
62 br i1 %exitcond5, label %bb25, label %bb35
65 %tmp26 = add nsw i32 %.0, -3
66 %tmp27 = add nuw nsw i64 %indvars.iv6, 3
67 %tmp28 = trunc i64 %tmp27 to i32
68 %tmp29 = mul nsw i32 %tmp26, %tmp28
69 %tmp30 = trunc i64 %indvars.iv6 to i32
70 %tmp31 = srem i32 %tmp29, %tmp30
71 %tmp32 = getelementptr inbounds [1024 x [1024 x i32]], ptr @B, i64 0, i64 %indvars.iv6, i64 %indvars.iv3
72 store i32 %tmp31, ptr %tmp32, align 4
76 %indvars.iv.next4 = add nuw nsw i64 %indvars.iv3, 1
80 %indvars.iv.next7 = add nuw nsw i64 %indvars.iv6, 1
81 %tmp36 = add nuw nsw i32 %.0, 1