@@ -213,3 +213,125 @@ define i5 @urem_common_dividend_defined_cond(i1 noundef %b, i5 %x, i5 %y, i5 %z)
213
213
%sel = select i1 %b , i5 %r2 , i5 %r1
214
214
ret i5 %sel
215
215
}
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