authorgravatar for mick@sayson.comMick Sayson <mick@sayson.com> 2026-07-13 15:41:54-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-08-04 18:13:01-07:00
log867ab50575b89de123c852aa74b481966f00d8eb
treee9943b71b2ec4a12a8a7292a6fca5a059b5ed062
parent5d2ad0b021f1926f09039827077bf1bd55f83df7

fix compiler crash on mem.doNotOptimize on SPIR-V


1 files changed, 22 insertions(+), 11 deletions(-)

lib/std/mem.zig+22-11
...@@ -4810,21 +4810,32 @@ pub fn doNotOptimizeAway(val: anytype) void {...@@ -4810,21 +4810,32 @@ pub fn doNotOptimizeAway(val: anytype) void {
4810 return;4810 return;
4811 }4811 }
48124812
4813 const max_gp_register_bits = @bitSizeOf(c_long);
4814 switch (@typeInfo(@TypeOf(val))) {4813 switch (@typeInfo(@TypeOf(val))) {
4815 .void, .null, .comptime_int, .comptime_float => return,4814 .void, .null, .comptime_int, .comptime_float => return,
4816 .@"enum" => doNotOptimizeAway(@backingInt(val)),4815 .@"enum" => doNotOptimizeAway(@backingInt(val)),
4817 .bool => doNotOptimizeAway(@intFromBool(val)),4816 .bool => doNotOptimizeAway(@intFromBool(val)),
4818 .int => |int| if (int.bits <= max_gp_register_bits) {4817 .int => |int| {
4819 const val2 = @as(4818 // SPIR-V targets do not have registers per se, they have values
4820 @Int(int.signedness, @max(8, std.math.ceilPowerOfTwoAssert(u16, int.bits))),4819 // tied to IDs that can be passed to valid instructions. Some
4821 val,4820 // SPIR-V targets do not define c_long, so we just allow any sized
4822 );4821 // integer on these targets
4823 asm volatile (""4822 const val_fits_in_gp_register = builtin.target.cpu.arch.isSpirV() or fits: {
4824 :4823 const max_gp_register_bits = @bitSizeOf(c_long);
4825 : [_] "r" (val2),4824 break :fits int.bits <= max_gp_register_bits;
4826 );4825 };
4827 } else doNotOptimizeAway(&val),4826 if (val_fits_in_gp_register) {
4827 const val2 = @as(
4828 @Int(int.signedness, @max(8, std.math.ceilPowerOfTwoAssert(u16, int.bits))),
4829 val,
4830 );
4831 asm volatile (""
4832 :
4833 : [_] "r" (val2),
4834 );
4835 } else {
4836 doNotOptimizeAway(&val);
4837 }
4838 },
4828 .float => |float| switch (float.bits) {4839 .float => |float| switch (float.bits) {
4829 else => comptime unreachable,4840 else => comptime unreachable,
4830 16, 80, 128 => doNotOptimizeAway(&val),4841 16, 80, 128 => doNotOptimizeAway(&val),