fix: broken conditionals

This commit is contained in:
Brett Broadhurst 2026-03-30 05:44:35 -06:00
parent b231e66b49
commit 97a43f63eb
Failed to generate hash of commit
33 changed files with 358 additions and 313 deletions

View file

@ -563,6 +563,7 @@ fn irDeclRef(
fn irAlloc(_: *Sema, builder: *Builder, _: Ir.Inst.Index) InnerError!ValueInfo {
// TODO: Add constraints on how many temporaries we can have.
// max(u8) or max(u16) are most likey appropriate.
builder.code.locals_count += 1;
return .{ .temp = builder.addStackSlot() };
}
@ -608,8 +609,8 @@ fn irCondBr(sema: *Sema, builder: *Builder, inst: Ir.Inst.Index) InnerError!Valu
const else_label = try builder.addLabel();
const end_label = try builder.addLabel();
const condition = sema.resolveInst(extra.data.condition);
if (condition != .none) try builder.ensureLoad(condition);
try builder.ensureLoad(condition);
try builder.addFixup(.jmp_f, else_label);
try builder.addByteOp(.pop);
_ = try analyzeBodyInner(sema, builder, then_body, false);
@ -636,16 +637,18 @@ fn irBlock(sema: *Sema, builder: *Builder, inst: Ir.Inst.Index) InnerError!void
}
fn irSwitchBr(sema: *Sema, builder: *Builder, inst: Ir.Inst.Index) InnerError!void {
const gpa = sema.gpa;
const data = sema.ir.instructions[@intFromEnum(inst)].data.payload;
const extra = sema.ir.extraData(Ir.Inst.SwitchBr, data.extra_index);
const cases_slice = sema.ir.bodySlice(extra.end, extra.data.cases_len);
var case_labels: std.ArrayListUnmanaged(usize) = .empty;
try case_labels.ensureUnusedCapacity(sema.gpa, cases_slice.len + 1);
defer case_labels.deinit(sema.gpa);
try case_labels.ensureUnusedCapacity(gpa, cases_slice.len + 1);
defer case_labels.deinit(gpa);
const condition = sema.resolveInst(extra.data.operand);
if (condition != .none) try builder.ensureLoad(condition);
// TODO: Do something with this value?
//const condition = builder.resolveInst(extra.data.operand);
const exit_label = try builder.addLabel();
const cmp_var = builder.addStackSlot();
try builder.addConstOp(.store, cmp_var);
@ -699,13 +702,14 @@ fn irContentFlush(_: *Sema, builder: *Builder, _: Ir.Inst.Index) InnerError!void
}
fn irChoiceBr(sema: *Sema, builder: *Builder, inst: Ir.Inst.Index) InnerError!void {
const gpa = sema.gpa;
const data = sema.ir.instructions[@intFromEnum(inst)].data.payload;
const choice_extra = sema.ir.extraData(Ir.Inst.ChoiceBr, data.extra_index);
const options_slice = sema.ir.bodySlice(choice_extra.end, choice_extra.data.cases_len);
var branch_labels: std.ArrayListUnmanaged(usize) = .empty;
try branch_labels.ensureUnusedCapacity(sema.gpa, options_slice.len + 1);
defer branch_labels.deinit(sema.gpa);
try branch_labels.ensureUnusedCapacity(gpa, options_slice.len + 1);
defer branch_labels.deinit(gpa);
for (options_slice) |option_index| {
const case_extra = sema.ir.extraData(Ir.Inst.ChoiceBr.Case, @intFromEnum(option_index));
@ -766,8 +770,10 @@ fn irChoiceBr(sema: *Sema, builder: *Builder, inst: Ir.Inst.Index) InnerError!vo
fn irRet(sema: *Sema, builder: *Builder, inst: Ir.Inst.Index) InnerError!void {
const data = sema.ir.instructions[@intFromEnum(inst)].data.un;
const value = sema.resolveInst(data.lhs);
if (value != .none) try builder.ensureLoad(value);
if (data.lhs.toIndexAllowNone()) |index| {
const value = sema.inst_map.get(index).?;
if (value != .none) try builder.ensureLoad(value);
}
try builder.addByteOp(.ret);
}