if (min(x * c1, c2).Match(ret)) {
int64_t c1val = c1.Eval()->value;
int64_t c2val = c2.Eval()->value;
+ if (c1val == 0) {
+ return c2val < 0 ? c2.Eval() : c1.Eval();
+ }
if (c2val % c1val == 0) {
- if (c2val / c1val >= 0) {
+ if (c1val > 0) {
return (min(x, c2val / c1val) * c1val).Eval();
} else {
return (max(x, c2val / c1val) * c1val).Eval();
if (max(x * c1, c2).Match(ret)) {
int64_t c1val = c1.Eval()->value;
int64_t c2val = c2.Eval()->value;
+ if (c1val == 0) {
+ return c2val > 0 ? c2.Eval() : c1.Eval();
+ }
if (c2val % c1val == 0) {
- if (c2val / c1val >= 0) {
+ if (c1val > 0) {
return (max(x, c2val / c1val) * c1val).Eval();
} else {
return (min(x, c2val / c1val) * c1val).Eval();
ck.verify(tvm.te.min(tvm.te.min(x, 11), 10), tvm.te.min(x, 10))
ck.verify(tvm.te.min(x * 3, 9), tvm.te.min(x, 3) * 3)
+ ck.verify(tvm.te.min(x * 2, 0), tvm.te.min(x, 0) * 2)
+ ck.verify(tvm.te.min(0 - x * 2, 0), tvm.te.max(x, 0) * -2)
ck.verify(tvm.te.min(3 - x, 2), 3 - tvm.te.max(x, 1))
+ ck.verify(tvm.te.min(x * (-2), -4), tvm.te.max(x, 2) * -2)
+ ck.verify(tvm.te.min(x * (-2), 4), tvm.te.max(x, -2) * -2)
+ ck.verify(tvm.te.min(x * (0), 4), 0)
+ ck.verify(tvm.te.min(x * (0), -4), -4)
# DivMod rules
# truc div
ck.verify(tvm.te.max(x * 3, 9), tvm.te.max(x, 3) * 3)
ck.verify(tvm.te.max(3 - x, 1), 3 - tvm.te.min(x, 2))
+ ck.verify(tvm.te.max(x * 2, 0), tvm.te.max(x, 0) * 2)
+ ck.verify(tvm.te.max(0 - x * 2, 0), tvm.te.min(x, 0) * -2)
+ ck.verify(tvm.te.max(x * (-2), -4), tvm.te.min(x, 2) * -2)
+ ck.verify(tvm.te.max(x * (-2), 4), tvm.te.min(x, -2) * -2)
+ ck.verify(tvm.te.max(x * (0), 4), 4)
+ ck.verify(tvm.te.max(x * (0), -4), 0)
# DivMod rules
# truc div