From d61dc3a5a2320d1adda759cf5f90aaf817cb9ca2 Mon Sep 17 00:00:00 2001 From: Ali Chraghi Date: Thu, 11 May 2023 09:25:59 +0330 Subject: spirv: lower store_safe, trunc and trap --- src/codegen/spirv.zig | 45 ++++++++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 19 deletions(-) (limited to 'src/codegen') diff --git a/src/codegen/spirv.zig b/src/codegen/spirv.zig index 3bec35af1d..dfb51cecef 100644 --- a/src/codegen/spirv.zig +++ b/src/codegen/spirv.zig @@ -1688,9 +1688,9 @@ pub const DeclGen = struct { .shl => try self.airShift(inst, .OpShiftLeftLogical), - .bitcast => try self.airBitcast(inst), - .intcast => try self.airIntcast(inst), - .not => try self.airNot(inst), + .bitcast => try self.airBitcast(inst), + .intcast, .trunc => try self.airIntcast(inst), + .not => try self.airNot(inst), .slice_ptr => try self.airSliceField(inst, 0), .slice_len => try self.airSliceField(inst, 1), @@ -1718,21 +1718,21 @@ pub const DeclGen = struct { .ret_ptr => try self.airAlloc(inst), .block => try self.airBlock(inst), - .load => try self.airLoad(inst), - .store => return self.airStore(inst), - - .br => return self.airBr(inst), - .breakpoint => return, - .cond_br => return self.airCondBr(inst), - .constant => unreachable, - .const_ty => unreachable, - .dbg_stmt => return self.airDbgStmt(inst), - .loop => return self.airLoop(inst), - .ret => return self.airRet(inst), - .ret_load => return self.airRetLoad(inst), - .@"try" => try self.airTry(inst), - .switch_br => return self.airSwitchBr(inst), - .unreach => return self.airUnreach(), + .load => try self.airLoad(inst), + .store, .store_safe => return self.airStore(inst), + + .br => return self.airBr(inst), + .breakpoint => return, + .cond_br => return self.airCondBr(inst), + .constant => unreachable, + .const_ty => unreachable, + .dbg_stmt => return self.airDbgStmt(inst), + .loop => return self.airLoop(inst), + .ret => return self.airRet(inst), + .ret_load => return self.airRetLoad(inst), + .@"try" => try self.airTry(inst), + .switch_br => return self.airSwitchBr(inst), + .unreach, .trap => return self.airUnreach(), .unwrap_errunion_err => try self.airErrUnionErr(inst), .wrap_errunion_err => try self.airWrapErrUnionErr(inst), @@ -2490,8 +2490,15 @@ pub const DeclGen = struct { const ptr_ty = self.air.typeOf(bin_op.lhs); const ptr = try self.resolve(bin_op.lhs); const value = try self.resolve(bin_op.rhs); + const ptr_ty_ref = try self.resolveType(ptr_ty, .direct); - try self.store(ptr_ty, ptr, value); + const val_is_undef = if (self.air.value(bin_op.rhs)) |val| val.isUndefDeep() else false; + if (val_is_undef) { + const undef = try self.constUndef(ptr_ty_ref); + try self.store(ptr_ty, ptr, undef); + } else { + try self.store(ptr_ty, ptr, value); + } } fn airLoop(self: *DeclGen, inst: Air.Inst.Index) !void { -- cgit v1.2.3