authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-03-02 14:29:48+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-03-02 14:34:43+01:00
log350bf9db131dd5573da0d06d38e40746c99a8a34
tree386bed9ea764d82d76468dac1253be0975a62ee6
parentd35cae551ed5f3e6082b2e599f9c258af9d2630e

x64: fix intCast to properly clear out dest register


2 files changed, 18 insertions(+), 16 deletions(-)

src/arch/x86_64/CodeGen.zig+17-7
...@@ -981,7 +981,10 @@ fn airIntCast(self: *Self, inst: Air.Inst.Index) !void {...@@ -981,7 +981,10 @@ fn airIntCast(self: *Self, inst: Air.Inst.Index) !void {
981 operand.freezeIfRegister(&self.register_manager);981 operand.freezeIfRegister(&self.register_manager);
982 defer operand.unfreezeIfRegister(&self.register_manager);982 defer operand.unfreezeIfRegister(&self.register_manager);
983983
984 break :blk try self.copyToRegisterWithInstTracking(inst, dest_ty, operand);984 const reg = try self.register_manager.allocReg(inst);
985 try self.genSetReg(dest_ty, reg, .{ .immediate = 0 });
986 try self.genSetReg(operand_ty, reg, operand);
987 break :blk MCValue{ .register = reg };
985 };988 };
986989
987 return self.finishAir(inst, dst_mcv, .{ ty_op.operand, .none, .none });990 return self.finishAir(inst, dst_mcv, .{ ty_op.operand, .none, .none });
...@@ -1851,22 +1854,29 @@ fn airErrUnionPayloadPtrSet(self: *Self, inst: Air.Inst.Index) !void {...@@ -1851,22 +1854,29 @@ fn airErrUnionPayloadPtrSet(self: *Self, inst: Air.Inst.Index) !void {
18511854
1852fn airWrapOptional(self: *Self, inst: Air.Inst.Index) !void {1855fn airWrapOptional(self: *Self, inst: Air.Inst.Index) !void {
1853 const ty_op = self.air.instructions.items(.data)[inst].ty_op;1856 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
1854 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else result: {1857 if (self.liveness.isUnused(inst)) {
1855 const payload_ty = self.air.typeOf(ty_op.operand);1858 return self.finishAir(inst, .dead, .{ ty_op.operand, .none, .none });
1859 }
1860
1861 const payload_ty = self.air.typeOf(ty_op.operand);
1862 const result: MCValue = result: {
1856 if (!payload_ty.hasRuntimeBits()) {1863 if (!payload_ty.hasRuntimeBits()) {
1857 break :result MCValue{ .immediate = 1 };1864 break :result MCValue{ .immediate = 1 };
1858 }1865 }
18591866
1860 const optional_ty = self.air.typeOfIndex(inst);1867 const optional_ty = self.air.typeOfIndex(inst);
1861 const operand = try self.resolveInst(ty_op.operand);1868 const operand = try self.resolveInst(ty_op.operand);
1869 operand.freezeIfRegister(&self.register_manager);
1870 defer operand.unfreezeIfRegister(&self.register_manager);
1871
1862 if (optional_ty.isPtrLikeOptional()) {1872 if (optional_ty.isPtrLikeOptional()) {
1863 // TODO should we check if we can reuse the operand?1873 // TODO should we check if we can reuse the operand?
1864 break :result operand;1874 if (self.reuseOperand(inst, ty_op.operand, 0, operand)) {
1875 break :result operand;
1876 }
1877 break :result try self.copyToRegisterWithInstTracking(inst, payload_ty, operand);
1865 }1878 }
18661879
1867 operand.freezeIfRegister(&self.register_manager);
1868 defer operand.unfreezeIfRegister(&self.register_manager);
1869
1870 const optional_abi_size = @intCast(u32, optional_ty.abiSize(self.target.*));1880 const optional_abi_size = @intCast(u32, optional_ty.abiSize(self.target.*));
1871 const optional_abi_align = optional_ty.abiAlignment(self.target.*);1881 const optional_abi_align = optional_ty.abiAlignment(self.target.*);
1872 const payload_abi_size = @intCast(u32, payload_ty.abiSize(self.target.*));1882 const payload_abi_size = @intCast(u32, payload_ty.abiSize(self.target.*));
test/behavior/cast.zig+1-9
...@@ -302,7 +302,7 @@ fn implicitIntLitToOptional() void {...@@ -302,7 +302,7 @@ fn implicitIntLitToOptional() void {
302302
303test "return u8 coercing into ?u32 return type" {303test "return u8 coercing into ?u32 return type" {
304 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;304 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
305 if (builtin.zig_backend == .stage2_x86_64 or builtin.zig_backend == .stage2_arm) return error.SkipZigTest;305 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
306306
307 const S = struct {307 const S = struct {
308 fn doTheTest() !void {308 fn doTheTest() !void {
...@@ -373,7 +373,6 @@ fn testPeerResolveArrayConstSlice(b: bool) !void {...@@ -373,7 +373,6 @@ fn testPeerResolveArrayConstSlice(b: bool) !void {
373test "implicitly cast from T to anyerror!?T" {373test "implicitly cast from T to anyerror!?T" {
374 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;374 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
375 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;375 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
376 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
377376
378 try castToOptionalTypeError(1);377 try castToOptionalTypeError(1);
379 comptime try castToOptionalTypeError(1);378 comptime try castToOptionalTypeError(1);
...@@ -1036,7 +1035,6 @@ test "implicit cast from [*]T to ?*anyopaque" {...@@ -1036,7 +1035,6 @@ test "implicit cast from [*]T to ?*anyopaque" {
1036 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;1035 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1037 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1036 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1038 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1037 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1039 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
10401038
1041 var a = [_]u8{ 3, 2, 1 };1039 var a = [_]u8{ 3, 2, 1 };
1042 var runtime_zero: usize = 0;1040 var runtime_zero: usize = 0;
...@@ -1073,7 +1071,6 @@ test "implicit ptr to *anyopaque" {...@@ -1073,7 +1071,6 @@ test "implicit ptr to *anyopaque" {
1073 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;1071 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1074 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1072 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1075 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1073 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1076 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
10771074
1078 var a: u32 = 1;1075 var a: u32 = 1;
1079 var ptr: *align(@alignOf(u32)) anyopaque = &a;1076 var ptr: *align(@alignOf(u32)) anyopaque = &a;
...@@ -1087,7 +1084,6 @@ test "implicit ptr to *anyopaque" {...@@ -1087,7 +1084,6 @@ test "implicit ptr to *anyopaque" {
1087test "return null from fn() anyerror!?&T" {1084test "return null from fn() anyerror!?&T" {
1088 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;1085 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1089 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1086 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1090 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
10911087
1092 const a = returnNullFromOptionalTypeErrorRef();1088 const a = returnNullFromOptionalTypeErrorRef();
1093 const b = returnNullLitFromOptionalTypeErrorRef();1089 const b = returnNullLitFromOptionalTypeErrorRef();
...@@ -1125,7 +1121,6 @@ test "implicitly cast from [N]T to ?[]const T" {...@@ -1125,7 +1121,6 @@ test "implicitly cast from [N]T to ?[]const T" {
1125 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;1121 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1126 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1122 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1127 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1123 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1128 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
11291124
1130 try expect(mem.eql(u8, castToOptionalSlice().?, "hi"));1125 try expect(mem.eql(u8, castToOptionalSlice().?, "hi"));
1131 comptime try expect(mem.eql(u8, castToOptionalSlice().?, "hi"));1126 comptime try expect(mem.eql(u8, castToOptionalSlice().?, "hi"));
...@@ -1177,7 +1172,6 @@ test "implicit cast from *T to ?*anyopaque" {...@@ -1177,7 +1172,6 @@ test "implicit cast from *T to ?*anyopaque" {
1177 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;1172 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1178 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1173 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1179 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1174 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1180 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
11811175
1182 var a: u8 = 1;1176 var a: u8 = 1;
1183 incrementVoidPtrValue(&a);1177 incrementVoidPtrValue(&a);
...@@ -1213,7 +1207,6 @@ test "*const [N]null u8 to ?[]const u8" {...@@ -1213,7 +1207,6 @@ test "*const [N]null u8 to ?[]const u8" {
1213 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;1207 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1214 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1208 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1215 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1209 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1216 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
12171210
1218 const S = struct {1211 const S = struct {
1219 fn doTheTest() !void {1212 fn doTheTest() !void {
...@@ -1249,7 +1242,6 @@ test "assignment to optional pointer result loc" {...@@ -1249,7 +1242,6 @@ test "assignment to optional pointer result loc" {
1249 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;1242 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1250 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1243 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1251 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1244 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1252 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
12531245
1254 var foo: struct { ptr: ?*anyopaque } = .{ .ptr = &global_struct };1246 var foo: struct { ptr: ?*anyopaque } = .{ .ptr = &global_struct };
1255 try expect(foo.ptr.? == @ptrCast(*anyopaque, &global_struct));1247 try expect(foo.ptr.? == @ptrCast(*anyopaque, &global_struct));