Skip to content

Commit 719e7be

Browse files
committed
[LoopPeel] Add tests for last iteration peeling of min/max intrinsics
1 parent b8f79f8 commit 719e7be

File tree

1 file changed

+137
-0
lines changed

1 file changed

+137
-0
lines changed
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -p loop-unroll -unroll-full-max-count=0 -S %s | FileCheck %s
3+
4+
declare void @foo(i32)
5+
6+
define i32 @umin_unit_step() {
7+
; CHECK-LABEL: define i32 @umin_unit_step() {
8+
; CHECK-NEXT: [[ENTRY:.*]]:
9+
; CHECK-NEXT: br label %[[LOOP:.*]]
10+
; CHECK: [[LOOP]]:
11+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
12+
; CHECK-NEXT: [[SUB:%.*]] = sub i32 1024, [[IV]]
13+
; CHECK-NEXT: [[MINMAX:%.*]] = call i32 @llvm.umin.i32(i32 [[SUB]], i32 1)
14+
; CHECK-NEXT: call void @foo(i32 [[MINMAX]])
15+
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
16+
; CHECK-NEXT: [[EC:%.*]] = icmp ne i32 [[IV_NEXT]], 1024
17+
; CHECK-NEXT: br i1 [[EC]], label %[[LOOP]], label %[[EXIT:.*]]
18+
; CHECK: [[EXIT]]:
19+
; CHECK-NEXT: [[MINMAX_LCSSA:%.*]] = phi i32 [ [[MINMAX]], %[[LOOP]] ]
20+
; CHECK-NEXT: ret i32 [[MINMAX_LCSSA]]
21+
;
22+
entry:
23+
br label %loop
24+
25+
loop:
26+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
27+
%sub = sub i32 1024, %iv
28+
%minmax = call i32 @llvm.umin(i32 %sub, i32 1)
29+
call void @foo(i32 %minmax)
30+
%iv.next = add nuw nsw i32 %iv, 1
31+
%ec = icmp ne i32 %iv.next, 1024
32+
br i1 %ec, label %loop, label %exit
33+
34+
exit:
35+
%minmax.lcssa = phi i32 [ %minmax, %loop ]
36+
ret i32 %minmax.lcssa
37+
}
38+
39+
define i32 @smin_unit_step() {
40+
; CHECK-LABEL: define i32 @smin_unit_step() {
41+
; CHECK-NEXT: [[ENTRY:.*]]:
42+
; CHECK-NEXT: br label %[[LOOP:.*]]
43+
; CHECK: [[LOOP]]:
44+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
45+
; CHECK-NEXT: [[SUB:%.*]] = sub i32 1024, [[IV]]
46+
; CHECK-NEXT: [[MINMAX:%.*]] = call i32 @llvm.smin.i32(i32 [[SUB]], i32 1)
47+
; CHECK-NEXT: call void @foo(i32 [[MINMAX]])
48+
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
49+
; CHECK-NEXT: [[EC_PEEL:%.*]] = icmp ne i32 [[IV_NEXT]], 1024
50+
; CHECK-NEXT: br i1 [[EC_PEEL]], label %[[LOOP]], label %[[EXIT:.*]]
51+
; CHECK: [[EXIT]]:
52+
; CHECK-NEXT: [[MINMAX_LCSSA:%.*]] = phi i32 [ [[MINMAX]], %[[LOOP]] ]
53+
; CHECK-NEXT: ret i32 [[MINMAX_LCSSA]]
54+
;
55+
entry:
56+
br label %loop
57+
58+
loop:
59+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
60+
%sub = sub i32 1024, %iv
61+
%minmax = call i32 @llvm.smin(i32 %sub, i32 1)
62+
call void @foo(i32 %minmax)
63+
%iv.next = add nuw nsw i32 %iv, 1
64+
%ec = icmp ne i32 %iv.next, 1024
65+
br i1 %ec, label %loop, label %exit
66+
67+
exit:
68+
%minmax.lcssa = phi i32 [ %minmax, %loop ]
69+
ret i32 %minmax.lcssa
70+
}
71+
72+
define i32 @smax_unit_step() {
73+
; CHECK-LABEL: define i32 @smax_unit_step() {
74+
; CHECK-NEXT: [[ENTRY:.*]]:
75+
; CHECK-NEXT: br label %[[LOOP:.*]]
76+
; CHECK: [[LOOP]]:
77+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
78+
; CHECK-NEXT: [[SUB:%.*]] = sub i32 1024, [[IV]]
79+
; CHECK-NEXT: [[MINMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[SUB]], i32 1)
80+
; CHECK-NEXT: call void @foo(i32 [[MINMAX]])
81+
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
82+
; CHECK-NEXT: [[EC_PEEL:%.*]] = icmp ne i32 [[IV_NEXT]], 1024
83+
; CHECK-NEXT: br i1 [[EC_PEEL]], label %[[LOOP]], label %[[EXIT:.*]]
84+
; CHECK: [[EXIT]]:
85+
; CHECK-NEXT: [[MINMAX_LCSSA:%.*]] = phi i32 [ [[MINMAX]], %[[LOOP]] ]
86+
; CHECK-NEXT: ret i32 [[MINMAX_LCSSA]]
87+
;
88+
entry:
89+
br label %loop
90+
91+
loop:
92+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
93+
%sub = sub i32 1024, %iv
94+
%minmax = call i32 @llvm.smax(i32 %sub, i32 1)
95+
call void @foo(i32 %minmax)
96+
%iv.next = add nuw nsw i32 %iv, 1
97+
%ec = icmp ne i32 %iv.next, 1024
98+
br i1 %ec, label %loop, label %exit
99+
100+
exit:
101+
%minmax.lcssa = phi i32 [ %minmax, %loop ]
102+
ret i32 %minmax.lcssa
103+
}
104+
105+
define i32 @umax_unit_step() {
106+
; CHECK-LABEL: define i32 @umax_unit_step() {
107+
; CHECK-NEXT: [[ENTRY:.*]]:
108+
; CHECK-NEXT: br label %[[LOOP:.*]]
109+
; CHECK: [[LOOP]]:
110+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
111+
; CHECK-NEXT: [[SUB:%.*]] = sub i32 1024, [[IV]]
112+
; CHECK-NEXT: [[MINMAX:%.*]] = call i32 @llvm.umax.i32(i32 [[SUB]], i32 1)
113+
; CHECK-NEXT: call void @foo(i32 [[MINMAX]])
114+
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
115+
; CHECK-NEXT: [[EC:%.*]] = icmp ne i32 [[IV_NEXT]], 1024
116+
; CHECK-NEXT: br i1 [[EC]], label %[[LOOP]], label %[[EXIT:.*]]
117+
; CHECK: [[EXIT]]:
118+
; CHECK-NEXT: [[MINMAX_LCSSA:%.*]] = phi i32 [ [[MINMAX]], %[[LOOP]] ]
119+
; CHECK-NEXT: ret i32 [[MINMAX_LCSSA]]
120+
;
121+
entry:
122+
br label %loop
123+
124+
loop:
125+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
126+
%sub = sub i32 1024, %iv
127+
%minmax = call i32 @llvm.umax(i32 %sub, i32 1)
128+
call void @foo(i32 %minmax)
129+
%iv.next = add nuw nsw i32 %iv, 1
130+
%ec = icmp ne i32 %iv.next, 1024
131+
br i1 %ec, label %loop, label %exit
132+
133+
exit:
134+
%minmax.lcssa = phi i32 [ %minmax, %loop ]
135+
ret i32 %minmax.lcssa
136+
}
137+

0 commit comments

Comments
 (0)