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:
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);