zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 2d62c61b70e5eecacc6d7988cc084b45f86f449c (tree)
parent 427b428db822b587541816df24f32cb9edd9a072
Author: Motiejus <motiejus@jakstys.lt>
Date:   Sat,  7 Mar 2026 08:06:09 +0000

sema: add comptime float folding to zirNegate

For comptime-known float operands, compute -val at comptime instead of
emitting AIR_INST_NEG. Matches src/Sema.zig zirNegate: arith.negateFloat
for comptime values, preserving negative zero semantics.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>

Diffstat:
Mstage0/sema.c | 17+++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/stage0/sema.c b/stage0/sema.c @@ -943,9 +943,22 @@ static AirInstRef zirNegate(Sema* sema, SemaBlock* block, uint32_t inst) { AirInstRef operand = resolveInst(sema, operand_ref); TypeIndex ty = semaTypeOf(sema, operand); - // Float negation: emit AIR_INST_NEG directly. - // Ported from src/Sema.zig zirNegate float branch. + // Float negation: fold at comptime if known, else emit AIR_INST_NEG. + // Ported from src/Sema.zig zirNegate float branch (arith.negateFloat). if (floatBits(ty) > 0) { + if (AIR_REF_IS_IP(operand)) { + InternPoolKey src_key + = ipIndexToKey(sema->ip, AIR_REF_TO_IP(operand)); + if (src_key.tag == IP_KEY_FLOAT) { + // Negate preserving negative zero semantics. + InternPoolKey result_key; + memset(&result_key, 0, sizeof(result_key)); + result_key.tag = IP_KEY_FLOAT; + result_key.data.float_val.ty = ty; + result_key.data.float_val.val = -src_key.data.float_val.val; + return AIR_REF_FROM_IP(ipIntern(sema->ip, result_key)); + } + } AirInstData data; memset(&data, 0, sizeof(data)); data.ty_op.ty_ref = AIR_REF_FROM_IP(ty);