aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_expr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/llvm_backend_expr.cpp')
-rw-r--r--src/llvm_backend_expr.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp
index b20aef742..b44d2215e 100644
--- a/src/llvm_backend_expr.cpp
+++ b/src/llvm_backend_expr.cpp
@@ -302,6 +302,9 @@ gb_internal IntegerDivisionByZeroKind lb_check_for_integer_division_by_zero_beha
if (flags & OptInFeatureFlag_IntegerDivisionByZero_Zero) {
return IntegerDivisionByZero_Zero;
}
+ if (flags & OptInFeatureFlag_IntegerDivisionByZero_Self) {
+ return IntegerDivisionByZero_Self;
+ }
}
return build_context.integer_division_by_zero_behaviour;
}
@@ -1159,7 +1162,6 @@ gb_internal LLVMValueRef lb_integer_division(lbProcedure *p, LLVMValueRef lhs, L
lb_start_block(p, edge_case_block);
- incoming_values[1] = zero;
switch (lb_check_for_integer_division_by_zero_behaviour(p)) {
case IntegerDivisionByZero_Trap:
@@ -1167,7 +1169,10 @@ gb_internal LLVMValueRef lb_integer_division(lbProcedure *p, LLVMValueRef lhs, L
LLVMBuildUnreachable(p->builder);
break;
case IntegerDivisionByZero_Zero:
- // Already fine
+ incoming_values[1] = zero;
+ break;
+ case IntegerDivisionByZero_Self:
+ incoming_values[1] = lhs;
break;
}
@@ -1178,6 +1183,7 @@ gb_internal LLVMValueRef lb_integer_division(lbProcedure *p, LLVMValueRef lhs, L
switch (lb_check_for_integer_division_by_zero_behaviour(p)) {
case IntegerDivisionByZero_Trap:
+ case IntegerDivisionByZero_Self:
res = incoming_values[0];
break;
case IntegerDivisionByZero_Zero:
@@ -1242,7 +1248,6 @@ gb_internal LLVMValueRef lb_integer_modulo(lbProcedure *p, LLVMValueRef lhs, LLV
IFF a/0 == 0, then (a%0 == a) or (a%%0 == a)
*/
- incoming_values[1] = lhs;
switch (lb_check_for_integer_division_by_zero_behaviour(p)) {
case IntegerDivisionByZero_Trap:
@@ -1250,7 +1255,10 @@ gb_internal LLVMValueRef lb_integer_modulo(lbProcedure *p, LLVMValueRef lhs, LLV
LLVMBuildUnreachable(p->builder);
break;
case IntegerDivisionByZero_Zero:
- // Already fine
+ incoming_values[1] = lhs;
+ break;
+ case IntegerDivisionByZero_Self:
+ incoming_values[1] = zero;
break;
}
@@ -1261,6 +1269,7 @@ gb_internal LLVMValueRef lb_integer_modulo(lbProcedure *p, LLVMValueRef lhs, LLV
switch (lb_check_for_integer_division_by_zero_behaviour(p)) {
case IntegerDivisionByZero_Trap:
+ case IntegerDivisionByZero_Self:
res = incoming_values[0];
break;
case IntegerDivisionByZero_Zero: