test236
auto test236 =
q{--- test236
// Bug #27. be.reg_alloc.move_solver(82): ICE: Assertion failure: Second write to rax detected
// First DCE removes some instructions. This leads to some phi functions not having any users.
// This makes liveness analysis emit empty range for those vregs ([102; 102) and [144; 144) for example).
// Then register allocator allocates two intervals to the same register, because
// overlap of [144; 144) and [144; 148) is not detected and they are both allocated to eax.
// Then move solver sees 2 writes to the same register and reports an error.
f64 to_f64(u8* s) {
f64 a = 0.0;
i32 c;
i32 e = 0;
c = *s++; // This expression will give use the "illegal hardware instruction" issue if I un-comment it
while (c != '\0' && is_digit(c)) {
a = a * 10.0 + (c - '0');
}
if (c == '.') {
c = *s++; // However, the same expression doesn't give the error here
while (c != '\0' && is_digit(c)) {
a = a * 10.0 + (c - '0');
e = e - 1;
c = *s++; // And here too!
}
}
if (c == 'e' || c == 'E') {
i32 sign = 1;
i32 i = 0;
c = *s++;
if (c == '+') c = *s++;
else if (c == '-') {
c = *s++;
sign = -1;
}
while (is_digit(c)) {
i = i * 10 + (c - '0');
c = *s++;
}
e += i*sign;
}
return a;
}
bool is_digit(i32 c) {
return c >= '0' && c <= '9';
}
};
tests passing
functionsvariables