| ... | ... | @@ -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); |