authorgravatar for alichraghi@proton.meAli Chraghi <alichraghi@proton.me> 2023-10-17 02:18:13+03:30
committergravatar for alichraghi@proton.meAli Chraghi <alichraghi@proton.me> 2023-10-17 13:00:36+03:30
log2d762a76a4e2d3d9e96e038406de31fa44661ad1
treedf094b7dcee97b307d98734532663e50c6f23c54
parent7b9165b37576ed4c4962c0ad2afb62921524aa08

sema: emit logical and/or for safety checks

this has no performance impact as there is no branching either way

1 files changed, 6 insertions(+), 6 deletions(-)

src/Sema.zig+6-6
...@@ -8441,7 +8441,7 @@ fn zirErrorFromInt(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstD...@@ -8441,7 +8441,7 @@ fn zirErrorFromInt(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstD
8441 const is_lt_len = try block.addUnOp(.cmp_lt_errors_len, operand);8441 const is_lt_len = try block.addUnOp(.cmp_lt_errors_len, operand);
8442 const zero_val = Air.internedToRef((try mod.intValue(Type.err_int, 0)).toIntern());8442 const zero_val = Air.internedToRef((try mod.intValue(Type.err_int, 0)).toIntern());
8443 const is_non_zero = try block.addBinOp(.cmp_neq, operand, zero_val);8443 const is_non_zero = try block.addBinOp(.cmp_neq, operand, zero_val);
8444 const ok = try block.addBinOp(.bit_and, is_lt_len, is_non_zero);8444 const ok = try block.addBinOp(.bool_and, is_lt_len, is_non_zero);
8445 try sema.addSafetyCheck(block, src, ok, .invalid_error_code);8445 try sema.addSafetyCheck(block, src, ok, .invalid_error_code);
8446 }8446 }
8447 return block.addInst(.{8447 return block.addInst(.{
...@@ -21903,7 +21903,7 @@ fn zirErrorCast(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData...@@ -21903,7 +21903,7 @@ fn zirErrorCast(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData
21903 } else {21903 } else {
21904 // Error must be in destination set or zero.21904 // Error must be in destination set or zero.
21905 const has_value = try block.addTyOp(.error_set_has_value, dest_ty, err_code);21905 const has_value = try block.addTyOp(.error_set_has_value, dest_ty, err_code);
21906 const ok = try block.addBinOp(.bit_or, has_value, is_zero);21906 const ok = try block.addBinOp(.bool_or, has_value, is_zero);
21907 try sema.addSafetyCheck(block, src, ok, .invalid_error_code);21907 try sema.addSafetyCheck(block, src, ok, .invalid_error_code);
21908 }21908 }
21909 } else {21909 } else {
...@@ -22268,7 +22268,7 @@ fn ptrCastFull(...@@ -22268,7 +22268,7 @@ fn ptrCastFull(
22268 const ok = if (src_info.flags.size == .Slice and dest_info.flags.size == .Slice) ok: {22268 const ok = if (src_info.flags.size == .Slice and dest_info.flags.size == .Slice) ok: {
22269 const len = try sema.analyzeSliceLen(block, operand_src, ptr);22269 const len = try sema.analyzeSliceLen(block, operand_src, ptr);
22270 const len_zero = try block.addBinOp(.cmp_eq, len, .zero_usize);22270 const len_zero = try block.addBinOp(.cmp_eq, len, .zero_usize);
22271 break :ok try block.addBinOp(.bit_or, len_zero, is_non_zero);22271 break :ok try block.addBinOp(.bool_or, len_zero, is_non_zero);
22272 } else is_non_zero;22272 } else is_non_zero;
22273 try sema.addSafetyCheck(block, src, ok, .cast_to_null);22273 try sema.addSafetyCheck(block, src, ok, .cast_to_null);
22274 }22274 }
...@@ -22285,7 +22285,7 @@ fn ptrCastFull(...@@ -22285,7 +22285,7 @@ fn ptrCastFull(
22285 const ok = if (src_info.flags.size == .Slice and dest_info.flags.size == .Slice) ok: {22285 const ok = if (src_info.flags.size == .Slice and dest_info.flags.size == .Slice) ok: {
22286 const len = try sema.analyzeSliceLen(block, operand_src, ptr);22286 const len = try sema.analyzeSliceLen(block, operand_src, ptr);
22287 const len_zero = try block.addBinOp(.cmp_eq, len, .zero_usize);22287 const len_zero = try block.addBinOp(.cmp_eq, len, .zero_usize);
22288 break :ok try block.addBinOp(.bit_or, len_zero, is_aligned);22288 break :ok try block.addBinOp(.bool_or, len_zero, is_aligned);
22289 } else is_aligned;22289 } else is_aligned;
22290 try sema.addSafetyCheck(block, src, ok, .incorrect_alignment);22290 try sema.addSafetyCheck(block, src, ok, .incorrect_alignment);
22291 }22291 }
...@@ -24633,7 +24633,7 @@ fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void...@@ -24633,7 +24633,7 @@ fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void
24633 const dest_plus_len = try sema.analyzePtrArithmetic(block, src, raw_dest_ptr, len, .ptr_add, dest_src, src);24633 const dest_plus_len = try sema.analyzePtrArithmetic(block, src, raw_dest_ptr, len, .ptr_add, dest_src, src);
24634 const ok1 = try block.addBinOp(.cmp_gte, raw_dest_ptr, src_plus_len);24634 const ok1 = try block.addBinOp(.cmp_gte, raw_dest_ptr, src_plus_len);
24635 const ok2 = try block.addBinOp(.cmp_gte, new_src_ptr, dest_plus_len);24635 const ok2 = try block.addBinOp(.cmp_gte, new_src_ptr, dest_plus_len);
24636 const ok = try block.addBinOp(.bit_or, ok1, ok2);24636 const ok = try block.addBinOp(.bool_or, ok1, ok2);
24637 try sema.addSafetyCheck(block, src, ok, .memcpy_alias);24637 try sema.addSafetyCheck(block, src, ok, .memcpy_alias);
24638 }24638 }
2463924639
...@@ -30985,7 +30985,7 @@ fn coerceCompatiblePtrs(...@@ -30985,7 +30985,7 @@ fn coerceCompatiblePtrs(
30985 const ok = if (inst_ty.isSlice(mod)) ok: {30985 const ok = if (inst_ty.isSlice(mod)) ok: {
30986 const len = try sema.analyzeSliceLen(block, inst_src, inst);30986 const len = try sema.analyzeSliceLen(block, inst_src, inst);
30987 const len_zero = try block.addBinOp(.cmp_eq, len, .zero_usize);30987 const len_zero = try block.addBinOp(.cmp_eq, len, .zero_usize);
30988 break :ok try block.addBinOp(.bit_or, len_zero, is_non_zero);30988 break :ok try block.addBinOp(.bool_or, len_zero, is_non_zero);
30989 } else is_non_zero;30989 } else is_non_zero;
30990 try sema.addSafetyCheck(block, inst_src, ok, .cast_to_null);30990 try sema.addSafetyCheck(block, inst_src, ok, .cast_to_null);
30991 }30991 }