| ... | @@ -104889,8 +104889,9 @@ const Temp = struct { | ... | @@ -104889,8 +104889,9 @@ const Temp = struct { |
| 104889 | const result_temp: Temp = .{ .index = result_temp_index.toIndex() }; | 104889 | const result_temp: Temp = .{ .index = result_temp_index.toIndex() }; |
| 104890 | assert(cg.reuseTemp(result_temp.index, first_temp.index, first_temp_tracking)); | 104890 | assert(cg.reuseTemp(result_temp.index, first_temp.index, first_temp_tracking)); |
| 104891 | assert(cg.reuseTemp(result_temp.index, second_temp.index, second_temp_tracking)); | 104891 | assert(cg.reuseTemp(result_temp.index, second_temp.index, second_temp_tracking)); |
| 104892 | cg.temp_type[@intFromEnum(result_temp_index)] = .slice_const_u8; | | |
| 104893 | result_temp_index.tracking(cg).* = .init(result); | 104892 | result_temp_index.tracking(cg).* = .init(result); |
| | 104893 | cg.temp_type[@intFromEnum(result_temp_index)] = .slice_const_u8; |
| | 104894 | cg.next_temp_index = @enumFromInt(@intFromEnum(result_temp_index) + 1); |
| 104894 | first_temp.* = result_temp; | 104895 | first_temp.* = result_temp; |
| 104895 | second_temp.* = result_temp; | 104896 | second_temp.* = result_temp; |
| 104896 | } | 104897 | } |
| ... | @@ -109598,7 +109599,8 @@ const Temp = struct { | ... | @@ -109598,7 +109599,8 @@ const Temp = struct { |
| 109598 | ) InnerError!void { | 109599 | ) InnerError!void { |
| 109599 | const tomb_bits = cg.liveness.getTombBits(inst); | 109600 | const tomb_bits = cg.liveness.getTombBits(inst); |
| 109600 | for (0.., op_refs, op_temps) |op_index, op_ref, op_temp| { | 109601 | for (0.., op_refs, op_temps) |op_index, op_ref, op_temp| { |
| 109601 | if (op_temp.index != temp.index and op_temp.tracking(cg).short != .dead) try op_temp.die(cg); | 109602 | if (op_temp.index == temp.index) continue; |
| | 109603 | if (op_temp.tracking(cg).short != .dead) try op_temp.die(cg); |
| 109602 | if (tomb_bits & @as(Liveness.Bpi, 1) << @intCast(op_index) == 0) continue; | 109604 | if (tomb_bits & @as(Liveness.Bpi, 1) << @intCast(op_index) == 0) continue; |
| 109603 | if (cg.reused_operands.isSet(op_index)) continue; | 109605 | if (cg.reused_operands.isSet(op_index)) continue; |
| 109604 | try cg.processDeath(op_ref.toIndexAllowNone() orelse continue); | 109606 | try cg.processDeath(op_ref.toIndexAllowNone() orelse continue); |
| ... | @@ -109617,6 +109619,12 @@ const Temp = struct { | ... | @@ -109617,6 +109619,12 @@ const Temp = struct { |
| 109617 | assert(cg.reuseTemp(inst, temp_index.toIndex(), temp_tracking)); | 109619 | assert(cg.reuseTemp(inst, temp_index.toIndex(), temp_tracking)); |
| 109618 | }, | 109620 | }, |
| 109619 | } | 109621 | } |
| | 109622 | for (0.., op_refs, op_temps) |op_index, op_ref, op_temp| { |
| | 109623 | if (op_temp.index != temp.index) continue; |
| | 109624 | if (tomb_bits & @as(Liveness.Bpi, 1) << @intCast(op_index) == 0) continue; |
| | 109625 | if (cg.reused_operands.isSet(op_index)) continue; |
| | 109626 | try cg.processDeath(op_ref.toIndexAllowNone() orelse continue); |
| | 109627 | } |
| 109620 | } | 109628 | } |
| 109621 | | 109629 | |
| 109622 | fn die(temp: Temp, cg: *CodeGen) InnerError!void { | 109630 | fn die(temp: Temp, cg: *CodeGen) InnerError!void { |
| ... | @@ -109642,7 +109650,8 @@ const Temp = struct { | ... | @@ -109642,7 +109650,8 @@ const Temp = struct { |
| 109642 | } | 109650 | } |
| 109643 | | 109651 | |
| 109644 | fn isValid(index: Index, cg: *CodeGen) bool { | 109652 | fn isValid(index: Index, cg: *CodeGen) bool { |
| 109645 | return index.tracking(cg).short != .dead; | 109653 | return @intFromEnum(index) < @intFromEnum(cg.next_temp_index) and |
| | 109654 | index.tracking(cg).short != .dead; |
| 109646 | } | 109655 | } |
| 109647 | | 109656 | |
| 109648 | fn typeOf(index: Index, cg: *CodeGen) Type { | 109657 | fn typeOf(index: Index, cg: *CodeGen) Type { |