| ... | @@ -1688,9 +1688,9 @@ pub const DeclGen = struct { | ... | @@ -1688,9 +1688,9 @@ pub const DeclGen = struct { |
| 1688 | | 1688 | |
| 1689 | .shl => try self.airShift(inst, .OpShiftLeftLogical), | 1689 | .shl => try self.airShift(inst, .OpShiftLeftLogical), |
| 1690 | | 1690 | |
| 1691 | .bitcast => try self.airBitcast(inst), | 1691 | .bitcast => try self.airBitcast(inst), |
| 1692 | .intcast => try self.airIntcast(inst), | 1692 | .intcast, .trunc => try self.airIntcast(inst), |
| 1693 | .not => try self.airNot(inst), | 1693 | .not => try self.airNot(inst), |
| 1694 | | 1694 | |
| 1695 | .slice_ptr => try self.airSliceField(inst, 0), | 1695 | .slice_ptr => try self.airSliceField(inst, 0), |
| 1696 | .slice_len => try self.airSliceField(inst, 1), | 1696 | .slice_len => try self.airSliceField(inst, 1), |
| ... | @@ -1718,21 +1718,21 @@ pub const DeclGen = struct { | ... | @@ -1718,21 +1718,21 @@ pub const DeclGen = struct { |
| 1718 | .ret_ptr => try self.airAlloc(inst), | 1718 | .ret_ptr => try self.airAlloc(inst), |
| 1719 | .block => try self.airBlock(inst), | 1719 | .block => try self.airBlock(inst), |
| 1720 | | 1720 | |
| 1721 | .load => try self.airLoad(inst), | 1721 | .load => try self.airLoad(inst), |
| 1722 | .store => return self.airStore(inst), | 1722 | .store, .store_safe => return self.airStore(inst), |
| 1723 | | 1723 | |
| 1724 | .br => return self.airBr(inst), | 1724 | .br => return self.airBr(inst), |
| 1725 | .breakpoint => return, | 1725 | .breakpoint => return, |
| 1726 | .cond_br => return self.airCondBr(inst), | 1726 | .cond_br => return self.airCondBr(inst), |
| 1727 | .constant => unreachable, | 1727 | .constant => unreachable, |
| 1728 | .const_ty => unreachable, | 1728 | .const_ty => unreachable, |
| 1729 | .dbg_stmt => return self.airDbgStmt(inst), | 1729 | .dbg_stmt => return self.airDbgStmt(inst), |
| 1730 | .loop => return self.airLoop(inst), | 1730 | .loop => return self.airLoop(inst), |
| 1731 | .ret => return self.airRet(inst), | 1731 | .ret => return self.airRet(inst), |
| 1732 | .ret_load => return self.airRetLoad(inst), | 1732 | .ret_load => return self.airRetLoad(inst), |
| 1733 | .@"try" => try self.airTry(inst), | 1733 | .@"try" => try self.airTry(inst), |
| 1734 | .switch_br => return self.airSwitchBr(inst), | 1734 | .switch_br => return self.airSwitchBr(inst), |
| 1735 | .unreach => return self.airUnreach(), | 1735 | .unreach, .trap => return self.airUnreach(), |
| 1736 | | 1736 | |
| 1737 | .unwrap_errunion_err => try self.airErrUnionErr(inst), | 1737 | .unwrap_errunion_err => try self.airErrUnionErr(inst), |
| 1738 | .wrap_errunion_err => try self.airWrapErrUnionErr(inst), | 1738 | .wrap_errunion_err => try self.airWrapErrUnionErr(inst), |
| ... | @@ -2490,8 +2490,15 @@ pub const DeclGen = struct { | ... | @@ -2490,8 +2490,15 @@ pub const DeclGen = struct { |
| 2490 | const ptr_ty = self.air.typeOf(bin_op.lhs); | 2490 | const ptr_ty = self.air.typeOf(bin_op.lhs); |
| 2491 | const ptr = try self.resolve(bin_op.lhs); | 2491 | const ptr = try self.resolve(bin_op.lhs); |
| 2492 | const value = try self.resolve(bin_op.rhs); | 2492 | const value = try self.resolve(bin_op.rhs); |
| | 2493 | const ptr_ty_ref = try self.resolveType(ptr_ty, .direct); |
| 2493 | | 2494 | |
| 2494 | try self.store(ptr_ty, ptr, value); | 2495 | const val_is_undef = if (self.air.value(bin_op.rhs)) |val| val.isUndefDeep() else false; |
| | 2496 | if (val_is_undef) { |
| | 2497 | const undef = try self.constUndef(ptr_ty_ref); |
| | 2498 | try self.store(ptr_ty, ptr, undef); |
| | 2499 | } else { |
| | 2500 | try self.store(ptr_ty, ptr, value); |
| | 2501 | } |
| 2495 | } | 2502 | } |
| 2496 | | 2503 | |
| 2497 | fn airLoop(self: *DeclGen, inst: Air.Inst.Index) !void { | 2504 | fn airLoop(self: *DeclGen, inst: Air.Inst.Index) !void { |