Skip to content

Commit a10fd16

Browse files
committed
[CVP] Add test coverage for an upcoming generalization of expandUDivOrURem
1 parent 308a236 commit a10fd16

File tree

2 files changed

+161
-0
lines changed

2 files changed

+161
-0
lines changed

llvm/test/Transforms/CorrelatedValuePropagation/udiv-expansion.ll

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,74 @@ define i8 @constant.divisor.v7(i8 %x) {
9090
ret i8 %div
9191
}
9292

93+
define i8 @constant.divisor.v6to8(i8 %x) {
94+
; CHECK-LABEL: @constant.divisor.v6to8(
95+
; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 6
96+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
97+
; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 9
98+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
99+
; CHECK-NEXT: [[DIV:%.*]] = udiv i8 [[X]], 3
100+
; CHECK-NEXT: ret i8 2
101+
;
102+
%cmp.x.lower = icmp uge i8 %x, 6
103+
call void @llvm.assume(i1 %cmp.x.lower)
104+
%cmp.x.upper = icmp ult i8 %x, 9
105+
call void @llvm.assume(i1 %cmp.x.upper)
106+
%div = udiv i8 %x, 3
107+
ret i8 %div
108+
}
109+
110+
define i8 @constant.divisor.v9to11(i8 %x) {
111+
; CHECK-LABEL: @constant.divisor.v9to11(
112+
; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 9
113+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
114+
; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 12
115+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
116+
; CHECK-NEXT: [[DIV:%.*]] = udiv i8 [[X]], 3
117+
; CHECK-NEXT: ret i8 3
118+
;
119+
%cmp.x.lower = icmp uge i8 %x, 9
120+
call void @llvm.assume(i1 %cmp.x.lower)
121+
%cmp.x.upper = icmp ult i8 %x, 12
122+
call void @llvm.assume(i1 %cmp.x.upper)
123+
%div = udiv i8 %x, 3
124+
ret i8 %div
125+
}
126+
127+
define i8 @constant.divisor.v12to14(i8 %x) {
128+
; CHECK-LABEL: @constant.divisor.v12to14(
129+
; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 12
130+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
131+
; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 15
132+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
133+
; CHECK-NEXT: [[DIV:%.*]] = udiv i8 [[X]], 3
134+
; CHECK-NEXT: ret i8 4
135+
;
136+
%cmp.x.lower = icmp uge i8 %x, 12
137+
call void @llvm.assume(i1 %cmp.x.lower)
138+
%cmp.x.upper = icmp ult i8 %x, 15
139+
call void @llvm.assume(i1 %cmp.x.upper)
140+
%div = udiv i8 %x, 3
141+
ret i8 %div
142+
}
143+
144+
define i8 @constant.divisor.v6to11(i8 %x) {
145+
; CHECK-LABEL: @constant.divisor.v6to11(
146+
; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 6
147+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
148+
; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 12
149+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
150+
; CHECK-NEXT: [[DIV:%.*]] = udiv i8 [[X]], 3
151+
; CHECK-NEXT: ret i8 [[DIV]]
152+
;
153+
%cmp.x.lower = icmp uge i8 %x, 6
154+
call void @llvm.assume(i1 %cmp.x.lower)
155+
%cmp.x.upper = icmp ult i8 %x, 12
156+
call void @llvm.assume(i1 %cmp.x.upper)
157+
%div = udiv i8 %x, 3
158+
ret i8 %div
159+
}
160+
93161
; Both are variable. Bounds are known
94162

95163
define i8 @variable.v3(i8 %x, i8 %y) {

llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,74 @@ define i8 @constant.divisor.v7(i8 %x) {
100100
ret i8 %rem
101101
}
102102

103+
define i8 @constant.divisor.v6to8(i8 %x) {
104+
; CHECK-LABEL: @constant.divisor.v6to8(
105+
; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 6
106+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
107+
; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 9
108+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
109+
; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], 3
110+
; CHECK-NEXT: ret i8 [[REM]]
111+
;
112+
%cmp.x.lower = icmp uge i8 %x, 6
113+
call void @llvm.assume(i1 %cmp.x.lower)
114+
%cmp.x.upper = icmp ult i8 %x, 9
115+
call void @llvm.assume(i1 %cmp.x.upper)
116+
%rem = urem i8 %x, 3
117+
ret i8 %rem
118+
}
119+
120+
define i8 @constant.divisor.v9to11(i8 %x) {
121+
; CHECK-LABEL: @constant.divisor.v9to11(
122+
; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 9
123+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
124+
; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 12
125+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
126+
; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], 3
127+
; CHECK-NEXT: ret i8 [[REM]]
128+
;
129+
%cmp.x.lower = icmp uge i8 %x, 9
130+
call void @llvm.assume(i1 %cmp.x.lower)
131+
%cmp.x.upper = icmp ult i8 %x, 12
132+
call void @llvm.assume(i1 %cmp.x.upper)
133+
%rem = urem i8 %x, 3
134+
ret i8 %rem
135+
}
136+
137+
define i8 @constant.divisor.v12to14(i8 %x) {
138+
; CHECK-LABEL: @constant.divisor.v12to14(
139+
; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 12
140+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
141+
; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 15
142+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
143+
; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], 3
144+
; CHECK-NEXT: ret i8 [[REM]]
145+
;
146+
%cmp.x.lower = icmp uge i8 %x, 12
147+
call void @llvm.assume(i1 %cmp.x.lower)
148+
%cmp.x.upper = icmp ult i8 %x, 15
149+
call void @llvm.assume(i1 %cmp.x.upper)
150+
%rem = urem i8 %x, 3
151+
ret i8 %rem
152+
}
153+
154+
define i8 @constant.divisor.v6to11(i8 %x) {
155+
; CHECK-LABEL: @constant.divisor.v6to11(
156+
; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 6
157+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
158+
; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 12
159+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
160+
; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], 3
161+
; CHECK-NEXT: ret i8 [[REM]]
162+
;
163+
%cmp.x.lower = icmp uge i8 %x, 6
164+
call void @llvm.assume(i1 %cmp.x.lower)
165+
%cmp.x.upper = icmp ult i8 %x, 12
166+
call void @llvm.assume(i1 %cmp.x.upper)
167+
%rem = urem i8 %x, 3
168+
ret i8 %rem
169+
}
170+
103171
; Both are variable. Bounds are known
104172

105173
define i8 @variable.v3(i8 %x, i8 %y) {
@@ -226,6 +294,31 @@ define i8 @variable.v7(i8 %x, i8 %y) {
226294
ret i8 %rem
227295
}
228296

297+
define i8 @variable.v6to8.v3to4(i8 %x, i8 %y) {
298+
; CHECK-LABEL: @variable.v6to8.v3to4(
299+
; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 6
300+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
301+
; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 8
302+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
303+
; CHECK-NEXT: [[CMP_Y_LOWER:%.*]] = icmp uge i8 [[Y:%.*]], 3
304+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_Y_LOWER]])
305+
; CHECK-NEXT: [[CMP_Y_UPPER:%.*]] = icmp ule i8 [[Y]], 4
306+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_Y_UPPER]])
307+
; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], [[Y]]
308+
; CHECK-NEXT: ret i8 [[REM]]
309+
;
310+
%cmp.x.lower = icmp uge i8 %x, 6
311+
call void @llvm.assume(i1 %cmp.x.lower)
312+
%cmp.x.upper = icmp ult i8 %x, 8
313+
call void @llvm.assume(i1 %cmp.x.upper)
314+
%cmp.y.lower = icmp uge i8 %y, 3
315+
call void @llvm.assume(i1 %cmp.y.lower)
316+
%cmp.y.upper = icmp ule i8 %y, 4
317+
call void @llvm.assume(i1 %cmp.y.upper)
318+
%rem = urem i8 %x, %y
319+
ret i8 %rem
320+
}
321+
229322
; Constant divisor
230323

231324
define i8 @large.divisor.v0(i8 %x) {

0 commit comments

Comments
 (0)