From 37a4d9391f9585759d4c0d274393a3ddb3e2e76b Mon Sep 17 00:00:00 2001 From: antlilja Date: Sun, 17 Mar 2024 16:23:14 +0100 Subject: [PATCH 1/5] LLVM: Fix reaching unreachable code when emitting fast call --- src/codegen/llvm/Builder.zig | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/codegen/llvm/Builder.zig b/src/codegen/llvm/Builder.zig index c885261a24..d98afb3389 100644 --- a/src/codegen/llvm/Builder.zig +++ b/src/codegen/llvm/Builder.zig @@ -14721,10 +14721,10 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co try function_block.writeAbbrevAdapted(FunctionBlock.CallFast{ .attributes = extra.data.attributes, .call_type = switch (kind) { - .call => .{ .call_conv = call_conv }, - .@"tail call" => .{ .tail = true, .call_conv = call_conv }, - .@"musttail call" => .{ .must_tail = true, .call_conv = call_conv }, - .@"notail call" => .{ .no_tail = true, .call_conv = call_conv }, + .@"call fast" => .{ .call_conv = call_conv }, + .@"tail call fast" => .{ .tail = true, .call_conv = call_conv }, + .@"musttail call fast" => .{ .must_tail = true, .call_conv = call_conv }, + .@"notail call fast" => .{ .no_tail = true, .call_conv = call_conv }, else => unreachable, }, .fast_math = .{}, From b20cee586c6bd1cbc0c5364e8ebe5ae7ecf0ca1f Mon Sep 17 00:00:00 2001 From: antlilja Date: Sun, 17 Mar 2024 16:25:59 +0100 Subject: [PATCH 2/5] LLVM: Fix incorrect fast constant in FastMath packed struct --- src/codegen/llvm/Builder.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/codegen/llvm/Builder.zig b/src/codegen/llvm/Builder.zig index d98afb3389..f8ed5dc751 100644 --- a/src/codegen/llvm/Builder.zig +++ b/src/codegen/llvm/Builder.zig @@ -6839,7 +6839,7 @@ pub const FastMath = packed struct(u8) { .arcp = true, .contract = true, .afn = true, - .realloc = true, + .reassoc = true, }; }; From 79b868d504f2b9c583a84c784a2f6197ac91bc25 Mon Sep 17 00:00:00 2001 From: antlilja Date: Sun, 17 Mar 2024 16:26:28 +0100 Subject: [PATCH 3/5] LLVM: Use fast math when requested --- src/codegen/llvm/Builder.zig | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/codegen/llvm/Builder.zig b/src/codegen/llvm/Builder.zig index f8ed5dc751..12ecd2ec38 100644 --- a/src/codegen/llvm/Builder.zig +++ b/src/codegen/llvm/Builder.zig @@ -14727,7 +14727,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co .@"notail call fast" => .{ .no_tail = true, .call_conv = call_conv }, else => unreachable, }, - .fast_math = .{}, + .fast_math = FastMath.fast, .type_id = extra.data.ty, .callee = extra.data.callee, .args = args, @@ -14786,7 +14786,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co .opcode = kind.toBinaryOpcode(), .lhs = adapter.getOffsetValueIndex(extra.lhs), .rhs = adapter.getOffsetValueIndex(extra.rhs), - .fast_math = .{}, + .fast_math = FastMath.fast, }); }, .alloca, @@ -14884,7 +14884,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co .lhs = adapter.getOffsetValueIndex(extra.lhs), .rhs = adapter.getOffsetValueIndex(extra.rhs), .pred = kind.toCmpPredicate(), - .fast_math = .{}, + .fast_math = FastMath.fast, }); }, .fneg => try function_block.writeAbbrev(FunctionBlock.FNeg{ @@ -14892,7 +14892,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co }), .@"fneg fast" => try function_block.writeAbbrev(FunctionBlock.FNegFast{ .val = adapter.getOffsetValueIndex(@enumFromInt(datas[instr_index])), - .fast_math = .{}, + .fast_math = FastMath.fast, }), .extractvalue => { var extra = func.extraDataTrail(Function.Instruction.ExtractValue, datas[instr_index]); @@ -14940,7 +14940,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co .lhs = adapter.getOffsetValueIndex(extra.lhs), .rhs = adapter.getOffsetValueIndex(extra.rhs), .cond = adapter.getOffsetValueIndex(extra.cond), - .fast_math = .{}, + .fast_math = FastMath.fast, }); }, .shufflevector => { From 8ac5eb0893b6db81003475245f7bcf449a5ed033 Mon Sep 17 00:00:00 2001 From: antlilja Date: Sun, 17 Mar 2024 16:34:36 +0100 Subject: [PATCH 4/5] LLVM: Add test for calling reduce with float mode set to optimized --- test/cases/float_mode_optimized_reduce.zig | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 test/cases/float_mode_optimized_reduce.zig diff --git a/test/cases/float_mode_optimized_reduce.zig b/test/cases/float_mode_optimized_reduce.zig new file mode 100644 index 0000000000..55d71f4709 --- /dev/null +++ b/test/cases/float_mode_optimized_reduce.zig @@ -0,0 +1,12 @@ +pub fn main() void { + var a: @Vector(2, f32) = @splat(5.0); + _ = &a; + + @setFloatMode(.optimized); + var b = @reduce(.Add, a); + _ = &b; +} + +// run +// backend=llvm +// From aa03ec8001f98ac36e1705c92191246be53cf31b Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Sun, 17 Mar 2024 22:23:16 +0200 Subject: [PATCH 5/5] add behavior test for optimized float math Closes #19178 --- test/behavior/floatop.zig | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/test/behavior/floatop.zig b/test/behavior/floatop.zig index b3bdfb6d71..e777377786 100644 --- a/test/behavior/floatop.zig +++ b/test/behavior/floatop.zig @@ -1636,3 +1636,24 @@ test "runtime isNan(inf * 0)" { const zero_times_inf = 0 * std.math.inf(f64); try std.testing.expect(std.math.isNan(zero_times_inf)); } + +test "optimized float mode" { + if (builtin.mode == .Debug) return error.SkipZigTest; + + const big = 0x1p40; + const small = 0.001; + const tiny = 0x1p-10; + + const S = struct { + fn strict(x: f64) f64 { + @setFloatMode(.strict); + return x + big - big; + } + fn optimized(x: f64) f64 { + @setFloatMode(.optimized); + return x + big - big; + } + }; + try expect(S.optimized(small) == small); + try expect(S.strict(small) == tiny); +}