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
84418441 const is_lt_len = try block.addUnOp(.cmp_lt_errors_len, operand);
84428442 const zero_val = Air.internedToRef((try mod.intValue(Type.err_int, 0)).toIntern());
84438443 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);
84458445 try sema.addSafetyCheck(block, src, ok, .invalid_error_code);
84468446 }
84478447 return block.addInst(.{
......@@ -21903,7 +21903,7 @@ fn zirErrorCast(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData
2190321903 } else {
2190421904 // Error must be in destination set or zero.
2190521905 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);
2190721907 try sema.addSafetyCheck(block, src, ok, .invalid_error_code);
2190821908 }
2190921909 } else {
......@@ -22268,7 +22268,7 @@ fn ptrCastFull(
2226822268 const ok = if (src_info.flags.size == .Slice and dest_info.flags.size == .Slice) ok: {
2226922269 const len = try sema.analyzeSliceLen(block, operand_src, ptr);
2227022270 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);
2227222272 } else is_non_zero;
2227322273 try sema.addSafetyCheck(block, src, ok, .cast_to_null);
2227422274 }
......@@ -22285,7 +22285,7 @@ fn ptrCastFull(
2228522285 const ok = if (src_info.flags.size == .Slice and dest_info.flags.size == .Slice) ok: {
2228622286 const len = try sema.analyzeSliceLen(block, operand_src, ptr);
2228722287 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);
2228922289 } else is_aligned;
2229022290 try sema.addSafetyCheck(block, src, ok, .incorrect_alignment);
2229122291 }
......@@ -24633,7 +24633,7 @@ fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void
2463324633 const dest_plus_len = try sema.analyzePtrArithmetic(block, src, raw_dest_ptr, len, .ptr_add, dest_src, src);
2463424634 const ok1 = try block.addBinOp(.cmp_gte, raw_dest_ptr, src_plus_len);
2463524635 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);
2463724637 try sema.addSafetyCheck(block, src, ok, .memcpy_alias);
2463824638 }
2463924639
......@@ -30985,7 +30985,7 @@ fn coerceCompatiblePtrs(
3098530985 const ok = if (inst_ty.isSlice(mod)) ok: {
3098630986 const len = try sema.analyzeSliceLen(block, inst_src, inst);
3098730987 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);
3098930989 } else is_non_zero;
3099030990 try sema.addSafetyCheck(block, inst_src, ok, .cast_to_null);
3099130991 }