Skip to content

Commit f5cb626

Browse files
[InstCombine] Introduce tests for D156811
Introduce test cases for folding `select` of `srem` and conditional add. Differential Revision: https://reviews.llvm.org/D156862
1 parent c9fe119 commit f5cb626

File tree

1 file changed

+122
-0
lines changed

1 file changed

+122
-0
lines changed

llvm/test/Transforms/InstCombine/select-divrem.ll

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,3 +213,125 @@ define i5 @urem_common_dividend_defined_cond(i1 noundef %b, i5 %x, i5 %y, i5 %z)
213213
%sel = select i1 %b, i5 %r2, i5 %r1
214214
ret i5 %sel
215215
}
216+
217+
define i32 @rem_euclid_1(i32 %0) {
218+
; CHECK-LABEL: @rem_euclid_1(
219+
; CHECK-NEXT: [[REM:%.*]] = srem i32 [[TMP0:%.*]], 8
220+
; CHECK-NEXT: [[COND:%.*]] = icmp slt i32 [[REM]], 0
221+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[REM]], 8
222+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i32 [[ADD]], i32 [[REM]]
223+
; CHECK-NEXT: ret i32 [[SEL]]
224+
;
225+
%rem = srem i32 %0, 8
226+
%cond = icmp slt i32 %rem, 0
227+
%add = add i32 %rem, 8
228+
%sel = select i1 %cond, i32 %add, i32 %rem
229+
ret i32 %sel
230+
}
231+
232+
define i32 @rem_euclid_2(i32 %0) {
233+
; CHECK-LABEL: @rem_euclid_2(
234+
; CHECK-NEXT: [[REM:%.*]] = srem i32 [[TMP0:%.*]], 8
235+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[REM]], 8
236+
; CHECK-NEXT: [[COND1:%.*]] = icmp slt i32 [[REM]], 0
237+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND1]], i32 [[ADD]], i32 [[REM]]
238+
; CHECK-NEXT: ret i32 [[SEL]]
239+
;
240+
%rem = srem i32 %0, 8
241+
%cond = icmp sgt i32 %rem, -1
242+
%add = add i32 %rem, 8
243+
%sel = select i1 %cond, i32 %rem, i32 %add
244+
ret i32 %sel
245+
}
246+
247+
define i32 @rem_euclid_wrong_sign_test(i32 %0) {
248+
; CHECK-LABEL: @rem_euclid_wrong_sign_test(
249+
; CHECK-NEXT: [[REM:%.*]] = srem i32 [[TMP0:%.*]], 8
250+
; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[REM]], 0
251+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[REM]], 8
252+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i32 [[ADD]], i32 [[REM]]
253+
; CHECK-NEXT: ret i32 [[SEL]]
254+
;
255+
%rem = srem i32 %0, 8
256+
%cond = icmp sgt i32 %rem, 0
257+
%add = add i32 %rem, 8
258+
%sel = select i1 %cond, i32 %add, i32 %rem
259+
ret i32 %sel
260+
}
261+
262+
define i32 @rem_euclid_add_different_const(i32 %0) {
263+
; CHECK-LABEL: @rem_euclid_add_different_const(
264+
; CHECK-NEXT: [[REM:%.*]] = srem i32 [[TMP0:%.*]], 8
265+
; CHECK-NEXT: [[COND:%.*]] = icmp slt i32 [[REM]], 0
266+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[REM]], 9
267+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i32 [[ADD]], i32 [[REM]]
268+
; CHECK-NEXT: ret i32 [[SEL]]
269+
;
270+
%rem = srem i32 %0, 8
271+
%cond = icmp slt i32 %rem, 0
272+
%add = add i32 %rem, 9
273+
%sel = select i1 %cond, i32 %add, i32 %rem
274+
ret i32 %sel
275+
}
276+
277+
define i32 @rem_euclid_wrong_operands_select(i32 %0) {
278+
; CHECK-LABEL: @rem_euclid_wrong_operands_select(
279+
; CHECK-NEXT: [[REM:%.*]] = srem i32 [[TMP0:%.*]], 8
280+
; CHECK-NEXT: [[COND:%.*]] = icmp slt i32 [[REM]], 0
281+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[REM]], 8
282+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i32 [[REM]], i32 [[ADD]]
283+
; CHECK-NEXT: ret i32 [[SEL]]
284+
;
285+
%rem = srem i32 %0, 8
286+
%cond = icmp slt i32 %rem, 0
287+
%add = add i32 %rem, 8
288+
%sel = select i1 %cond, i32 %rem, i32 %add
289+
ret i32 %sel
290+
}
291+
292+
define <2 x i32> @rem_euclid_vec(<2 x i32> %0) {
293+
; CHECK-LABEL: @rem_euclid_vec(
294+
; CHECK-NEXT: [[REM:%.*]] = srem <2 x i32> [[TMP0:%.*]], <i32 8, i32 8>
295+
; CHECK-NEXT: [[COND:%.*]] = icmp slt <2 x i32> [[REM]], zeroinitializer
296+
; CHECK-NEXT: [[ADD:%.*]] = add nsw <2 x i32> [[REM]], <i32 8, i32 8>
297+
; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[COND]], <2 x i32> [[ADD]], <2 x i32> [[REM]]
298+
; CHECK-NEXT: ret <2 x i32> [[SEL]]
299+
;
300+
%rem = srem <2 x i32> %0, <i32 8, i32 8>
301+
%cond = icmp slt <2 x i32> %rem, <i32 0, i32 0>
302+
%add = add <2 x i32> %rem, <i32 8, i32 8>
303+
%sel = select <2 x i1> %cond, <2 x i32> %add, <2 x i32> %rem
304+
ret <2 x i32> %sel
305+
}
306+
307+
define i128 @rem_euclid_i128(i128 %0) {
308+
; CHECK-LABEL: @rem_euclid_i128(
309+
; CHECK-NEXT: [[REM:%.*]] = srem i128 [[TMP0:%.*]], 8
310+
; CHECK-NEXT: [[COND:%.*]] = icmp slt i128 [[REM]], 0
311+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i128 [[REM]], 8
312+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i128 [[ADD]], i128 [[REM]]
313+
; CHECK-NEXT: ret i128 [[SEL]]
314+
;
315+
%rem = srem i128 %0, 8
316+
%cond = icmp slt i128 %rem, 0
317+
%add = add i128 %rem, 8
318+
%sel = select i1 %cond, i128 %add, i128 %rem
319+
ret i128 %sel
320+
}
321+
322+
define i8 @rem_euclid_non_const_pow2(i8 %0, i8 %1) {
323+
; CHECK-LABEL: @rem_euclid_non_const_pow2(
324+
; CHECK-NEXT: [[POW2:%.*]] = shl nuw i8 1, [[TMP0:%.*]]
325+
; CHECK-NEXT: [[REM:%.*]] = srem i8 [[TMP1:%.*]], [[POW2]]
326+
; CHECK-NEXT: [[COND:%.*]] = icmp slt i8 [[REM]], 0
327+
; CHECK-NEXT: [[ADD:%.*]] = select i1 [[COND]], i8 [[POW2]], i8 0
328+
; CHECK-NEXT: [[SEL:%.*]] = add i8 [[REM]], [[ADD]]
329+
; CHECK-NEXT: ret i8 [[SEL]]
330+
;
331+
%pow2 = shl i8 1, %0
332+
%rem = srem i8 %1, %pow2
333+
%cond = icmp slt i8 %rem, 0
334+
%add = add i8 %rem, %pow2
335+
%sel = select i1 %cond, i8 %add, i8 %rem
336+
ret i8 %sel
337+
}

0 commit comments

Comments
 (0)