@@ -9064,6 +9064,18 @@ fn zirOverflowArithmetic(
9064
9064
const maybe_lhs_val = try sema.resolveMaybeUndefVal(block, lhs_src, lhs);
9065
9065
const maybe_rhs_val = try sema.resolveMaybeUndefVal(block, rhs_src, rhs);
9066
9066
9067
+ const types = try sema.arena.alloc(Type, 2);
9068
+ const values = try sema.arena.alloc(Value, 2);
9069
+ const tuple_ty = try Type.Tag.tuple.create(sema.arena, .{
9070
+ .types = types,
9071
+ .values = values,
9072
+ });
9073
+
9074
+ types[0] = dest_ty;
9075
+ types[1] = Type.initTag(.u1);
9076
+ values[0] = Value.initTag(.unreachable_value);
9077
+ values[1] = Value.initTag(.unreachable_value);
9078
+
9067
9079
const result: struct {
9068
9080
overflowed: enum { yes, no, undef },
9069
9081
wrapped: Air.Inst.Ref,
@@ -9188,16 +9200,24 @@ fn zirOverflowArithmetic(
9188
9200
};
9189
9201
9190
9202
try sema.requireRuntimeBlock(block, src);
9191
- return block.addInst(.{
9203
+
9204
+ const tuple = try block.addInst(.{
9192
9205
.tag = air_tag,
9193
- .data = .{ .pl_op = .{
9194
- .operand = ptr ,
9195
- .payload = try sema.addExtra(Air.Bin{
9206
+ .data = .{ .ty_pl = .{
9207
+ .ty = try block.sema.addType(tuple_ty) ,
9208
+ .payload = try block. sema.addExtra(Air.Bin{
9196
9209
.lhs = lhs,
9197
9210
.rhs = rhs,
9198
9211
}),
9199
9212
} },
9200
9213
});
9214
+
9215
+ const wrapped = try block.addStructFieldVal(tuple, 0, dest_ty);
9216
+ try sema.storePtr2(block, src, ptr, ptr_src, wrapped, src, .store);
9217
+
9218
+ const overflow_bit = try block.addStructFieldVal(tuple, 1, Type.initTag(.u1));
9219
+ const zero_u1 = try sema.addConstant(Type.initTag(.u1), Value.zero);
9220
+ return try block.addBinOp(.cmp_neq, overflow_bit, zero_u1);
9201
9221
};
9202
9222
9203
9223
try sema.storePtr2(block, src, ptr, ptr_src, result.wrapped, src, .store);
0 commit comments