authorgravatar for xavierb@gmail.comXavier Bouchoux <xavierb@gmail.com> 2023-06-24 10:47:20+00:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-06-24 12:57:46-07:00
logf10b9e8fd72aae33b127c18e3f8a64a4f56b1b69
treee677f852c23f7123282d184ddb67181097588619
parenta5e15eced0e9cb00871966ede74eed9b3a07183c

update Liveness to detect that safety checks do not modify memory

followup to [25d3713b07a100d8fdb349317db97fd9d0c1e366] Resolves #12215 Previous code didn't account for the extra unreach() that now exists in the air: ``` %29!= block(void, { %30!= cond_br(%22!, { %31!= br(%29, @Air.Inst.Ref.void_value) }, { %2! %15! %27!= call(%26, [%19!, %21]) %28!= unreach() }) } %22!) ```

1 files changed, 9 insertions(+), 2 deletions(-)

src/Liveness.zig+9-2
...@@ -621,11 +621,18 @@ pub fn categorizeOperand(...@@ -621,11 +621,18 @@ pub fn categorizeOperand(
621 if (inst_data.operand == operand_ref and operandDies(l, body[0], 0))621 if (inst_data.operand == operand_ref and operandDies(l, body[0], 0))
622 return .tomb;622 return .tomb;
623623
624 if (cond_extra.data.then_body_len != 1 or cond_extra.data.else_body_len != 1)624 if (cond_extra.data.then_body_len > 2 or cond_extra.data.else_body_len > 2)
625 return .complex;
626
627 const then_body = air.extra[cond_extra.end..][0..cond_extra.data.then_body_len];
628 const else_body = air.extra[cond_extra.end + cond_extra.data.then_body_len ..][0 .. cond_extra.data.then_body_len + cond_extra.data.else_body_len];
629 if (then_body.len > 1 and air_tags[then_body[1]] != .unreach)
630 return .complex;
631 if (else_body.len > 1 and air_tags[else_body[1]] != .unreach)
625 return .complex;632 return .complex;
626633
627 var operand_live: bool = true;634 var operand_live: bool = true;
628 for (air.extra[cond_extra.end..][0..2]) |cond_inst| {635 for (&[_]u32{ then_body[0], else_body[0] }) |cond_inst| {
629 if (l.categorizeOperand(air, cond_inst, operand, ip) == .tomb)636 if (l.categorizeOperand(air, cond_inst, operand, ip) == .tomb)
630 operand_live = false;637 operand_live = false;
631638