@@ -357,25 +357,30 @@ OpFoldResult arith::CeilDivSIOp::fold(ArrayRef<Attribute> operands) {
357
357
overflowOrDiv0 = true ;
358
358
return a;
359
359
}
360
+ if (!a)
361
+ return a;
362
+ // After this point we know that neither a or b are zero.
360
363
unsigned bits = a.getBitWidth ();
361
364
APInt zero = APInt::getZero (bits);
362
- if (a.sgt (zero) && b.sgt (zero)) {
365
+ bool aGtZero = a.sgt (zero);
366
+ bool bGtZero = b.sgt (zero);
367
+ if (aGtZero && bGtZero) {
363
368
// Both positive, return ceil(a, b).
364
369
return signedCeilNonnegInputs (a, b, overflowOrDiv0);
365
370
}
366
- if (a. slt (zero) && b. slt (zero) ) {
371
+ if (!aGtZero && !bGtZero ) {
367
372
// Both negative, return ceil(-a, -b).
368
373
APInt posA = zero.ssub_ov (a, overflowOrDiv0);
369
374
APInt posB = zero.ssub_ov (b, overflowOrDiv0);
370
375
return signedCeilNonnegInputs (posA, posB, overflowOrDiv0);
371
376
}
372
- if (a. slt (zero) && b. sgt (zero) ) {
377
+ if (!aGtZero && bGtZero ) {
373
378
// A is negative, b is positive, return - ( -a / b).
374
379
APInt posA = zero.ssub_ov (a, overflowOrDiv0);
375
380
APInt div = posA.sdiv_ov (b, overflowOrDiv0);
376
381
return zero.ssub_ov (div, overflowOrDiv0);
377
382
}
378
- // A is positive (or zero) , b is negative, return - (a / -b).
383
+ // A is positive, b is negative, return - (a / -b).
379
384
APInt posB = zero.ssub_ov (b, overflowOrDiv0);
380
385
APInt div = a.sdiv_ov (posB, overflowOrDiv0);
381
386
return zero.ssub_ov (div, overflowOrDiv0);
@@ -407,19 +412,24 @@ OpFoldResult arith::FloorDivSIOp::fold(ArrayRef<Attribute> operands) {
407
412
overflowOrDiv0 = true ;
408
413
return a;
409
414
}
415
+ if (!a)
416
+ return a;
417
+ // After this point we know that neither a or b are zero.
410
418
unsigned bits = a.getBitWidth ();
411
419
APInt zero = APInt::getZero (bits);
412
- if (a.sge (zero) && b.sgt (zero)) {
413
- // Both positive (or a is zero), return a / b.
420
+ bool aGtZero = a.sgt (zero);
421
+ bool bGtZero = b.sgt (zero);
422
+ if (aGtZero && bGtZero) {
423
+ // Both positive, return a / b.
414
424
return a.sdiv_ov (b, overflowOrDiv0);
415
425
}
416
- if (a. sle (zero) && b. slt (zero) ) {
417
- // Both negative (or a is zero) , return -a / -b.
426
+ if (!aGtZero && !bGtZero ) {
427
+ // Both negative, return -a / -b.
418
428
APInt posA = zero.ssub_ov (a, overflowOrDiv0);
419
429
APInt posB = zero.ssub_ov (b, overflowOrDiv0);
420
430
return posA.sdiv_ov (posB, overflowOrDiv0);
421
431
}
422
- if (a. slt (zero) && b. sgt (zero) ) {
432
+ if (!aGtZero && bGtZero ) {
423
433
// A is negative, b is positive, return - ceil(-a, b).
424
434
APInt posA = zero.ssub_ov (a, overflowOrDiv0);
425
435
APInt ceil = signedCeilNonnegInputs (posA, b, overflowOrDiv0);
0 commit comments