mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 06:13:07 +00:00
x64: fix intCast to properly clear out dest register
This commit is contained in:
parent
d35cae551e
commit
350bf9db13
@ -981,7 +981,10 @@ fn airIntCast(self: *Self, inst: Air.Inst.Index) !void {
|
|||||||
operand.freezeIfRegister(&self.register_manager);
|
operand.freezeIfRegister(&self.register_manager);
|
||||||
defer operand.unfreezeIfRegister(&self.register_manager);
|
defer operand.unfreezeIfRegister(&self.register_manager);
|
||||||
|
|
||||||
break :blk try self.copyToRegisterWithInstTracking(inst, dest_ty, operand);
|
const reg = try self.register_manager.allocReg(inst);
|
||||||
|
try self.genSetReg(dest_ty, reg, .{ .immediate = 0 });
|
||||||
|
try self.genSetReg(operand_ty, reg, operand);
|
||||||
|
break :blk MCValue{ .register = reg };
|
||||||
};
|
};
|
||||||
|
|
||||||
return self.finishAir(inst, dst_mcv, .{ ty_op.operand, .none, .none });
|
return self.finishAir(inst, dst_mcv, .{ ty_op.operand, .none, .none });
|
||||||
@ -1851,22 +1854,29 @@ fn airErrUnionPayloadPtrSet(self: *Self, inst: Air.Inst.Index) !void {
|
|||||||
|
|
||||||
fn airWrapOptional(self: *Self, inst: Air.Inst.Index) !void {
|
fn airWrapOptional(self: *Self, inst: Air.Inst.Index) !void {
|
||||||
const ty_op = self.air.instructions.items(.data)[inst].ty_op;
|
const ty_op = self.air.instructions.items(.data)[inst].ty_op;
|
||||||
const result: MCValue = if (self.liveness.isUnused(inst)) .dead else result: {
|
if (self.liveness.isUnused(inst)) {
|
||||||
const payload_ty = self.air.typeOf(ty_op.operand);
|
return self.finishAir(inst, .dead, .{ ty_op.operand, .none, .none });
|
||||||
|
}
|
||||||
|
|
||||||
|
const payload_ty = self.air.typeOf(ty_op.operand);
|
||||||
|
const result: MCValue = result: {
|
||||||
if (!payload_ty.hasRuntimeBits()) {
|
if (!payload_ty.hasRuntimeBits()) {
|
||||||
break :result MCValue{ .immediate = 1 };
|
break :result MCValue{ .immediate = 1 };
|
||||||
}
|
}
|
||||||
|
|
||||||
const optional_ty = self.air.typeOfIndex(inst);
|
const optional_ty = self.air.typeOfIndex(inst);
|
||||||
const operand = try self.resolveInst(ty_op.operand);
|
const operand = try self.resolveInst(ty_op.operand);
|
||||||
if (optional_ty.isPtrLikeOptional()) {
|
|
||||||
// TODO should we check if we can reuse the operand?
|
|
||||||
break :result operand;
|
|
||||||
}
|
|
||||||
|
|
||||||
operand.freezeIfRegister(&self.register_manager);
|
operand.freezeIfRegister(&self.register_manager);
|
||||||
defer operand.unfreezeIfRegister(&self.register_manager);
|
defer operand.unfreezeIfRegister(&self.register_manager);
|
||||||
|
|
||||||
|
if (optional_ty.isPtrLikeOptional()) {
|
||||||
|
// TODO should we check if we can reuse the operand?
|
||||||
|
if (self.reuseOperand(inst, ty_op.operand, 0, operand)) {
|
||||||
|
break :result operand;
|
||||||
|
}
|
||||||
|
break :result try self.copyToRegisterWithInstTracking(inst, payload_ty, operand);
|
||||||
|
}
|
||||||
|
|
||||||
const optional_abi_size = @intCast(u32, optional_ty.abiSize(self.target.*));
|
const optional_abi_size = @intCast(u32, optional_ty.abiSize(self.target.*));
|
||||||
const optional_abi_align = optional_ty.abiAlignment(self.target.*);
|
const optional_abi_align = optional_ty.abiAlignment(self.target.*);
|
||||||
const payload_abi_size = @intCast(u32, payload_ty.abiSize(self.target.*));
|
const payload_abi_size = @intCast(u32, payload_ty.abiSize(self.target.*));
|
||||||
|
|||||||
@ -302,7 +302,7 @@ fn implicitIntLitToOptional() void {
|
|||||||
|
|
||||||
test "return u8 coercing into ?u32 return type" {
|
test "return u8 coercing into ?u32 return type" {
|
||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||||
if (builtin.zig_backend == .stage2_x86_64 or builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||||
|
|
||||||
const S = struct {
|
const S = struct {
|
||||||
fn doTheTest() !void {
|
fn doTheTest() !void {
|
||||||
@ -373,7 +373,6 @@ fn testPeerResolveArrayConstSlice(b: bool) !void {
|
|||||||
test "implicitly cast from T to anyerror!?T" {
|
test "implicitly cast from T to anyerror!?T" {
|
||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
|
||||||
|
|
||||||
try castToOptionalTypeError(1);
|
try castToOptionalTypeError(1);
|
||||||
comptime try castToOptionalTypeError(1);
|
comptime try castToOptionalTypeError(1);
|
||||||
@ -1036,7 +1035,6 @@ test "implicit cast from [*]T to ?*anyopaque" {
|
|||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||||
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
|
||||||
|
|
||||||
var a = [_]u8{ 3, 2, 1 };
|
var a = [_]u8{ 3, 2, 1 };
|
||||||
var runtime_zero: usize = 0;
|
var runtime_zero: usize = 0;
|
||||||
@ -1073,7 +1071,6 @@ test "implicit ptr to *anyopaque" {
|
|||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||||
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
|
||||||
|
|
||||||
var a: u32 = 1;
|
var a: u32 = 1;
|
||||||
var ptr: *align(@alignOf(u32)) anyopaque = &a;
|
var ptr: *align(@alignOf(u32)) anyopaque = &a;
|
||||||
@ -1087,7 +1084,6 @@ test "implicit ptr to *anyopaque" {
|
|||||||
test "return null from fn() anyerror!?&T" {
|
test "return null from fn() anyerror!?&T" {
|
||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
|
||||||
|
|
||||||
const a = returnNullFromOptionalTypeErrorRef();
|
const a = returnNullFromOptionalTypeErrorRef();
|
||||||
const b = returnNullLitFromOptionalTypeErrorRef();
|
const b = returnNullLitFromOptionalTypeErrorRef();
|
||||||
@ -1125,7 +1121,6 @@ test "implicitly cast from [N]T to ?[]const T" {
|
|||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||||
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
|
||||||
|
|
||||||
try expect(mem.eql(u8, castToOptionalSlice().?, "hi"));
|
try expect(mem.eql(u8, castToOptionalSlice().?, "hi"));
|
||||||
comptime try expect(mem.eql(u8, castToOptionalSlice().?, "hi"));
|
comptime try expect(mem.eql(u8, castToOptionalSlice().?, "hi"));
|
||||||
@ -1177,7 +1172,6 @@ test "implicit cast from *T to ?*anyopaque" {
|
|||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||||
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
|
||||||
|
|
||||||
var a: u8 = 1;
|
var a: u8 = 1;
|
||||||
incrementVoidPtrValue(&a);
|
incrementVoidPtrValue(&a);
|
||||||
@ -1213,7 +1207,6 @@ test "*const [N]null u8 to ?[]const u8" {
|
|||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||||
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
|
||||||
|
|
||||||
const S = struct {
|
const S = struct {
|
||||||
fn doTheTest() !void {
|
fn doTheTest() !void {
|
||||||
@ -1249,7 +1242,6 @@ test "assignment to optional pointer result loc" {
|
|||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||||
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
|
||||||
|
|
||||||
var foo: struct { ptr: ?*anyopaque } = .{ .ptr = &global_struct };
|
var foo: struct { ptr: ?*anyopaque } = .{ .ptr = &global_struct };
|
||||||
try expect(foo.ptr.? == @ptrCast(*anyopaque, &global_struct));
|
try expect(foo.ptr.? == @ptrCast(*anyopaque, &global_struct));
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user