diff options
| author | 2026-03-14 17:39:29 +0100 | |
|---|---|---|
| committer | 2026-03-14 17:46:57 +0100 | |
| commit | de8673af7c0885201f284ffd8851ece2cde8cb18 (patch) | |
| tree | 162475f18ce772b3038250f6422b7626a1d75815 /ir/fold.c | |
| parent | 1400850e7f579d2c0aa2bf2dddffc4e05d87a804 (diff) | |
eval & fold: handle division overflow for MIN/-1
Diffstat (limited to 'ir/fold.c')
| -rw-r--r-- | ir/fold.c | 8 |
1 files changed, 6 insertions, 2 deletions
@@ -41,9 +41,13 @@ foldint(enum op op, enum irclass k, union ref lr, union ref rr) case Oadd: x = l.u + r.u; break; case Osub: x = l.u - r.u; break; case Omul: x = l.u * r.u; break; - case Odiv: x = w ? l.s / r.s : (int)l.s / (int)r.s; break; + case Odiv: if (r.s == -1 && (w ? l.s == LLONG_MIN : (int)l.s == INT_MIN)) x = l.s; + else x = w ? l.s / r.s : (int)l.s / (int)r.s; + break; case Oudiv: x = w ? l.u / r.u : (uint)l.u / (uint)r.u; break; - case Orem: x = w ? l.s % r.s : (int)l.s % (int)r.s; break; + case Orem: if (r.s == -1 && (w ? l.s == LLONG_MIN : (int)l.s == INT_MIN)) x = 0; + else x = w ? l.s % r.s : (int)l.s % (int)r.s; + break; case Ourem: x = w ? l.u % r.u : (uint)l.u % (uint)r.u; break; case Oand: x = l.u & r.u; break; case Oior: x = l.u | r.u; break; |