mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Remove division-by-zero checks for floating point in safe mode #2556.
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
|
||||
### Fixes
|
||||
- `Foo.is_eq` would return false if the type was a `typedef` and had an overload, but the underlying type was not comparable.
|
||||
- Remove division-by-zero checks for floating point in safe mode #2556.
|
||||
|
||||
### Stdlib changes
|
||||
|
||||
|
||||
@@ -4238,23 +4238,23 @@ void llvm_emit_binary(GenContext *c, BEValue *be_value, Expr *expr, BEValue *lhs
|
||||
val = llvm_emit_add_int(c, lhs_type, lhs_value, rhs_value, expr->span);
|
||||
break;
|
||||
case BINARYOP_DIV:
|
||||
llvm_emit_trap_zero(c, rhs_type, rhs_value, "Division by zero.", expr->span);
|
||||
if (is_float)
|
||||
{
|
||||
val = LLVMBuildFDiv(c->builder, lhs_value, rhs_value, "fdiv");
|
||||
break;
|
||||
}
|
||||
llvm_emit_trap_zero(c, rhs_type, rhs_value, "Division by zero.", expr->span);
|
||||
val = type_is_unsigned(lhs_type)
|
||||
? LLVMBuildUDiv(c->builder, lhs_value, rhs_value, "udiv")
|
||||
: LLVMBuildSDiv(c->builder, lhs_value, rhs_value, "sdiv");
|
||||
break;
|
||||
case BINARYOP_MOD:
|
||||
llvm_emit_trap_zero(c, rhs_type, rhs_value, "% by zero.", expr->span);
|
||||
if (type_is_float(lhs_type))
|
||||
{
|
||||
val = LLVMBuildFRem(c->builder, lhs_value, rhs_value, "fmod");
|
||||
break;
|
||||
}
|
||||
llvm_emit_trap_zero(c, rhs_type, rhs_value, "% by zero.", expr->span);
|
||||
val = type_is_unsigned(lhs_type)
|
||||
? LLVMBuildURem(c->builder, lhs_value, rhs_value, "umod")
|
||||
: LLVMBuildSRem(c->builder, lhs_value, rhs_value, "smod");
|
||||
|
||||
27
test/test_suite/floats/div_by_zero.c3t
Normal file
27
test/test_suite/floats/div_by_zero.c3t
Normal file
@@ -0,0 +1,27 @@
|
||||
// #target: macos-x64
|
||||
// #safe: yes
|
||||
module test;
|
||||
|
||||
fn void test()
|
||||
{
|
||||
float x, y;
|
||||
x = x / y;
|
||||
x = x % y;
|
||||
}
|
||||
|
||||
/* #expect: test.ll
|
||||
|
||||
entry:
|
||||
%x = alloca float, align 4
|
||||
%y = alloca float, align 4
|
||||
store float 0.000000e+00, ptr %x, align 4
|
||||
store float 0.000000e+00, ptr %y, align 4
|
||||
%0 = load float, ptr %x, align 4
|
||||
%1 = load float, ptr %y, align 4
|
||||
%fdiv = fdiv float %0, %1
|
||||
store float %fdiv, ptr %x, align 4
|
||||
%2 = load float, ptr %x, align 4
|
||||
%3 = load float, ptr %y, align 4
|
||||
%fmod = frem float %2, %3
|
||||
store float %fmod, ptr %x, align 4
|
||||
ret void
|
||||
Reference in New Issue
Block a user