Skip to content

Commit 6181a06

Browse files
authored
[NFC][LoopFuse] Regenerate LoopFusion tests using UTC (#146902)
1 parent 7e3e2e1 commit 6181a06

File tree

9 files changed

+455
-162
lines changed

9 files changed

+455
-162
lines changed

llvm/test/Transforms/LoopFusion/four_loops.ll

Lines changed: 71 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,82 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
12
; RUN: opt -S -passes=loop-fusion < %s | FileCheck %s
23

34
@A = common global [1024 x i32] zeroinitializer, align 16
45
@B = common global [1024 x i32] zeroinitializer, align 16
56
@C = common global [1024 x i32] zeroinitializer, align 16
67
@D = common global [1024 x i32] zeroinitializer, align 16
78

8-
; CHECK: void @dep_free
9-
; CHECK-NEXT: bb:
10-
; CHECK-NEXT: br label %[[LOOP1HEADER:bb[0-9]+]]
11-
; CHECK: [[LOOP1HEADER]]
12-
; CHECK: br label %[[LOOP2BODY:bb[0-9]+]]
13-
; CHECK: [[LOOP2BODY]]
14-
; CHECK: br label %[[LOOP3BODY:bb[0-9]+]]
15-
; CHECK: [[LOOP3BODY]]
16-
; CHECK: br label %[[LOOP4BODY:bb[0-9]+]]
17-
; CHECK: [[LOOP4BODY]]
18-
; CHECK: br label %[[LOOP1LATCH:bb[0-9]+]]
19-
; CHECK: [[LOOP1LATCH]]
20-
; CHECK: br i1 %{{.*}}, label %[[LOOP1HEADER]], label %[[LOOPEXIT:bb[0-9]+]]
21-
; CHECK: ret void
229
define void @dep_free() {
10+
; CHECK-LABEL: define void @dep_free() {
11+
; CHECK-NEXT: [[BB:.*]]:
12+
; CHECK-NEXT: br label %[[BB15:.*]]
13+
; CHECK: [[BB15]]:
14+
; CHECK-NEXT: [[DOT08:%.*]] = phi i32 [ 0, %[[BB]] ], [ [[TMP23:%.*]], %[[BB61:.*]] ]
15+
; CHECK-NEXT: [[INDVARS_IV107:%.*]] = phi i64 [ 0, %[[BB]] ], [ [[INDVARS_IV_NEXT11:%.*]], %[[BB61]] ]
16+
; CHECK-NEXT: [[DOT016:%.*]] = phi i32 [ 0, %[[BB]] ], [ [[TMP36:%.*]], %[[BB61]] ]
17+
; CHECK-NEXT: [[INDVARS_IV75:%.*]] = phi i64 [ 0, %[[BB]] ], [ [[INDVARS_IV_NEXT8:%.*]], %[[BB61]] ]
18+
; CHECK-NEXT: [[DOT024:%.*]] = phi i32 [ 0, %[[BB]] ], [ [[TMP49:%.*]], %[[BB61]] ]
19+
; CHECK-NEXT: [[INDVARS_IV43:%.*]] = phi i64 [ 0, %[[BB]] ], [ [[INDVARS_IV_NEXT5:%.*]], %[[BB61]] ]
20+
; CHECK-NEXT: [[DOT032:%.*]] = phi i32 [ 0, %[[BB]] ], [ [[TMP62:%.*]], %[[BB61]] ]
21+
; CHECK-NEXT: [[INDVARS_IV1:%.*]] = phi i64 [ 0, %[[BB]] ], [ [[INDVARS_IV_NEXT:%.*]], %[[BB61]] ]
22+
; CHECK-NEXT: [[TMP:%.*]] = add nsw i32 [[DOT08]], -3
23+
; CHECK-NEXT: [[TMP16:%.*]] = add nuw nsw i64 [[INDVARS_IV107]], 3
24+
; CHECK-NEXT: [[TMP17:%.*]] = trunc i64 [[TMP16]] to i32
25+
; CHECK-NEXT: [[TMP18:%.*]] = mul nsw i32 [[TMP]], [[TMP17]]
26+
; CHECK-NEXT: [[TMP19:%.*]] = trunc i64 [[INDVARS_IV107]] to i32
27+
; CHECK-NEXT: [[TMP20:%.*]] = srem i32 [[TMP18]], [[TMP19]]
28+
; CHECK-NEXT: [[TMP21:%.*]] = getelementptr inbounds [1024 x i32], ptr @A, i64 0, i64 [[INDVARS_IV107]]
29+
; CHECK-NEXT: store i32 [[TMP20]], ptr [[TMP21]], align 4
30+
; CHECK-NEXT: br label %[[BB22:.*]]
31+
; CHECK: [[BB22]]:
32+
; CHECK-NEXT: [[TMP28:%.*]] = add nsw i32 [[DOT016]], -3
33+
; CHECK-NEXT: [[TMP29:%.*]] = add nuw nsw i64 [[INDVARS_IV75]], 3
34+
; CHECK-NEXT: [[TMP30:%.*]] = trunc i64 [[TMP29]] to i32
35+
; CHECK-NEXT: [[TMP31:%.*]] = mul nsw i32 [[TMP28]], [[TMP30]]
36+
; CHECK-NEXT: [[TMP32:%.*]] = trunc i64 [[INDVARS_IV75]] to i32
37+
; CHECK-NEXT: [[TMP33:%.*]] = srem i32 [[TMP31]], [[TMP32]]
38+
; CHECK-NEXT: [[TMP34:%.*]] = getelementptr inbounds [1024 x i32], ptr @B, i64 0, i64 [[INDVARS_IV75]]
39+
; CHECK-NEXT: store i32 [[TMP33]], ptr [[TMP34]], align 4
40+
; CHECK-NEXT: br label %[[BB35:.*]]
41+
; CHECK: [[BB35]]:
42+
; CHECK-NEXT: [[TMP41:%.*]] = add nsw i32 [[DOT024]], -3
43+
; CHECK-NEXT: [[TMP42:%.*]] = add nuw nsw i64 [[INDVARS_IV43]], 3
44+
; CHECK-NEXT: [[TMP43:%.*]] = trunc i64 [[TMP42]] to i32
45+
; CHECK-NEXT: [[TMP44:%.*]] = mul nsw i32 [[TMP41]], [[TMP43]]
46+
; CHECK-NEXT: [[TMP45:%.*]] = trunc i64 [[INDVARS_IV43]] to i32
47+
; CHECK-NEXT: [[TMP46:%.*]] = srem i32 [[TMP44]], [[TMP45]]
48+
; CHECK-NEXT: [[TMP47:%.*]] = getelementptr inbounds [1024 x i32], ptr @C, i64 0, i64 [[INDVARS_IV43]]
49+
; CHECK-NEXT: store i32 [[TMP46]], ptr [[TMP47]], align 4
50+
; CHECK-NEXT: br label %[[BB48:.*]]
51+
; CHECK: [[BB48]]:
52+
; CHECK-NEXT: [[TMP54:%.*]] = add nsw i32 [[DOT032]], -3
53+
; CHECK-NEXT: [[TMP55:%.*]] = add nuw nsw i64 [[INDVARS_IV1]], 3
54+
; CHECK-NEXT: [[TMP56:%.*]] = trunc i64 [[TMP55]] to i32
55+
; CHECK-NEXT: [[TMP57:%.*]] = mul nsw i32 [[TMP54]], [[TMP56]]
56+
; CHECK-NEXT: [[TMP58:%.*]] = trunc i64 [[INDVARS_IV1]] to i32
57+
; CHECK-NEXT: [[TMP59:%.*]] = srem i32 [[TMP57]], [[TMP58]]
58+
; CHECK-NEXT: [[TMP60:%.*]] = getelementptr inbounds [1024 x i32], ptr @D, i64 0, i64 [[INDVARS_IV1]]
59+
; CHECK-NEXT: store i32 [[TMP59]], ptr [[TMP60]], align 4
60+
; CHECK-NEXT: br label %[[BB61]]
61+
; CHECK: [[BB52:.*]]:
62+
; CHECK-NEXT: br label %[[BB63:.*]]
63+
; CHECK: [[BB61]]:
64+
; CHECK-NEXT: [[INDVARS_IV_NEXT11]] = add nuw nsw i64 [[INDVARS_IV107]], 1
65+
; CHECK-NEXT: [[TMP23]] = add nuw nsw i32 [[DOT08]], 1
66+
; CHECK-NEXT: [[EXITCOND12:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT11]], 100
67+
; CHECK-NEXT: [[INDVARS_IV_NEXT8]] = add nuw nsw i64 [[INDVARS_IV75]], 1
68+
; CHECK-NEXT: [[TMP36]] = add nuw nsw i32 [[DOT016]], 1
69+
; CHECK-NEXT: [[EXITCOND9:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT8]], 100
70+
; CHECK-NEXT: [[INDVARS_IV_NEXT5]] = add nuw nsw i64 [[INDVARS_IV43]], 1
71+
; CHECK-NEXT: [[TMP49]] = add nuw nsw i32 [[DOT024]], 1
72+
; CHECK-NEXT: [[EXITCOND6:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT5]], 100
73+
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV1]], 1
74+
; CHECK-NEXT: [[TMP62]] = add nuw nsw i32 [[DOT032]], 1
75+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT]], 100
76+
; CHECK-NEXT: br i1 [[EXITCOND]], label %[[BB15]], label %[[BB52]]
77+
; CHECK: [[BB63]]:
78+
; CHECK-NEXT: ret void
79+
;
2380
bb:
2481
br label %bb15
2582

llvm/test/Transforms/LoopFusion/guarded_peel.ll

Lines changed: 68 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
12
; RUN: opt -S -passes=loop-fusion -loop-fusion-peel-max-count=3 < %s | FileCheck %s
23

34
; Tests if we are able to fuse two guarded loops which have constant but
@@ -6,33 +7,75 @@
67

78
@B = common global [1024 x i32] zeroinitializer, align 16
89

9-
; CHECK-LABEL: void @main(ptr noalias %A)
10-
; CHECK-NEXT: entry:
11-
; CHECK: br i1 %cmp4, label %for.first.entry, label %for.end
12-
; CHECK: for.first.entry
13-
; CHECK-NEXT: br label %for.first.peel.begin
14-
; CHECK: for.first.peel.begin:
15-
; CHECK-NEXT: br label %for.first.peel
16-
; CHECK: for.first.peel:
17-
; CHECK: br label %for.first.peel.next
18-
; CHECK: for.first.peel.next:
19-
; CHECK-NEXT: br label %for.first.peel2
20-
; CHECK: for.first.peel2:
21-
; CHECK: br label %for.first.peel.next1
22-
; CHECK: for.first.peel.next1:
23-
; CHECK-NEXT: br label %for.first.peel.next11
24-
; CHECK: for.first.peel.next11:
25-
; CHECK-NEXT: br label %for.first.entry.peel.newph
26-
; CHECK: for.first.entry.peel.newph:
27-
; CHECK: br label %for.first
28-
; CHECK: for.first:
29-
; CHECK: br i1 %cmp3, label %for.first, label %for.second.exit
30-
; CHECK: for.second.exit:
31-
; CHECK: br label %for.end
32-
; CHECK: for.end:
33-
; CHECK-NEXT: ret void
3410

3511
define void @main(ptr noalias %A) {
12+
; CHECK-LABEL: define void @main(
13+
; CHECK-SAME: ptr noalias [[A:%.*]]) {
14+
; CHECK-NEXT: [[ENTRY:.*:]]
15+
; CHECK-NEXT: [[CMP4:%.*]] = icmp slt i64 0, 45
16+
; CHECK-NEXT: [[CMP31:%.*]] = icmp slt i64 2, 45
17+
; CHECK-NEXT: br i1 [[CMP4]], label %[[FOR_FIRST_ENTRY:.*]], label %[[FOR_END:.*]]
18+
; CHECK: [[FOR_FIRST_ENTRY]]:
19+
; CHECK-NEXT: br label %[[FOR_FIRST_PEEL_BEGIN:.*]]
20+
; CHECK: [[FOR_FIRST_PEEL_BEGIN]]:
21+
; CHECK-NEXT: br label %[[FOR_FIRST_PEEL:.*]]
22+
; CHECK: [[FOR_FIRST_PEEL]]:
23+
; CHECK-NEXT: [[SUB_PEEL:%.*]] = sub nsw i64 0, 3
24+
; CHECK-NEXT: [[ADD_PEEL:%.*]] = add nsw i64 0, 3
25+
; CHECK-NEXT: [[MUL_PEEL:%.*]] = mul nsw i64 [[SUB_PEEL]], [[ADD_PEEL]]
26+
; CHECK-NEXT: [[REM_PEEL:%.*]] = srem i64 [[MUL_PEEL]], 0
27+
; CHECK-NEXT: [[CONV_PEEL:%.*]] = trunc i64 [[REM_PEEL]] to i32
28+
; CHECK-NEXT: [[ARRAYIDX_PEEL:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 0
29+
; CHECK-NEXT: store i32 [[CONV_PEEL]], ptr [[ARRAYIDX_PEEL]], align 4
30+
; CHECK-NEXT: [[INC_PEEL:%.*]] = add nsw i64 0, 1
31+
; CHECK-NEXT: [[CMP_PEEL:%.*]] = icmp slt i64 [[INC_PEEL]], 45
32+
; CHECK-NEXT: br label %[[FOR_FIRST_PEEL_NEXT:.*]]
33+
; CHECK: [[FOR_FIRST_PEEL_NEXT]]:
34+
; CHECK-NEXT: br label %[[FOR_FIRST_PEEL2:.*]]
35+
; CHECK: [[FOR_FIRST_PEEL2]]:
36+
; CHECK-NEXT: [[SUB_PEEL3:%.*]] = sub nsw i64 [[INC_PEEL]], 3
37+
; CHECK-NEXT: [[ADD_PEEL4:%.*]] = add nsw i64 [[INC_PEEL]], 3
38+
; CHECK-NEXT: [[MUL_PEEL5:%.*]] = mul nsw i64 [[SUB_PEEL3]], [[ADD_PEEL4]]
39+
; CHECK-NEXT: [[REM_PEEL6:%.*]] = srem i64 [[MUL_PEEL5]], [[INC_PEEL]]
40+
; CHECK-NEXT: [[CONV_PEEL7:%.*]] = trunc i64 [[REM_PEEL6]] to i32
41+
; CHECK-NEXT: [[ARRAYIDX_PEEL8:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INC_PEEL]]
42+
; CHECK-NEXT: store i32 [[CONV_PEEL7]], ptr [[ARRAYIDX_PEEL8]], align 4
43+
; CHECK-NEXT: [[INC_PEEL9:%.*]] = add nsw i64 [[INC_PEEL]], 1
44+
; CHECK-NEXT: [[CMP_PEEL10:%.*]] = icmp slt i64 [[INC_PEEL9]], 45
45+
; CHECK-NEXT: br label %[[FOR_FIRST_PEEL_NEXT1:.*]]
46+
; CHECK: [[FOR_FIRST_PEEL_NEXT1]]:
47+
; CHECK-NEXT: br label %[[FOR_FIRST_PEEL_NEXT11:.*]]
48+
; CHECK: [[FOR_FIRST_PEEL_NEXT11]]:
49+
; CHECK-NEXT: br label %[[FOR_FIRST_ENTRY_PEEL_NEWPH:.*]]
50+
; CHECK: [[FOR_FIRST_ENTRY_PEEL_NEWPH]]:
51+
; CHECK-NEXT: br label %[[FOR_FIRST:.*]]
52+
; CHECK: [[FOR_FIRST]]:
53+
; CHECK-NEXT: [[I_05:%.*]] = phi i64 [ [[INC:%.*]], %[[FOR_FIRST]] ], [ [[INC_PEEL9]], %[[FOR_FIRST_ENTRY_PEEL_NEWPH]] ]
54+
; CHECK-NEXT: [[I1_02:%.*]] = phi i64 [ [[INC14:%.*]], %[[FOR_FIRST]] ], [ 2, %[[FOR_FIRST_ENTRY_PEEL_NEWPH]] ]
55+
; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[I_05]], 3
56+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[I_05]], 3
57+
; CHECK-NEXT: [[MUL:%.*]] = mul nsw i64 [[SUB]], [[ADD]]
58+
; CHECK-NEXT: [[REM:%.*]] = srem i64 [[MUL]], [[I_05]]
59+
; CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[REM]] to i32
60+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[I_05]]
61+
; CHECK-NEXT: store i32 [[CONV]], ptr [[ARRAYIDX]], align 4
62+
; CHECK-NEXT: [[INC]] = add nsw i64 [[I_05]], 1
63+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[INC]], 45
64+
; CHECK-NEXT: [[SUB7:%.*]] = sub nsw i64 [[I1_02]], 3
65+
; CHECK-NEXT: [[ADD8:%.*]] = add nsw i64 [[I1_02]], 3
66+
; CHECK-NEXT: [[MUL9:%.*]] = mul nsw i64 [[SUB7]], [[ADD8]]
67+
; CHECK-NEXT: [[REM10:%.*]] = srem i64 [[MUL9]], [[I1_02]]
68+
; CHECK-NEXT: [[CONV11:%.*]] = trunc i64 [[REM10]] to i32
69+
; CHECK-NEXT: [[ARRAYIDX12:%.*]] = getelementptr inbounds [1024 x i32], ptr @B, i64 0, i64 [[I1_02]]
70+
; CHECK-NEXT: store i32 [[CONV11]], ptr [[ARRAYIDX12]], align 4
71+
; CHECK-NEXT: [[INC14]] = add nsw i64 [[I1_02]], 1
72+
; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i64 [[INC14]], 45
73+
; CHECK-NEXT: br i1 [[CMP3]], label %[[FOR_FIRST]], label %[[FOR_SECOND_EXIT:.*]]
74+
; CHECK: [[FOR_SECOND_EXIT]]:
75+
; CHECK-NEXT: br label %[[FOR_END]]
76+
; CHECK: [[FOR_END]]:
77+
; CHECK-NEXT: ret void
78+
;
3679
entry:
3780
%cmp4 = icmp slt i64 0, 45
3881
br i1 %cmp4, label %for.first.entry, label %for.second.guard

llvm/test/Transforms/LoopFusion/guarded_unsafeblock_peel.ll

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
12
; RUN: opt -S -passes=loop-fusion -loop-fusion-peel-max-count=3 < %s | FileCheck %s
23

34
; Tests that we do not fuse two guarded loops together.
@@ -6,28 +7,42 @@
67
; loops unsafe to fuse together.
78
; The expected output of this test is the function as below.
89

9-
; CHECK-LABEL: void @unsafe_exitblock(ptr noalias %A, ptr noalias %B)
10-
; CHECK: for.first.guard
11-
; CHECK: br i1 %cmp3, label %for.first.preheader, label %for.second.guard
12-
; CHECK: for.first.preheader:
13-
; CHECK-NEXT: br label %for.first
14-
; CHECK: for.first:
15-
; CHECK: br i1 %cmp, label %for.first, label %for.first.exit
16-
; CHECK: for.first.exit:
17-
; CHECK-NEXT: call void @bar()
18-
; CHECK-NEXT: br label %for.second.guard
19-
; CHECK: for.second.guard:
20-
; CHECK: br i1 %cmp21, label %for.second.preheader, label %for.end
21-
; CHECK: for.second.preheader:
22-
; CHECK-NEXT: br label %for.second
23-
; CHECK: for.second:
24-
; CHECK: br i1 %cmp2, label %for.second, label %for.second.exit
25-
; CHECK: for.second.exit:
26-
; CHECK-NEXT: br label %for.end
27-
; CHECK: for.end:
28-
; CHECK-NEXT: ret void
2910

3011
define void @unsafe_exitblock(ptr noalias %A, ptr noalias %B) {
12+
; CHECK-LABEL: define void @unsafe_exitblock(
13+
; CHECK-SAME: ptr noalias [[A:%.*]], ptr noalias [[B:%.*]]) {
14+
; CHECK-NEXT: [[FOR_FIRST_GUARD:.*:]]
15+
; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i64 0, 45
16+
; CHECK-NEXT: br i1 [[CMP3]], label %[[FOR_FIRST_PREHEADER:.*]], label %[[FOR_SECOND_GUARD:.*]]
17+
; CHECK: [[FOR_FIRST_PREHEADER]]:
18+
; CHECK-NEXT: br label %[[FOR_FIRST:.*]]
19+
; CHECK: [[FOR_FIRST]]:
20+
; CHECK-NEXT: [[I_04:%.*]] = phi i64 [ [[INC:%.*]], %[[FOR_FIRST]] ], [ 0, %[[FOR_FIRST_PREHEADER]] ]
21+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[I_04]]
22+
; CHECK-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4
23+
; CHECK-NEXT: [[INC]] = add nsw i64 [[I_04]], 1
24+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[INC]], 45
25+
; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_FIRST]], label %[[FOR_FIRST_EXIT:.*]]
26+
; CHECK: [[FOR_FIRST_EXIT]]:
27+
; CHECK-NEXT: call void @bar()
28+
; CHECK-NEXT: br label %[[FOR_SECOND_GUARD]]
29+
; CHECK: [[FOR_SECOND_GUARD]]:
30+
; CHECK-NEXT: [[CMP21:%.*]] = icmp slt i64 2, 45
31+
; CHECK-NEXT: br i1 [[CMP21]], label %[[FOR_SECOND_PREHEADER:.*]], label %[[FOR_END:.*]]
32+
; CHECK: [[FOR_SECOND_PREHEADER]]:
33+
; CHECK-NEXT: br label %[[FOR_SECOND:.*]]
34+
; CHECK: [[FOR_SECOND]]:
35+
; CHECK-NEXT: [[J_02:%.*]] = phi i64 [ [[INC6:%.*]], %[[FOR_SECOND]] ], [ 2, %[[FOR_SECOND_PREHEADER]] ]
36+
; CHECK-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[J_02]]
37+
; CHECK-NEXT: store i32 0, ptr [[ARRAYIDX4]], align 4
38+
; CHECK-NEXT: [[INC6]] = add nsw i64 [[J_02]], 1
39+
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i64 [[INC6]], 45
40+
; CHECK-NEXT: br i1 [[CMP2]], label %[[FOR_SECOND]], label %[[FOR_SECOND_EXIT:.*]]
41+
; CHECK: [[FOR_SECOND_EXIT]]:
42+
; CHECK-NEXT: br label %[[FOR_END]]
43+
; CHECK: [[FOR_END]]:
44+
; CHECK-NEXT: ret void
45+
;
3146
for.first.guard:
3247
%cmp3 = icmp slt i64 0, 45
3348
br i1 %cmp3, label %for.first.preheader, label %for.second.guard

llvm/test/Transforms/LoopFusion/hoist_preheader.ll

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,27 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
12
; RUN: opt -S -passes=loop-fusion < %s | FileCheck %s
23

34
define void @hoist_preheader(i32 %N) {
4-
5-
; CHECK:pre1:
6-
; CHECK-NEXT: %hoistme = add i32 1, %N
7-
; CHECK-NEXT: %hoistme2 = add i32 1, %hoistme
8-
; CHECK-NEXT: br label %body1
5+
; CHECK-LABEL: define void @hoist_preheader(
6+
; CHECK-SAME: i32 [[N:%.*]]) {
7+
; CHECK-NEXT: [[PRE1:.*]]:
8+
; CHECK-NEXT: [[HOISTME:%.*]] = add i32 1, [[N]]
9+
; CHECK-NEXT: [[HOISTME2:%.*]] = add i32 1, [[HOISTME]]
10+
; CHECK-NEXT: br label %[[BODY1:.*]]
11+
; CHECK: [[BODY1]]:
12+
; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], %[[BODY1]] ], [ 0, %[[PRE1]] ]
13+
; CHECK-NEXT: [[I2:%.*]] = phi i32 [ [[I_NEXT2:%.*]], %[[BODY1]] ], [ 0, %[[PRE1]] ]
14+
; CHECK-NEXT: [[I_NEXT]] = add i32 1, [[I]]
15+
; CHECK-NEXT: [[COND:%.*]] = icmp ne i32 [[I]], [[N]]
16+
; CHECK-NEXT: [[I_NEXT2]] = add i32 1, [[I2]]
17+
; CHECK-NEXT: [[COND2:%.*]] = icmp ne i32 [[I2]], [[N]]
18+
; CHECK-NEXT: br i1 [[COND2]], label %[[BODY1]], label %[[EXIT:.*]]
19+
; CHECK: [[EXIT]]:
20+
; CHECK-NEXT: ret void
21+
;
922
pre1:
1023
br label %body1
1124

12-
; CHECK: body1:
13-
; CHECK-NOT: %hoistme
1425
body1: ; preds = %pre1, %body1
1526
%i = phi i32 [%i_next, %body1], [0, %pre1]
1627
%i_next = add i32 1, %i

llvm/test/Transforms/LoopFusion/inner_loops.ll

Lines changed: 56 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,66 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
12
; RUN: opt -S -passes=loop-fusion < %s 2>&1 | FileCheck %s
23

34
@A = common global [1024 x [1024 x i32]] zeroinitializer, align 16
45
@B = common global [1024 x [1024 x i32]] zeroinitializer, align 16
56

6-
; CHECK: void @dep_free
7-
; CHECK-NEXT: bb:
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]]
21-
; CHECK: ret void
227

238
define void @dep_free() {
9+
; CHECK-LABEL: define void @dep_free() {
10+
; CHECK-NEXT: [[BB:.*]]:
11+
; CHECK-NEXT: br label %[[BB9:.*]]
12+
; CHECK: [[BB9]]:
13+
; CHECK-NEXT: [[INDVARS_IV6:%.*]] = phi i64 [ [[INDVARS_IV_NEXT7:%.*]], %[[BB35:.*]] ], [ 0, %[[BB]] ]
14+
; CHECK-NEXT: [[DOT0:%.*]] = phi i32 [ 0, %[[BB]] ], [ [[TMP36:%.*]], %[[BB35]] ]
15+
; CHECK-NEXT: [[EXITCOND8:%.*]] = icmp ne i64 [[INDVARS_IV6]], 100
16+
; CHECK-NEXT: br i1 [[EXITCOND8]], label %[[BB11:.*]], label %[[BB10:.*]]
17+
; CHECK: [[BB10]]:
18+
; CHECK-NEXT: br label %[[BB37:.*]]
19+
; CHECK: [[BB11]]:
20+
; CHECK-NEXT: br label %[[BB12:.*]]
21+
; CHECK: [[BB12]]:
22+
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], %[[BB21:.*]] ], [ 0, %[[BB11]] ]
23+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV]], 100
24+
; CHECK-NEXT: br i1 [[EXITCOND]], label %[[BB14:.*]], label %[[BB23_PREHEADER:.*]]
25+
; CHECK: [[BB23_PREHEADER]]:
26+
; CHECK-NEXT: br label %[[BB23:.*]]
27+
; CHECK: [[BB14]]:
28+
; CHECK-NEXT: [[TMP:%.*]] = add nsw i32 [[DOT0]], -3
29+
; CHECK-NEXT: [[TMP15:%.*]] = add nuw nsw i64 [[INDVARS_IV6]], 3
30+
; CHECK-NEXT: [[TMP16:%.*]] = trunc i64 [[TMP15]] to i32
31+
; CHECK-NEXT: [[TMP17:%.*]] = mul nsw i32 [[TMP]], [[TMP16]]
32+
; CHECK-NEXT: [[TMP18:%.*]] = trunc i64 [[INDVARS_IV6]] to i32
33+
; CHECK-NEXT: [[TMP19:%.*]] = srem i32 [[TMP17]], [[TMP18]]
34+
; CHECK-NEXT: [[TMP20:%.*]] = getelementptr inbounds [1024 x [1024 x i32]], ptr @A, i64 0, i64 [[INDVARS_IV6]], i64 [[INDVARS_IV]]
35+
; CHECK-NEXT: store i32 [[TMP19]], ptr [[TMP20]], align 4
36+
; CHECK-NEXT: br label %[[BB21]]
37+
; CHECK: [[BB21]]:
38+
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
39+
; CHECK-NEXT: br label %[[BB12]]
40+
; CHECK: [[BB23]]:
41+
; CHECK-NEXT: [[INDVARS_IV3:%.*]] = phi i64 [ [[INDVARS_IV_NEXT4:%.*]], %[[BB33:.*]] ], [ 0, %[[BB23_PREHEADER]] ]
42+
; CHECK-NEXT: [[EXITCOND5:%.*]] = icmp ne i64 [[INDVARS_IV3]], 100
43+
; CHECK-NEXT: br i1 [[EXITCOND5]], label %[[BB25:.*]], label %[[BB35]]
44+
; CHECK: [[BB25]]:
45+
; CHECK-NEXT: [[TMP26:%.*]] = add nsw i32 [[DOT0]], -3
46+
; CHECK-NEXT: [[TMP27:%.*]] = add nuw nsw i64 [[INDVARS_IV6]], 3
47+
; CHECK-NEXT: [[TMP28:%.*]] = trunc i64 [[TMP27]] to i32
48+
; CHECK-NEXT: [[TMP29:%.*]] = mul nsw i32 [[TMP26]], [[TMP28]]
49+
; CHECK-NEXT: [[TMP30:%.*]] = trunc i64 [[INDVARS_IV6]] to i32
50+
; CHECK-NEXT: [[TMP31:%.*]] = srem i32 [[TMP29]], [[TMP30]]
51+
; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds [1024 x [1024 x i32]], ptr @B, i64 0, i64 [[INDVARS_IV6]], i64 [[INDVARS_IV3]]
52+
; CHECK-NEXT: store i32 [[TMP31]], ptr [[TMP32]], align 4
53+
; CHECK-NEXT: br label %[[BB33]]
54+
; CHECK: [[BB33]]:
55+
; CHECK-NEXT: [[INDVARS_IV_NEXT4]] = add nuw nsw i64 [[INDVARS_IV3]], 1
56+
; CHECK-NEXT: br label %[[BB23]]
57+
; CHECK: [[BB35]]:
58+
; CHECK-NEXT: [[INDVARS_IV_NEXT7]] = add nuw nsw i64 [[INDVARS_IV6]], 1
59+
; CHECK-NEXT: [[TMP36]] = add nuw nsw i32 [[DOT0]], 1
60+
; CHECK-NEXT: br label %[[BB9]]
61+
; CHECK: [[BB37]]:
62+
; CHECK-NEXT: ret void
63+
;
2464
bb:
2565
br label %bb9
2666

0 commit comments

Comments
 (0)